🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: be.comp.programming
6 messages
6 total messages Started by bomberboy Wed, 19 Nov 2003 22:21
[C/C++] CPU usage meten, WinXP
#3633
Author: bomberboy
Date: Wed, 19 Nov 2003 22:21
46 lines
2975 bytes
Hallo,

Ik ben op zoek naar een, bij voorkeur eenvoudige, manier om de CPU-usage
te meten.  Het doelplatform is een TabletPC met winXP Tablet Edition.  Dus
ik vermoed dat de oplossing voor WinXP of Win2k ook zal werken.

In win9* kan dit gewoon gelezen worden in een registry-key, maar dat is
niet zo in 2k en XP.
Vanaf Win2k is er wel de pdh-api beschikbaar (Performance Data Helper)
maar ik ben er niet echt happig op om deze te gebruiken.
Immers:
- Als compiler gebruik ik MinGW en deze heeft geen pdh-header beschikbaar
en ik ben persoonlijk niet echt van van de Visual* omgevingen.  Maar
indien nodig zet ik mij daar wel overheen :)
- Een tweede reden is dat aan deze pdh je performance-counter objecten
moet toevoegen, maar blijkbaar zijn de namen van deze objecten vertaald
naar de taal van het OS.  Een imho niet zo denderende beslissing van de
MS-programmeurs.
- Heel die pdh structuur lijkt me nogal zwaar voor wat ik wil doen (enkel
cpu-usage)

Het zou ideaal zijn indien dit alles in ��n enkele methode-oproep kan
samengebald worden.  Het uiteindelijke doel is immers dat deze methode dan
via JNI in een java-klasse kan opgeroepen worden.

Voorlopig ben ik nog niet tot een oplossing gekomen die aan deze eisen kan
voldoen.  Er blijkt immers geen rechtstreekse methode native methode te
zijn om dit op te vragen.

Een oplossing waar ik ook al aan gedacht had was hiervoor het idle-proces
te (mis)(ge)bruiken en via een getProcessTimes-achtige methode de tijd
ervan op te vragen en hieruit dan het echte gebruik af te leiden.  Het
probleem is dat hiervoor een extra thread nodig is om om de x-aantal
tijdseenheden dan die tijden opvraagt, vergelijkt met de vorige tijd enz.
Maar die extra thread zou ik eigenlijk graag vermijden.  Hoewel dat
waarschijnlijk niet zal mogelijk zijn.


Iemand die enkele tips heeft?
Bedankt.

-- 
Bruno

Politicians do it to everyone.
Re: [C/C++] CPU usage meten, WinXP
#3634
Author: Pieter Philippaerts
Date: Wed, 19 Nov 2003 23:20
26 lines
2380 bytes
"bomberboy" <newsbomber@pandora.invalid> wrote in message
> In win9* kan dit gewoon gelezen worden in een registry-key, maar dat is
> niet zo in 2k en XP.
> Vanaf Win2k is er wel de pdh-api beschikbaar (Performance Data Helper)
> maar ik ben er niet echt happig op om deze te gebruiken.
> Immers:
> Het zou ideaal zijn indien dit alles in ��n enkele methode-oproep kan
> samengebald worden.  Het uiteindelijke doel is immers dat deze methode dan
> via JNI in een java-klasse kan opgeroepen worden.

