Informatyk, podróżnik, fotograf

Informatyczne podejście do życia w obrazkach, kolorach i dźwiękach

Kamil Porembiński

CPU Frequency w C++

Od kilku dni męczę się z napisaniem prostej funkcji, która pobierze aktualną wartość częstotliwości z jaką pracuje procesor pod systemem Windows. Korzystając z Pana Googla dowiedziałem się, że wartość tę można odczytać z rejestru z klucza:

HKEY_LOCAL_MACHINE\\Hardware\\Description\\System\\CentralProcessor\\0

Niestety wartość jaka się tam znajduje jest stała i nie pokazuje częstotliwości z jaką obecnie pracuje CPU. Kolejną rzeczą jaką zrobiłem było wkorzystanie kodu, który znalazłem na stronie codeproject.com.

__int64 GetMachineCycleCount()
{      
   __int64 cycles;
   _asm rdtsc; // won't work on 486 or below - only pentium or above
   _asm lea ebx,cycles;
   _asm mov [ebx],eax;
   _asm mov [ebx+4],edx;
   return cycles;
}

Niestety podczas uruchomienia aplikacja się wywala. Próbowałem też skorzystać z MFC. Najpierw męczyłem sie z zainstalowaniem Visual C++ 2005, a potem z całym Windows® Server 2003 SP1 Platform SDK Full, w którym są jakieś automagiczne biblioteki.

Teraz zastanawiam się nad jakąś prostą funkcją, która policzy / oszacuje z jaką obecnie częstotliwością pracuje procesor. Nie mam zielonego pojęcia jak wydobyć tę informację. Na Linuksie jest prościej :)

ikonka 09 września 2007, 07:52:45

Komentarze

ikonka Michał Górny, 09 września 2007, 10:13:11

…a czym ją kompilowałeś?

Kamil Porembiński, 09 września 2007, 10:20:08

Jakimś Borland C++ Builder. W tym została napisana aplikacja, a teraz ją przerabiam.

Zastanawiam się czy nie skompilować tego kodu co jest na stronie codeproject.com i podlinkować potem do aplikacji z borlanda.

Marcin (Ktos), 09 września 2007, 10:23:39

Na Windows też nie jest trudno. O ile użyjesz klas WMI (do których nie mam pojęcia jak dostać się od strony C/C++ – ale na MSDN pewnie to jest).

Ale od strony PowerShella choćby:
(Get-WMIObject Win32_Processor).CurrentClockSpeed

Kamil Porembiński, 09 września 2007, 10:29:20

A mnie chodzi właśnie o C/C++ :)

ikonka Michał Górny, 09 września 2007, 10:30:10

Kamilu, przeć on napisał, że na MSDN znajdziesz. Innymi słowy, masz pomęczyć „sterownik” q ;.

Sebas86, 09 września 2007, 12:03:19

Hej, jak chcesz ostatnio coś takiego pisałem. Kompiluje się na mingw, korzysta z funkcji pobierających wartości klucza z rejestru – sprawdzone na XP (VirtualBox rządzi :)).

Kamil Porembiński, 09 września 2007, 12:26:46

Hehehe :)
Zatem będę szukał :)

Myślę też o wykorzystaniu CPUID ;)

SebaS86, 09 września 2007, 12:27:27

A CPUID SDK nie jest płatne?

Marcin (Ktos), 09 września 2007, 12:38:11

A ja ponownie odeślę do WMI.
Przykład jest tu:
http://msdn2.microsoft.com/en-us/library/aa390423.aspx
klasa Win32_Processor, pole CurrentClockSpeed.

Wygląda skomplikowanie w czystym C++, ale w kodzie zarządzanym zapewniam, że jest to przyjemniejsze ;-)

Kamil Porembiński, 09 września 2007, 12:41:08

Chodzi mi o CPUID
Może tam siedzi ta wartość jakiej szukam :)

Marcin, dzięki :) Wrócę z pracy to zaraz będę czytał :)

Kamil Porembiński, 18 września 2007, 18:12:20

Męczyłem się z tym WMI. Pod C++ zadziałało, ale już pod C++ Builder – nie! Załamanie :( Próbowałem skorzystać z prostej wstawki assemblerowej – nie działa. Ten sam kod pod C++ i Delphi działa wyśmienicie.

Komentować mogą jedynie zalogowani
Składnia Textile Lite jest włączona.

Powered by Jogger. Copyright © 2002-2003 Justin Mecham & JabberPL Group

Licencja: Creative Commons Uznanie autorstwa 3.0