|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Sep 2007
Messaggi: 139
|
[Visual Basic] Ottenere la percentuale di carico della CPU
Salve a tutti! Sto realizzando un piccolo progetto per cui ho avuto la necessità di creare un'applicazione in Visual Basic per ottenere alcune informazioni dal processore. Quella principale in cui mi sono imbattuto consiste nell'estrapolazione del valore della percentuale di carico dell CPU... Mi sono documentato in giro, ed ho trovato alcune istruzioni interessanti inerenti le classi WMI. Sono riuscito a creare il codice ed a fare funzionare l'applicazione in diversi PC, testandola sia su Win XP che su Vista. Il problema è che alcuni PC non e vogliono proprio sapere di farla funzionare... All'avvio del programma al posto del valore del carico non mi viene visualizzato nulla... Da alcune fonti ho appurato che probabilmente alcune schede madri non supportano l'SMBIOS, e appunto per questo mi è stato consigliato di prelevare queste info direttamente dalle API di Windows o dal registro di sistema... Il problema è che essendoci poche informazioni in giro in merito a queste funzioni io non saprei bene come fare. Non è che per caso qualcuno potrebbe darmi qualche consiglio su come reperire questa piccola informazione utile per il mio progetto ? Grazie in ogni caso di aver letto... Spero in qualche risposta, grazie ed a presto!!!
![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3691
|
Sono informazioni che si possono prendere da ciascuno dei processi attivi sulla macchina, senza scomodare la WMI.
System.Diagnostic.Process.GetProcesses() per la lista dei processi. Ciascun processo ha l'info TotalProcessorTime. Giocando con i ProcessorTime di tutti i processi puoi ricavare la percentuale di carico.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12814
|
Se non vado errato la classe PerformanceCounter è quello che fa al caso tuo
![]() |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
riuscendo a ricavare la percentuale del processo in idle, trovi la controparte occupata.
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Sul web ci sono parecchi esempi, e tutti utilizzano più o meno questo :
Codice:
PerformanceCounter("Processor", "% Processor Time", "_Total") Codice:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim tempo As DateTime = DateTime.Now Using PC As New PerformanceCounter("Processor", "% Processor Time", "_Total") ListBox1.Items.Add(tempo & " -> " & CInt(PC.NextValue) & " %") End Using End Sub Provate anche voi e fatemi sapere. |
![]() |
![]() |
![]() |
#6 | |
Member
Iscritto dal: Sep 2007
Messaggi: 139
|
Allora provando ad utilizzare la proprietà TotalProcessorTime mi restituisce il messaggio "Accesso negato". Ecco il codice che ho usato:
Quote:
Utilizzando invece la classe PerformanceCounter non mi restituisce nulla nella ListBox... Mbah..., non riesco proprio a capire come mai sia così difficile ottenere un'informazione così banale! Cmq grazie dell'aiuto, spero in qualche altro chiarimento da voi esperti!!! ![]() |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Bastava che mettessi il codice esposto ad errori in un blocco Try Catch. Molto più semplicemente :
Codice:
For Each P As Process In Process.GetProcesses Try ListBox1.Items.Add(P.ProcessName & " -> " & P.TotalProcessorTime.ToString) Catch ex As Exception ListBox1.Items.Add(P.ProcessName & " -> " & "Accesso Negato.") End Try Next Come si può notare "Accesso Negato" succede su vari processi che non permettono la lettura del valore TotalProcessorTime. Nel mio caso ho un paio di "svchost", "Idle", e altri... In ogni caso chiederei a chi ha consigliato questa tecnica di spiegare : 1. Come risolvere gli accessi negati. 2. Come ricavare la percentuale di utilizzo Cpu del singolo processo da un valore stringa come ad esempio questo : svchost -> 00:00:00.0468750 |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3691
|
Ciao. Il valore non e' una stringa, e' un TimeSpan.
Se si campiona il valore di totalprocesstime su tutti i processi ogni secondo, si sommano tutti insieme, e si sottrae questo valore da 1 secondo, si dovrebbe ottenere il tempo libero di CPU.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Sep 2007
Messaggi: 139
|
Allora, dopo diversi tentativi sono riuscito finalmente ad impostare la funzione per farmi stampare i valori, il problema è che credo non sia questa l'informazione che mi serve. Mandando il programma in esecuzione ottengo nella ListBox l'elenco dei nomi dei processi con accanto il rispettivo valore del tempo che impiega. Ora io mi sono creato una variabile sempre del tipo TimeSpan che si va incrementando del valore di ogni processo per ottenere il carico finale. Alla fine mi dà appunto un valore nel formato classico del TimeSpan del tipo (XX:XX:XX.XXXXXXX). Il mio problema è che riflettendo a fondo sul risultato ottenuto ho realizzato che si tratta di un tempo di esecuzione e non di una percentuale di carico, o sbaglio ? Il risultato che a me interesserebbe ottenere è il valore della percentuale di carico della cpu, ad esempio (10%, 20%, ecc.) per ogni processo, o meglio ancora se ottenessi la percentuale totale di tutti i processi! Ad ogni modo lascio trarre conclusione a chi ne sa di più..., nello stesso tempo ringrazio tutti quanti per gli aiuti ricevuti sino ad ora! Spero in ulteriori chiarimenti!!!
![]() |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3691
|
Quote:
Oppure provi a seguire la strada del performancecounter, che penso abbia gia' le percentuali che ti servono.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#11 | ||
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
![]() Quote:
![]() |
||
![]() |
![]() |
![]() |
#12 | |
Member
Iscritto dal: Sep 2007
Messaggi: 139
|
Allora, stasera ho provato anche con la classe PerformanceCounter... Questo è il codice che ho utilizzato:
Quote:
![]() |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
2. I valori ottenuti dipendono anche da cosa si specifica in InstanceName. A quanto ne so io : - Using PC As New PerformanceCounter("Processor", "% Processor Time", "_Total") -> rilevamento totale cpu. - Using PC As New PerformanceCounter("Processor", "% Processor Time", "0") -> rilevamento del solo Core "0", in un sistema multi-core... e così via. 3. Non capisco perchè nel tuo codice fai 2 rilevamenti nel For, comunque il mio codice di test : Codice:
Using PC As New PerformanceCounter("Processor", "% Processor Time", "_Total") For i As Integer = 1 To 100 ListBox1.Items.Add(PC.NextValue.ToString & " %") Threading.Thread.Sleep(20) Next End Using ![]() |
|
![]() |
![]() |
![]() |
#14 |
Member
Iscritto dal: Sep 2007
Messaggi: 139
|
Allora, grazie innanzitutto per la risposta! Dunque, io ho effettuato 2 rilevamenti nel FOR per vedere se cambiava qualcosa nei risultati di output con l'inserimento di una threading nel mezzo tra una stampa e l'altra. A questo punto sono proprio bloccato... Non capisco proprio come ottenere la percentuale di carico reale!!! E' strano poi come mai ci sia tutta questa differenza tra i valori ottenuti e quelli del task manager.... Questo mi fa pensare che non siano quelli che misurino realmente il carico..., anche se a dire il vero ho notato che sovraccaricando il processore prima di mandare in esecuzione il programma nel momento in cui dopo lo eseguo diversi processi segnalano il 100% di carico. In ogni caso spero che si riesca a fare maggiore chiarezza!!!
![]() |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Ho scritto in questo thread, più che per rispondere in modo risolutivo, come spesso amo fare, solo per dare una mano e infine accodarmi alla tua richiesta, dato che non ho mai avuto il problema di calcolare da .NET il carico della o delle Cpu. Ci ho provato solo ora, leggendo questa discussione, ed effettivamente agganciarsi ai valori del Task Manager, che trovo siano sempre verosimili e attendibili, pare sia più arduo del previsto. In particolare c'è un sacco di gente che sul web consiglia quella tecnica col PerformanceCounter, ma evidentemente è un consiglio che rimbalza come un passa-parola e basta. Mi chiedo se ce ne sia uno che oltre a consigliare quella tecnica, l'abbia mai davvero provata. ( come spesso accade ) ![]() |
|
![]() |
![]() |
![]() |
#16 | |
Member
Iscritto dal: Sep 2007
Messaggi: 139
|
Allora, in questi giorni ho creato un'applicazione con timer... utilizzando i vari totalprocesstime per vedere se riuscivo in qualche modo ad ottenere sta tanto desiderata percentuale. La percentuale, anche se probabilmente espressa in formato non corretto mi dà dei valori tra 99% e 100% di carico della CPU, anche se poi in realtà nel task manager i valori dicono tutt'altro. Io temo che questo sia causato dai processi la cui lettura viene negata. Infatti la variabile 'count' non tiene conto di questi. Qui sotto c'è il programma che ho creato. C'è qualcuno che per caso riesce a capire dove sta il problema ???
Quote:
![]() |
|
![]() |
![]() |
![]() |
#17 | |
Member
Iscritto dal: Sep 2007
Messaggi: 139
|
Allora, in questi giorni ho creato un'applicazione con timer... utilizzando i vari totalprocesstime per vedere se riuscivo in qualche modo ad ottenere sta tanto desiderata percentuale. La percentuale, anche se probabilmente espressa in formato non corretto mi dà dei valori tra 99% e 100% di carico della CPU, anche se poi in realtà nel task manager i valori dicono tutt'altro. Io temo che questo sia causato dai processi la cui lettura viene negata. Infatti la variabile 'count' non tiene conto di questi. Qui sotto c'è il programma che ho creato. C'è qualcuno che per caso riesce a capire dove sta il problema ???
Quote:
![]() |
|
![]() |
![]() |
![]() |
#18 | |
Member
Iscritto dal: Sep 2007
Messaggi: 139
|
Nuovamente salve!!! Allora, credo di aver abbandonato definitivamente l'idea di ottenere la percentuale di carico della CPU utilizzando il valore totalprocesstime, in quanto dopo diverse ore di lavoro sono riuscito a correggere gli errori che avevo in precedenza ma continuavo ad avere percentuali non corrette. Navigando in rete ho trovato però del codice interessante che spiega come ottenere questa informazione dalle API di Windows... Da quello che ho visto è la fonte più attendibile dalla quale si possono reperire tutti i valori utili per calcolare il carico... Io in quanto poco esperto con visual basic 2008 ho creato un progetto nel quale ho inserito il codice che ho trovato. L'unico problema è che io non ho ancora capito come farlo funzionare. Posto qui sotto il codice che ho trovato... C'è per caso qualcuno che possa darmi una dritta su come rendere funzionante questo codice ?
Quote:
![]() ![]() Ultima modifica di MaRgEnIuS : 23-02-2010 alle 17:18. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:19.