Newsgroup: it.comp.programmare.win32
Titolo: Occupazione processore...?

Ciao a tutti,
		sto cercando un modo per ottenere la percentuale di occupazione del
processore [come il monitor di sistema di Win], è possibile?
[programmo in Delphi su Win9X ma mi andrebbero bene anche esempi C++ o asm]
Ringrazio in anticipo chi vorrà aiutarmi. :-)
Ciao
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
HomePage: 
http://www.insieme.net/andy

[programmo in Delphi su Win9X ma mi andrebbero bene anche esempi C++ o asm]
Sotto a Windows 95 puoi usare le funzioni del ToolHelp
(CreateToolhelp32Snapshot e amici), che sono semplicissime da usare. Fai una
ricerca nel tuo help, le troverai senz'altro...
Se vuoi che il tuo codice funzioni anche sotto a NT, la questione si complica.
Ricordo che ne parlavano in un numero di Computer Programming... forse se vai
sul loro sito puoi trovare dei sorgenti di esempio.
Bye! Lorenzo Lutti (
http://members.tripod.it/fidocad
)

ricerca nel tuo help, le troverai senz'altro...
Ti ringrazio per la risposta... :-)
Le funzioni toolHelp le uso in genere per scorrere i processi, ottenere i
moduli di un processo, threads ecc ecc ma non ho la minima idea di come
tirar fuori da uno SnapShot la percentuale di occupazione del
processore... 
Forse c'è una funzione apposita [sarebbe troppo bello... :-) ]
Ciao :-)



Basta che accedi alla chiave
HKEY_DYN_DATA\PerfStats\StatData\KERNEL\CPUUsage
del registro.
Topoldo
(Grazie a Dio, sono ateo)

del registro.
Grazie mille per la dritta.
C'è un problema però: funziona solo se c'è attivo il Monitor di sistema...
:-(
Se chiudo il monitor di sistema mi viene ritornato sempre 100... 
Se invece, oltre alla mia applicazione, c'è aperto anche il Monitor di
sistema va tutto alla perfezione.
Forse c'è qualche funzione da richiamare per far aggiornare il valore?
Ti ringrazio ancora e spero tu possa risolvere anche questo problema.
ciao


processore...
Scusa per il ritardo della risposta. Per leggere l'occupazione della CPU basta
leggere il tempo (sia user che kernel) "bruciato" dal processo idle (PID 0) in
un determinato intervallo di tempo, che puoi misurare con GetTickCount(). Ad
esempio: all'istante x1 leggi un tempo di processo y1, all'istante x2 leggi un
tempo di processo y2. Allora l'occupazione percentuale media del processore
nell'intervallo [x1,x2] e` data da:
100*(1-(y2-y1)/(x2-x1))
Non ho idea di come si debbano modificare queste cose per i sistemi
multiprocessor.


:-(
Il problema e` che usare quelle chiavi del registry non e` cosi` banale. Prima
di usarle devi effettuare una query su altre chiavi (sempre dentro a HKDD) in
modo da "accendere" (scusa il termine rozzo) il performance counter
desiderato. In pratica lanciando il performance monitor fai si` che lui lo
"faccia" per te, ma quando lo chiudi viene effettuata un'altra query che
"spegne" il counter.


"spegne" il counter.
Grazie per la risposta :-)
Ma come faccio ad "accendere" il tutto? mi sapresti dire su che chiave devo
smanettare? (immagino ci sarà un valore sa settare, no?)
Ciao :-)


multiprocessor.
Scusa, non ho ben presente come fare a leggere il "tempo di processo" ...
forse è il caso che io specifichi: uso Win9X quindi se ti riferivi alla
GetProcessTimes ho le mani legate...
La cosa mi interessa parecchio, saresti così gentile da delucidarmi ancora?
:-)
Ciao, grazie 1000


smanettare? (immagino ci sarà un valore sa settare, no?)
Purtroppo non mi ricordo i dettagli. C'e` un lungo articolo sulla knowledge
base che spiega tutto, lo potrai trovare agevolmente su MSDN... prova a fare
una ricerca tipo "performance counter" o direttamente HKEY_DYN_DATA.


GetProcessTimes ho le mani legate...
Ero convinto che le funzioni del ToolHelp (CreateToolhelp32Snapshot,
Thread32First, Process32First e cosi` via) riportassero anche i tempi di
processo. Invece sono andato a controllare, e incredibilmente non lo fanno!
Sono davvero sorpreso da questa mancanza...
Mi sa che a questo punto tu debba necessariamente usare le chiavi dinamiche
del registry.
