Newsgroup: it.comp.programmare.win32
Titolo: durata ottimale Sleep tra processi  in VC

ciao,
sto sviluppando un programma con diversi thread,
ognuno dei quali ha una struttura di un loop infinito in cui processa
comandi o azioni (ad esempio lettura porte seriali e riempimento buffer 
circolare);
per non appensantire il tutto ho messo delle Sleep() in fondo ad ogni loop
per facilitare il salto agli altri thread.
Ora mi chiedo: quali valori per le Sleep hanno piu' senso?
So che dipende da cosa fanno i thread, ma la domanda e' un'altra:
se metto Sleep(1) o Sleep(10) fa veramente differenza? Windows riesce a fare
una sleep di 1ms? penso di no.. quindi qual e' il valore minimo su XP che
ha senso? Sleep(10) oppure Sleep(50) come era credo su win 98?
e Sleep(10) e' sufficiente per un programma con 4 thread o si incasinano?
non sono applicazioni critiche ma vorrei dare tempo allo scheduler di fare 
il giro comodamente
senza passare la maggior parte del tempo a swappare processi...
per contro la lettura di una seriale a 19200 con buffer circolare di 256 
byte richiede un processing
almeno ogni 100ms ma forse anche meno per non rischiare...
consigli?
grazie
GCL 

 loop per facilitare il salto agli altri thread.
Il sistema che vuoi adottare è sbagliato.
Tu devi prenderti solo il tempo che ti serve e non tenerlo sempre per te 
rilasciandolo solo per pochi istanti.
A seconda dei task che devi eseguire ci sono svariati modi migliori per far 
si che Windows sospenda il tuo thread e dia spazio a tutti gli altri.
Se non segui questo modus operandi, il sistema operativo andrà sempre a 
singhiozzo.
Per esempio per sospendere il thread in attesa di qualche evento dalla porta 
seriale, si può usare la WaitCommEvent.
-- 
Raffaele Rialdi
Microsoft .NET MVP 
http://mvp.support.microsoft.com
 -
http://italy.mvps.org
 UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org
 Weblog: 
http://blogs.ugidotnet.org/raffaele

 porta seriale, si può usare la WaitCommEvent.
si', questa e' una modalita' migliore di quella da me adottata,
l'altro caso e' invece il seguente: un thread di servizio loop-pa (sigh!)  a 
vuoto in attesa che una variabile
(che nel mio caso si chiama gDACommand) sia non zero. A me non pare che 
questo sistema
occupi tempo ma se hai un metodo migliore sono molto interessato.
Ecco cosa faccio nel mio thread di servizio, banalizzandolo...:
while(TRUE)
{
   if(gDACommand) {
    ...fai tutte le azioni del caso...
  }
  Sleep(10);
}
quindi di solito fa delle gran Sleep() tranne quando deve fare delle azioni 
in background rispetto al main()
In quale altro modo lo faresti?
Resta il quesito se, a parte i tempi di reazione, la Sleep(10) ha senso...
(mi spiego: se lo swap di processo dura un microsecondo mettere Sleep(10) o 
Sleep(100) poco cambia,
  ma se durasse 1 millisecondo spreco il 10% (per due!) del tempo a 
swappare!)
ciao e grazie
GCL

occupi tempo ma se hai un metodo migliore sono molto interessato.
Il loop che proponi funziona, ma e' certamente migliorabile in
termine di prestazioni. Da dove arriva questa gDACommand? Se
viene modificata da uno dei tuoi thread, sposta tutto il codice
li dentro.

 ciao e grazie
Prego!


 li dentro.
ho un main che fa andare un gioco e un thread di servizio che serve a non 
rallentare il gioco.
La variabile gDACommand e' settata dal main ogniqualvolta il thread di 
servizio deve
effettuare in background dei compiti che non devono rallentare il gioco.
Il processing in background potrebbe durare svariati secondi mentre il main 
non deve fermarsi
e non puo' subire ritardi.
Non ho trovato un metodo migliore di condividere una variabile globale che 
viene settata
dal main e resettata alla fine del compito dal thread di servizio...
GCL 

effettuare in background dei compiti che non devono rallentare il gioco.
Ok, immaginavo una situazione di questo tipo, volevo solo
maggiori dettagli per trovare un modo per evitare l'apertura del
thread...
Segui il consiglio di Raffaele creando un evento, cosi' elimini
anche il problema delle CriticalSection sulla memoria condivisa.