PDA

View Full Version : [C#]Problemi con Thread.Sleep


Mattyfog
10-10-2009, 10:20
Ciao,
per una volta eccomi qui con un problema non dovuto al mio poco studio...
Ho bisogno di caricare una pagina web e dopo di aspettare per 40 secondi.
Detto questo io io nell'evento private void webBrowser1_DocumentCompleted ho scritto Thread.Sleep(40000); solo che ho un problema.
Innanzi tutto la pagina web non viene visualizzata, inoltre il programma smette totalmente di funzionare (eh va beh questo secondo punto sarebbe anche giusto visto che gli do proprio questo comando).
C'è un qualcosa che faccia aspettare 40 secondi al mio programma prima di caricare un altra pagina, che non lo blocchi del tutto ee che mi visualizzi la pagina web?

MarcoGG
10-10-2009, 12:39
Veramente funziona come ci si debba aspettare :

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
System.Threading.Thread.Sleep(2000);
}

Carica la pagina, e poi attende 2 sec. Ovvio che l'applicazione durante lo Sleep() non risponda, perchè vai ad "addormentare" proprio il thread della UI.

Usa invece un Timer, che dopo l'intervallo desiderato, sblocca la possibilità di caricare un'altra pagina, senza chiamate a Sleep().

Mattyfog
10-10-2009, 13:55
ho guardato ma non ho ben capito il funzionamento dei timer...

MarcoGG
10-10-2009, 14:32
Beh, non so cosa vuoi realizzare, ma se dovessi fare in modo che un WebBrowser andasse ad aprire N pagine aspettando X secondi tra l'una e l'altra, farei più o meno così :

private int timerTicks = 0;
private string[] indirizzi = {"http://www.google.it","http://www.hwupgrade.it","http://www.libero.it"};
private void timer1_Tick(object sender, EventArgs e)
{
if (timerTicks == indirizzi.Length) { timerTicks = 0; }
webBrowser1.Url = new Uri(indirizzi[timerTicks]);
timerTicks += 1;
}

Dove l'Interval del timer1 è = X * 1000.

Mattyfog
10-10-2009, 15:00
e come richiamo questo metodo?
cioè che devo mettewre al posto di "(object sender, EventArgs e)"

MarcoGG
10-10-2009, 15:09
e come richiamo questo metodo?
cioè che devo mettewre al posto di "(object sender, EventArgs e)"

In questo caso niente, non usi nè "sender" nè "e".
Non è altro che la firma dell'evento _Tick. Usa pure il Timer che trovi a sinistra, nella barra dei Componenti Windows Form.

Mattyfog
10-10-2009, 16:38
ma il problema è che non ho capito come farlo partire :D

MarcoGG
11-10-2009, 07:54
ma il problema è che non ho capito come farlo partire :D

Puoi usare timer1.Enabled = true; oppure timer1.Start(); . :D

Mattyfog
12-10-2009, 18:21
ho provato in diversi modi

System.Timers.Timer timer1 = new System.Timers.Timer(4000);

for (b = 0; link_isabelmarco[b] != null; b++)
{
webBrowser1.Navigate(url[b]);

timer1.Start();

}



[...]

timer1.Interval = 40000;

for (b = 0; link_isabelmarco[b] != null; b++)
{
webBrowser1.Navigate(url[b]);
timer1.Start();
}


[....]

private void timer1_Tick(object sender, EventArgs e)
{

}

In entrambe i modi il timer viene in pratica ignorato nel senso che il programma non si ferma facendo in modo che all'utente appaia solamente l'ultimo link dei tanti...
:help:
e graziee :)

MarcoGG
12-10-2009, 19:55
Per forza. Nel primo non vedo traccia dell'evento Tick, mentre nel secondo c'è, ma senza che vi sia alcuna istruzione all'interno...
Ma non potevi semplicemente implementare il mio esempio al post #4 ? :stordita:

Mattyfog
12-10-2009, 21:02
perchè non l avevo capito ma ora credo di si :D
domani provo

Mattyfog
15-10-2009, 13:02
uffaa non capisco una mazza :D
adesso ho fatto così ma non fa niente!


private void timer1_Tick(object sender, EventArgs e)
{
webBrowser1.Navigate(url[b]);
}

[...]

//da qui richiamo il timer
for (b = 0; link_isabelmarco[b] != null; b++)
{
timer1.Start();
}

