Witam, potrzebuję w swojej aplikacji wykrywać i wyświetlać na bieżąco użycie poszczególnych rdzeni, powiedzmy co 1s. Chodzi o wyświetlenie wartości w %, czyli nic nadzwyczajnego, problem w tym, że nie wiem jak to odczytać.
Nie zależy mi na jakiejś tam ogromnej dokładności - wystarczy dokładność taka, jaką zapewnia Menedżer Zadań.
Próbowałem to wykonać w D7 za pomocą biblioteki pdh.dll (na podstawie pewnego tutoriala znalezionego w sieci), ale niestety u mnie to nie działa, sprawdziłem i funkcja PdhExpandWildCardPath() zwraca mi "Nie znaleziono obiektu w systemie". Próbowałem zmian header-ów, pdh.dll itp. Innym działa ten sam kod (wg komentarzy na blogu), a u mnie nie.
Są jeszcze jakieś sposoby? A może da się to odczytać poprzez HKEY_PERFORMANCE_DATA ?
Interesuje mnie rozwiązanie w WinAPI. Fajnie by było, gdyby ktoś mógł zarzucić jakimś kodem źródłowym.
WMI
i np. wmi code createor to bedzie cos w stylu win32_processor i loadpercentage
Sprawdziłem - tamto mi podaje użycie "całego" procesora.
Za to ta klasa:
Win32_PerfFormattedData_PerfOS_Processor
i ta właściwość:
PercentProcessorTime
wydają się podawać użycie rdzeni w %. Tylko jedno mnie dziwi - u mnie w tej chwili działają tylko 3 rdzenie, a WMI zwraca mi:
PercentProcessorTime: 0
PercentProcessorTime: 3
PercentProcessorTime: 3
PercentProcessorTime: 2
tak jakbym miał 4 rdzenie. W sumie mam 4, ale jeden jest wyłączony w BIOS-ie (bo to Athlon II X3 425) więc działają tylko trzy. Nie wiem, którą wartość pomijać, i których rdzeni dotyczą.
U mnie np. jak wyłączę komputer to wszystkie cztery rdzenie mają 0% użycia. Może u Ciebie też tak jest?
Przecież jak wyłączę komputer to nic nie działa :D
A może Tobie chodzi o to, czy przy wyłączaniu użycie wynosi 0% ?
Nawet jeśli to jaki to ma związek?
Czy wg informacji z WMI zawsze jeden rdzeń ma 0% użycia?
No właśnie cały bajer polega na tym, że nie...
Często są to wyniki typu:
PercentProcessorTime: 3
PercentProcessorTime: 9
PercentProcessorTime: 3
PercentProcessorTime: 5
Widzisz, a z Twojego posta, z którego nic nie wynikało można było wysnuć taki wniosek. ;)
To chyba musisz szukać lepszego sposobu.
No :/
Ma ktoś jeszcze jakiś pomysł?
- PDH - http://msdn.microsoft.com/en-us/library/aa373214(v=VS.85).aspx
- NtQuerySystemInformation
Próbowałem to wykonać w D7 za pomocą biblioteki pdh.dll (na podstawie pewnego tutoriala znalezionego w sieci), ale niestety u mnie to nie działa
A jak za pomocą NtQuerySystemInformation() obliczyć procentowe użycie każdego rdzenia? W necie znalazłem jedynie algorytm obliczania użycia "całego" procesora.
SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
//---
znalazlem troche czasu i wpisalem pdh delphi
http://w-shadow.com/blog/2009/04/17/per-core-cpu-usage/
Haha
na podstawie pewnego tutoriala znalezionego w sieci
To jest właśnie ten tutorial :)
Dwa ostatnie posty są moje.
masz pecha mi dzialaja wszytskie rozwiazania :)
-
sprawdz czy jest PDH (ale chyba tak), sa jakies wersje bez ?!
-
sprawdz czy odblokowany jest PDH i mozliwosc pomiaru w systemie (jaki win ?)
-
Bardziej populapkuj kod, czy daje komunikat missing ? Mozliwe (jak masz) win 7 ze cos sie zmienilo ...
XP SP3 32bit PL Zaktualizowany. Niedawno zainstalowany. Brak syfu.
- sprawdz czy jest PDH (ale chyba tak), sa jakies wersje bez ?!
Jest, nawet próbowałem z innymi (ściąganymi z neta) wersjami.
- sprawdz czy odblokowany jest PDH i mozliwosc pomiaru w systemie (jaki win ?)
Jakiś czas temu sprawdzałem jakimś softem i pokazywało, że jest odblokowana możliwość pomiaru.
Chodzi Ci m.in o komunikat:
The specified object is not found on the system.
? Bo taki komunikat dostaję.
Mógłbyś może podrzucić jakąś binarkę, która działa u Ciebie? Wtedy by się wyjaśniło czy to ja coś źle robię czy Delphi.
A wie ktoś jak Menedżer Zadań sprawdza użycie rdzeni? Bo u niego to działa...