Newsgroup: it.comp.lang.c++
Titolo: Alleggerire la CPU da Task latenti

PROBLEMA:
Ho un applicativo che deve attendere un file di risposta (che viene
generato da un secondo applicativo che non controllo) in maniera
asincrona nel senso che non conosco il momento preciso in cui me la
fornisce.
Testando in continuazione la presenza o meno di tale risposta (file
di risposta) ovviamente costringo la CPU a dedicarmi risorse che
potrebbero essere dedicate altrove in maniera piů intelligente.
Per ovviare a tale inconveniente ho pensato di testare l'eventuale
arrivo della risposta solamente a intervalli di tempo in modo da
"liberare" la CPU e di impegnarla solamente in istanti frequenziati.
RICHIESTA:
Che funzione del Borland C o C++ posso utilizzare per fare in modo
di informare la CPU che deve "lasciare perdere" il mio applicativo
e mi deve dedicare pochi clock solo trascorso un certo intervallo
di tempo?
Grazie comunque a tutti.
Marco Rossi
--
Posted from 
fortuna.affari.com
 [195.250.233.20]
via Mailgate.ORG Server - 
http://www.mailgate.org

potrebbero essere dedicate altrove in maniera più intelligente.


di tempo?
In Win32 (Win/95, Win/NT, ecc), l'API che cerchi e` Sleep; prende
come argomento i millisecondi di "sonno" che il tuo processo chiede.
Alex


N.B. la mia risposta si basa sul presupposto che tu stia lavorando in
Windows'95(8) o NT (unici ambienti multithreading in cui sono disponibili,
per quanto ne sò..., compilatori Borland).
Oltre ad utilizzare, come già suggerito da altri, la funzione Sleep per
rilasciare il tempo, puoi considerare di utilizzare le funzioni
FindFirstChangeNotification e FindNextChangeNotification per fare in modo
che il tuo programma si "svegli" solo quando viene segnalata una modifica a
uno dei file di una specifica directory.
Ho notato che tra i flag che permettono di controllare la funzione ce n'è
uno che permette di testare la data di ultima scrittura all'interno del file
e quindi dovrebbe permetterti di riattivarti solo quando il file di output
viene generato/modificato (non ho mai utilizzato la funzione in questo modo,
quindi il mio suggerimento è da "prendere con le pinze"...)...
---
Valter Minute
min...@fortech.it
 (the reply address of this message is invalid)
---
Are you looking for a good freeware ScreenSaver? Try FOYD!
http://hotfiles.zdnet.com/cgi-bin/texis/swlib/hotfiles/getit.bin?fcode=000PZ
0
if you want, I can send you the (free) C++ source code.

di tempo?
Risposta breve:
prova ad inserire nel tuo codice qualcosa del tipo
while(!FileProduced()){
    ::Sleep(1000);
}
dova si fa uso della funzione Win32 Sleep() per abbandonare la CPU fino al
trascorrimento del tempo specificato.
Risposta lunga:
Se sei tu l'autore sia dell'applicativo che produce il file sia
dell'applicativo che aspetta per leggerlo prova a pensare ad una
soluzione basata sulla sincronizzazione con named events
-----APP produttore ------
hEvent = ::CreateEvent(NULL,FALSE,FALSE,"MyEvent");
ProduceFile();
::SetEvent(hEvent);
-----APP consumatore ------
hEvent = ::OpenEvent(EVENT_ALL_ACCESS,FALSE,"MyEvent");
::WaitForSingleObject(hEvent,INFINITE);
StartDoingSomethingWithFile();

 di tempo?
Penso che un timer sia la cosa migliore (vedi SetTimer()). Ah, ho dato
per scontato Windows.
EMG

 sleep
Non ne sono sicuro ma credo che la funzione sleep() blocchi la CPU.
EMG

...


Tra l'altro io ho usato con successo sleep() sia su sistemi NT (dove mi
sembra fosse Sleep()) che Unix (Digital OSF1).


 come argomento i millisecondi di "sonno" che il tuo processo chiede.
Ah, è un API? Io pensavo si riferisse alla classica funzione sleep() che
si trova in diversi compilatori compreso TurboC e DJGPP.
EMG

 specificato.
Si, pardon. Non avevo pensato all'API ma credevo si parlasse della
normale funzione sleep() disponibile su molti compilatori. D'altronde
questo non è un newsgroup dedicato a Windows o alle GUI in generale.
EMG