Op NT4 en hoger kan je de undocumented API functie NtQuerySystemInformation
gebruiken [http://www.codeproject.com/system/cpuusage.asp]. Op Windows 9x/ME
is er naar ��n methode om de CPU time op te vragen, en dat is via de
registry.
Je gaat dus een aparte implementatie moeten maken voor NT en 9x/ME, maar
dmv. OO ga je dat wel mooi kunnen oplossen.

> Een oplossing waar ik ook al aan gedacht had was hiervoor het idle-proces
> te (mis)(ge)bruiken en via een getProcessTimes-achtige methode de tijd
> ervan op te vragen en hieruit dan het echte gebruik af te leiden.

Lukt dat? Ik heb het niet getest, maar ik vermoed dat als je GetProcessTimes
oproept met 0 als PID, dat die een error gaat teruggeven.

Mvg,
Pieter Philippaerts
Re: [C/C++] CPU usage meten, WinXP
#3635
Author: Luc Kumps
Date: Thu, 20 Nov 2003 08:07
20 lines
1776 bytes
bomberboy wrote:
> Hallo,
>
> Ik ben op zoek naar een, bij voorkeur eenvoudige, manier om de
> CPU-usage te meten.  Het doelplatform is een TabletPC met winXP
> Tablet Edition.  Dus ik vermoed dat de oplossing voor WinXP of Win2k
> ook zal werken.
>
> In win9* kan dit gewoon gelezen worden in een registry-key, maar dat
> is niet zo in 2k en XP.
> Vanaf Win2k is er wel de pdh-api beschikbaar (Performance Data Helper)
> maar ik ben er niet echt happig op om deze te gebruiken.

GetSystemTimes() is waar je naar zoekt, denk ik.

Als het ook op Win2K moet werken: heb je al eens naar
NtQuerySystemInformation gekeken?
(met SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)

Luc K
Re: [C/C++] CPU usage meten, WinXP
#3637
Author: SLE
Date: Thu, 20 Nov 2003 12:40
13 lines
1532 bytes
"bomberboy" <newsbomber@pandora.invalid> wrote
>
> Ik ben op zoek naar een, bij voorkeur eenvoudige, manier om de CPU-usage
> te meten.  Het doelplatform is een TabletPC met winXP Tablet Edition.  Dus
> ik vermoed dat de oplossing voor WinXP of Win2k ook zal werken.
>

Naast de reeds gesuggereerde oplossingen, zou je ook via WMI de
LoadPercentage property van de Win32_Processor instantie(s) ophalen.


--
SLE
Re: [C/C++] CPU usage meten, WinXP
#3647
Author: bomberboy
Date: Thu, 20 Nov 2003 23:36
53 lines
3481 bytes
Pieter Philippaerts schreef:

> "bomberboy" <newsbomber@pandora.invalid> wrote in message

>> In win9* kan dit gewoon gelezen worden in een registry-key, maar dat is
>> niet zo in 2k en XP.
>> Vanaf Win2k is er wel de pdh-api beschikbaar (Performance Data Helper)
>> maar ik ben er niet echt happig op om deze te gebruiken.
>> Immers:
>> Het zou ideaal zijn indien dit alles in ��n enkele methode-oproep kan
>> samengebald worden.  Het uiteindelijke doel is immers dat deze methode dan
>> via JNI in een java-klasse kan opgeroepen worden.
> 
> Op NT4 en hoger kan je de undocumented API functie NtQuerySystemInformation
> gebruiken [http://www.codeproject.com/system/cpuusage.asp]. Op Windows 9x/ME
> is er naar ��n methode om de CPU time op te vragen, en dat is via de
> registry.
> Je gaat dus een aparte implementatie moeten maken voor NT en 9x/ME, maar
> dmv. OO ga je dat wel mooi kunnen oplossen.

Voorlopig is het doelsysteem er eentje met Windows XP Tablet Edition, dus
die 9x/Me oplossing is niet echt een prioriteit.
Het is trouwens de bedoeling dat het in een OSGi-bundle gebruikt wordt, en
je kan hierbij in de Manifest file specifi�ren welke native libraries vor
welk OS moeten geladen worden.  Dus het ondersteunen van meerdere systemen
is vrij eenvoudig.

>> Een oplossing waar ik ook al aan gedacht had was hiervoor het idle-proces
>> te (mis)(ge)bruiken en via een getProcessTimes-achtige methode de tijd
>> ervan op te vragen en hieruit dan het echte gebruik af te leiden.
> 
> Lukt dat? Ik heb het niet getest, maar ik vermoed dat als je GetProcessTimes
> oproept met 0 als PID, dat die een error gaat teruggeven.

Het lukt dus inderdaad niet om dit zo te doen :-/

De oplossing met NtQuerySystemInformation, getSystemTimes() en WMI door
jou Luc en SLE voorgesteld zulen me waarschijnlijk wel al een heel stuk op
weg helpen.

Het probleem is voorlopig dat MinGW hier (nog) niet mee om kan.  Ik zal
dus bij mijn thesisbegeleider moeten gaan zagen voor Visual C++ en/of
proberen of de versies in de PC-klassen niet te verouderd zijn.
(Valt het op dat ik tot nu toe vooral onder unix-achtigen geprogrammeerd
heb?)

Bedankt, ik weet weer wat proberen, en als het lukt laat ik nog wel weten
hoe, of als ik nog problemen heb kom ik ook nog wel terug ;-)

-- 
Bruno

F u cn rd ths u cnt spl wrth a dm!
Re: [C/C++] CPU usage meten, WinXP
#3544
Author: bomberboy
Date: Sun, 30 Nov 2003 19:39
23 lines
1971 bytes
bomberboy schreef:

> Bedankt, ik weet weer wat proberen, en als het lukt laat ik nog wel weten
> hoe, of als ik nog problemen heb kom ik ook nog wel terug ;-)

Zoals ik dus beloofd had:
Na nog wat meer gegoogle op de hier vermelde mogelijkheden ben ik hier
terechtgekomen

http://groups.google.be/groups?q=ntquerysysteminformation+cpu&hl=nl&lr=&ie=UTF-8&selm=06cfac23.94f342db%40usw-ex0105-037.remarq.com&rnum=4

Dit heb ik dan wat aangepast, en van mijn Java-CPU object een kleine
thread gemaakt die dit om de x tijd gaat aanroepen om zijn interne
usage-double te gaan updaten.
Misschien dat ik later mij nog eens ga verdiepen in een WMI oplossing,
maar voorlopig is dit voldoende.

Bedankt voor de suggesties.

-- 
Bruno

Chaste makes waste.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads