GetProcessTimes - uzycie cpu przez proces

0

Witam, strarm sie napisac funkcje ktora obliczy mi uzycie procesora przez poszczegolny proces ale caly czas cos nie dziala, to jest ta funkcja, moze mi ktos powiedziec co robie zle, zwracana wartosc zawsze wynosi 0 ?

int TFMain::iFunGetCpuProcUsage( HANDLE hHandle )
{
LONG lOldUser, lNewUser, lOldKernel, lNewKernel, lProcUsage, lUser, lKernel;
DWORD dwOldTime, dwNewTime, dwTime;
FILETIME ftCreate, ftExit, ftUser, ftKernel;
int iProcUsage;

GetProcessTimes( hHandle, &ftCreate, &ftExit, &ftUser, &ftKernel );

// usertime
if( ftUser.dwLowDateTime < 0 ) ftUser.dwLowDateTime = 0;
if( ftUser.dwHighDateTime < 0 ) ftUser.dwHighDateTime = 0;
lNewUser = (((long)ftUser.dwHighDateTime) << 32 ) + ftUser.dwLowDateTime;

// kernel
if( ftKernel.dwLowDateTime < 0 ) ftKernel.dwLowDateTime = 0;
if( ftKernel.dwHighDateTime < 0 ) ftKernel.dwHighDateTime = 0;
lNewKernel = (((long)ftKernel.dwHighDateTime) << 32 ) + ftKernel.dwLowDateTime;

lKernel = lNewKernel - lOldKernel;
lUser = lNewUser - lOldUser;
dwTime = dwNewTime-dwOldTime;

if( dwTime == 0 )
{
Sleep( 100 );
dwNewTime = timeGetTime();
dwTime = dwNewTime-dwOldTime;
}

iProcUsage = (((lKernel+lUser)*100 ) / dwTime );

return iProcUsage;
}

srodowisko BCB++ 6

0

Czy 'hHandle' jest uchwytem Procesu .

HANDLE hProcess = GetCurrentProcess() ...?


GetProcessTimes( hHandle, &ftCreate, &ftExit, &ftUser, &ftKernel ); /// Nie

GetProcessTimes( hHandle, &ftCreate, &ftExit, &ftKernel, &ftUser); // tak

I jakaś dziwna ta funkcja ,mam wrażenie że odejmujesz nie to co powinieneś i
co ona ma wyliczac ?

Między dwoma wywołaniami GetProcessTimes( hHandle ...
musisz wykonac jakieś obliczenia , jak wywołasz funkcję 2x za koleją to
dostaniesz 0 po odjęciu wartości z FILETIME.. ;-)

Funkcje GetProcessTimes i GetThreadTimes nie działają w Win98.
Poza tym Funkcje te obliczją czas wykonania procesu(wszystkich wątków procesu) lub wątku i nie mają nic wspólnego
z procesorem.

0

Podobną funkcją chciałem zmierzyć użycie CPU tyle, że w wątku i... lipa :/ Skończyło się na RDTSC.

Tu może coś ciekawego znajdziesz

0

Oto dzialajacy kod ;)

//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <conio.h>
#include <mmsystem.h>
#include <tlhelp32.h>
#include <psapi.h>
#pragma hdrstop
#pragma argsused

int iFunGetTime( FILETIME ftTime )
{
SYSTEMTIME stTime;
int iTime;

FileTimeToSystemTime( &ftTime, &stTime );

iTime = stTime.wSecond * 1000;
iTime += stTime.wMilliseconds;

return iTime;
}

int iFunGetCpuProcUsage( HANDLE hHandle )
{
LONG lOldUser, lNewUser, lOldKernel, lNewKernel, lProcUsage, lUser, lKernel;
DWORD dwOldTime, dwNewTime, dwTime;
FILETIME ftCreate, ftExit, ftUser, ftKernel;
int iProcUsage;

/*
Yes:
GetProcessTimes( GetCurrentProcess(), t1, t2, t3, t4 );
t3 is Kerneltime in 100ns-Setps
t4 is Usertime in 100ns-Setps
t3+t4 is overall CPU-Time of Process

use a timer and calculate Percent = (actualtime-oldtime) /
((actualTickCount-OldTickCount)*100)
works fine and results are equal to Taskmanager!
*/

dwOldTime = timeGetTime();
if( ! GetProcessTimes( hHandle, &ftCreate, &ftExit, &ftUser, &ftKernel ) )
{
printf("error old getprocesstime %d", GetLastError() );
getch();
}

lOldUser = iFunGetTime( ftUser );
lOldKernel = iFunGetTime( ftKernel );

Sleep( 1000 );

dwNewTime = timeGetTime();
if( ! GetProcessTimes( hHandle, &ftCreate, &ftExit, &ftUser, &ftKernel ) )
{
printf("error new getprocesstime %d", GetLastError() );
getch();
}

lNewUser = iFunGetTime( ftUser );
lNewKernel = iFunGetTime( ftKernel );

lKernel = lNewKernel - lOldKernel;
lUser = lNewUser - lOldUser;
dwTime = dwNewTime-dwOldTime;

if( dwTime == 0 )
{
Sleep( 100 );
dwNewTime = timeGetTime();
dwTime = dwNewTime-dwOldTime;
}

iProcUsage = (((lKernel+lUser)*100 ) / dwTime );

return iProcUsage;
}

int main(int argc, char* argv[])
{
void *Snap;
PROCESSENTRY32 pe;
HEAPENTRY32 he;
HANDLE hHandle;
HANDLE hProcess;
AnsiString sText;
PROCESS_MEMORY_COUNTERS pmc;

memset( &pmc , 0, sizeof( pmc ) );
pmc.cb = sizeof( pmc );
Snap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS , 0);
pe.dwSize = sizeof( PROCESSENTRY32 );

if( Process32First( Snap , &pe ) )
{
do
{
if( strstr( pe.szExeFile , "bcb.exe" ) )
{
sText = pe.szExeFile;
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION ,
false ,
pe.th32ProcessID );
}
}
while( Process32Next( Snap , &pe ) );
CloseHandle( Snap );
}

while( !kbhit() )
{
clrscr();
printf("Uzycie procesora dla %s wynosi %d", sText.c_str() , iFunGetCpuProcUsage( hProcess ) );
Sleep( 1000 );
}
CloseHandle( hProcess );
}
//---------------------------------------------------------------------------

0

:|

dwOldTime = timeGetTime();
if( ! GetProcessTimes( hHandle, &ftCreate, &ftExit, &ftUser, &ftKernel ) ) <====
{
printf("error old getprocesstime %d", GetLastError() );
getch();
}

The GetProcessTimes function obtains timing information about a specified process. 

BOOL GetProcessTimes(

    HANDLE hProcess,	// specifies the process of interest 
    LPFILETIME lpCreationTime,	// when the process was created
    LPFILETIME lpExitTime,	// when the process exited 
    LPFILETIME lpKernelTime,	// time the process has spent in kernel mode  :-( 
    LPFILETIME lpUserTime 	// time the process has spent in user mode  :-/ 
   );

Akurat w tym programie nie ma to znaczenia ale są zamienione parametry lpKernelTime
i lpUserTime...
Coś mi się zdaje Lemkat że miałeś gotowy kod i robisz tylko zamieszanie .... :-/

0

Witam, bazowalem na kodzie z artykulu: http://www.codeproject.com/csharp/processescpuusage.asp
Niestety nie udalo mi sie go przeniesc na bcb i stworzylem kod od nowa doszukujac sie jedynie sposobu oblicznienia uzycia procesora za pomoca GetProcessTimes.

Widzisz parametry lKernel i LlUser musza byc odczytane 2 razy zeby zmierzyc ile czasu proces spedzil w procku i na podstawie tego ogliczyc w jakim stopniu procesor byl w uzyciu:

iProcUsage = (((lKernel+lUser)*100 ) / dwTime );

gdzie lKernel i lUser jest to czas spedozny w procku, dwTime - jest to czas w ktorym zostaly dokonane odczyty z processu ;)

Jesli chodzi o wskazanie przez ciebie bledu w nazwach parametrow, to dzieki za zwrocenie na to uwagi, kod byl tyle razy zmieniany i nazewnictwo prarametrow ze wkoncu sie pomieszalo ;)

Tak czy siak masz racje ze bazowanie bylo na innym kodzie, ale kod jest w calosci napisany od nowa z uwagi na to iz nie moglem go przeniesc, jak przeszukasz grupy google to tam rowniez znajdziesz sporo rozwarzan na ten temat.

Pozdrawiam ;)

PS: szkoda ze nikt mi nie dal gotowego kodu bo nie spedzil bym nad tym kilku dni ;) ale w koncu nawet analizujac cudzy kod uczymy sie, czyz nie po to sa strony typu www.codeproject.com, 4programmers.net, planet-source-code.com ;)

Zobacz, nawet nie wykasowalem z kodu posta na ktorym bazowalem przy obliczeniach:

/*
Yes:
GetProcessTimes( GetCurrentProcess(), t1, t2, t3, t4 );
t3 is Kerneltime in 100ns-Setps
t4 is Usertime in 100ns-Setps
t3+t4 is overall CPU-Time of Process

use a timer and calculate Percent = (actualtime-oldtime) /
((actualTickCount-OldTickCount)*100)
works fine and results are equal to Taskmanager!
*/

hehe ;)

W odpowiedzi na twoj poprzedni post:

I jakaś dziwna ta funkcja ,mam wrażenie że odejmujesz nie to co powinieneś i
co ona ma wyliczac ?

Wlsnie to jes kawalek kodu ktory chcialem przeniesc ale do konca nie rozumialem wiec napisalem sam od nowa

Między dwoma wywołaniami GetProcessTimes( hHandle ...
musisz wykonac jakieś obliczenia , jak wywołasz funkcję 2x za koleją to
dostaniesz 0 po odjęciu wartości z FILETIME.. ;-)

Zgadza sie dlatego miedzy jednym a drugim odczytem jest Sleep( 1000 );

Funkcje GetProcessTimes i GetThreadTimes nie działają w Win98.

Nie interesuje mnie to dlatego ze program jest pod xp/2k, zawiera znacznie wiecej funkcji ktore nie dzialaja pod 98

Podsumowywujac, skopiuj kod, skompiluj, zmien nazwe procesu na taki ktory u ciebie istnieje i przekonaj sie ze dziala ;)

0

Ok.. :-) .Kod można bez problemu przenieść na BCB,
ja mam tylko jeden problem , nie mam u siebie w Builder3

psapi.h

Niektóre funkcje oraz struktury są niedostępne , i nie mogę tego przekompilować,
nie chce mi sie szukać tego PSAPI :|
Dla tego musiał bym pisac kod na BCB bez jego sprawdzenia,a nie chcę wstawiać lipy.
Powinieneś od razu dać kod i napisać że chcesz to przełożyć na BCB . :-)
Pewnie wtedy ktoś by już podał rozwiązanie...
No chyba że nie będzie chętnych to cos pomyślę ;-)
pozdro dzejo.

0

Tak, tylko ja nie chcialem do konca go przeniesc a podejrzec jak osiagnac uzycie procesora przez proces ;) Analizowanie cudzego kodu sluzy do tego aby sie czegos nauczyc, a nie skopiowac i chwalic sie ze to moje ;)

Ja czytajac ten kod zrozumialem jak mozna to obliczyc + wzor z google groups i efekt osiagniety ;)

Pzdr i dzieki za pomoc

PS: wiez mi ze jak bys zaczal kompilacje to w czasie linkowania mialbys troche wiecej problemow niz psapi ;) ale to juz nie wazne.

Polecam ci przesiasc sie z bcb3 na bcb6 perosnal tez darmowy a ma juz wiecej bibliotek ;)

pzdr

0

Chyba tak zrobię (BCB6), może napiszę sobie program na podstawie tego kodu ?... :-)
Jest interesujący , gdyby chciał działać na 100% można zmontować ciekawy komponent BCB..
powodzenia ,na razie cześć

1 użytkowników online, w tym zalogowanych: 0, gości: 1