MarcoGG
15-10-2009, 13:34
Ma per forza, che senso ha dare lo Start() N volte in un ciclo ?!
Il Timer va avviato una volta sola, poi fa tutti lui, ed esegue nel suo _Tick ciò che gli passi.
Se hai un WebBrowser hai anche una Form, no ?
Bene, vai sulla Form in design mode, poi sulla sinistra di VS c'è la colonna della Casella Strumenti ( che contiene vari sotto-menu di oggetti : Controlli Comuni, Contenitori, Dati, ecc... ). Nel sotto-menu "Componenti" c'è anche il Timer, lo aggiungi alla Form, ci fai doppio click e hai il codice base dell'evento _Tick. Usi il mio esempio al post #4 e hai finito. ;)

Mattyfog
15-10-2009, 15:19
ma il problema è che in pratica ho bisogno di un ciclo che ogni volta faccia qualcosa e poi aspetti n secondi e nel tuo esempio non capisco come funzioni sto ciclo (ammesso che ci sia :D ) e come farlo terminare :muro:
chiedo scusa :D
e grazie :)

MarcoGG
15-10-2009, 20:41
ma il problema è che in pratica ho bisogno di un ciclo che ogni volta faccia qualcosa e poi aspetti n secondi e nel tuo esempio non capisco come funzioni sto ciclo (ammesso che ci sia :D ) e come farlo terminare :muro:
chiedo scusa :D
e grazie :)

Il fatto è proprio questo, NON serve alcun ciclo, dal momento che il Timer di per sè esegue quanto sta nell'evento Tick, ciclicamente. Se l'Interval del Timer è 1000 ( msec. ) , il Timer esegue le istruzioni ogni secondo, 2000, ogni 2 sec. ecc...

Se gli indirizzi vanno ciclati continuamente ( alla fine del ciclo ricomincia daccapo ) vale il mio codice precedente :
private int timerTicks = 0;
private string[] indirizzi = { "http://www.google.it", "http://www.hwupgrade.it", "http://www.libero.it" };
private void timer1_Tick(object sender, EventArgs e)
{
if (timerTicks == indirizzi.Length) { timerTicks = 0; }
webBrowser1.Url = new Uri(indirizzi[timerTicks]);
timerTicks += 1;
}

Se invece voglio che il Timer si fermi una volta ciclati gli indirizzi :
private int timerTicks = 0;
private string[] indirizzi = { "http://www.google.it", "http://www.hwupgrade.it", "http://www.libero.it" };
private void timer1_Tick(object sender, EventArgs e)
{
if (timerTicks == indirizzi.Length)
{
timerTicks = 0;
timer1.Enabled = false;
}
else
{
webBrowser1.Url = new Uri(indirizzi[timerTicks]);
timerTicks += 1;
}

}

Spiegato meglio di così, non saprei... :p

Mattyfog
16-10-2009, 12:31
per farlo partire ho scritto così:

timer1.Interval = 38000;
b = 0;
timer1.Start();

ma non parte :(

MarcoGG
16-10-2009, 12:48
per farlo partire ho scritto così:

timer1.Interval = 38000;
b = 0;
timer1.Start();

ma non parte :(

:doh: :D
Andiamo con un esempio base > Form1 con un Timer :

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
timer1.Interval = 1000; // o il valore che vuoi...
timer1.Start();
}

private int b = 0;
private void timer1_Tick(object sender, EventArgs e)
{
b+=1;
this.Text = b.ToString();
}
}
Parte o non parte ?

Mattyfog
16-10-2009, 18:58
senti io ho aggiunto già il timer dalla finestra di progettazione...e c ho messo dentro le istruzioni solo che non parte scrivendo quello che ho già postato sopra!

MarcoGG
16-10-2009, 20:13
senti io ho aggiunto già il timer dalla finestra di progettazione...e c ho messo dentro le istruzioni solo che non parte scrivendo quello che ho già postato sopra!

Posta il codice completo. Anche quello che hai messo nel Tick del Timer, ovviamente.

Mattyfog
17-10-2009, 10:13
posto solo il codice relativo al timer:

int b = 0;
string[] codice;

[...]

timer1.Interval = 38000;
b = 0;
timer1.Enabled = true;

[...]

private void timer1_Tick(object sender, EventArgs e)
{
if (b ==url.Length)
{
b = 0;
timer1.Enabled = false;
}
else
{
webBrowser1.Navigate("http://www.sito.it/" +codice[b]);
b++;
}
}

MarcoGG
17-10-2009, 11:16
Sembra a posto, ma credo che il tuo problema sia che non vedi subito la pagina sul WebBrowser. E' normale. Facendo così devi aspettare 38 secondi ( il primo TICK ) per vedere la prima pagina caricata... Questo ti da l'impressione che il Timer sia fermo.
Bastava che mettessi la prima pagina fuori dal Timer e partissi da b=1 anzichè b=0... :D

Mattyfog
17-10-2009, 11:48
avevi ragione..
grazie infinite risolto :)