只能用JNI吧,这个跟平台联系很紧密的,想来SUN也不会封装进去吧。给你个BCB的例子,改成用JAVA的JNI调我还没有试过。在一个特定时间段内计算特定进程的总时间和所有进程的总时间,它们的比值就是那个特定进程的确CPU占有率,这里我采用1秒种。====================================================================typedef struct _THREAD_INFO
{
LARGE_INTEGER CreateTime;
DWORD dwUnknown1;
DWORD dwStartAddress;
DWORD StartEIP;
DWORD dwOwnerPID;
DWORD dwThreadId;
DWORD dwCurrentPriority;
DWORD dwBasePriority;
DWORD dwContextSwitches;
DWORD Unknown;
DWORD WaitReason;}THREADINFO, *PTHREADINFO;typedef struct _UNICODE_STRING
{
USHORT Length;
USHORT MaxLength;
PWSTR Buffer;} UNICODE_STRING;typedef struct _PROCESS_INFO
{
DWORD dwOffset;
DWORD dwThreadsCount;
DWORD dwUnused1[6];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName; DWORD dwBasePriority;
DWORD dwProcessID;
DWORD dwParentProcessId;
DWORD dwHandleCount;
DWORD dwUnused3[2]; DWORD dwVirtualBytesPeak;
DWORD dwVirtualBytes;
ULONG dwPageFaults;
DWORD dwWorkingSetPeak;
DWORD dwWorkingSet;
DWORD dwQuotaPeakPagedPoolUsage;
DWORD dwQuotaPagedPoolUsage;
DWORD dwQuotaPeakNonPagedPoolUsage;
DWORD dwQuotaNonPagedPoolUsage;
DWORD dwPageFileUsage;
DWORD dwPageFileUsagePeak; DWORD dCommitCharge;
THREADINFO ThreadSysInfo[1];} PROCESSINFO, *PPROCESSINFO;
//每秒钟查询一次
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Button2Click(NULL);
}
//---------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)
{
PVOID pProcInfo = NULL;
DWORD dwInfoSize = 0x20000;
PPROCESSINFO pProcessInfo;
DWORD dwWorkingSet;
long ( __stdcall *NtQuerySystemInformation )( DWORD, PVOID, DWORD, DWORD );
static __int64 LastTotalProcessCPUUsage = 0;
static __int64 LastCurrentProcessCPUUsage = 0; int CurrentDelta;
int TotalDelta; __int64 TotalProcessCPUUsage = 0;
__int64 CurrentProcessCPUUsage = 0; ///////////////////////////////// pProcInfo = (PVOID)(new byte[dwInfoSize]); NtQuerySystemInformation = (long(__stdcall*)(DWORD,PVOID,DWORD,DWORD))
GetProcAddress( GetModuleHandle( "ntdll.dll" ),"NtQuerySystemInformation" ); NtQuerySystemInformation(5,pProcInfo,dwInfoSize,0); pProcessInfo = (PPROCESSINFO)pProcInfo; do
{
TotalProcessCPUUsage += (__int64)pProcessInfo->KernelTime.QuadPart + (__int64)pProcessInfo->UserTime.QuadPart; if(pProcessInfo->dwProcessID == GetCurrentProcessId())
{
dwWorkingSet = pProcessInfo->dwWorkingSet;
CurrentProcessCPUUsage += (__int64)pProcessInfo->KernelTime.QuadPart + (__int64)pProcessInfo->UserTime.QuadPart;
} /////////
if(pProcessInfo->dwOffset == 0)
{
break;
}
pProcessInfo = (PPROCESSINFO)((byte*)pProcessInfo + pProcessInfo->dwOffset);
}
while(true); TotalDelta = TotalProcessCPUUsage - LastTotalProcessCPUUsage;
CurrentDelta = CurrentProcessCPUUsage - LastCurrentProcessCPUUsage; if(TotalDelta != 0)
this->Caption = "CPU = " + IntToStr(100 * CurrentDelta / TotalDelta) +
"Memory = "+ IntToStr(dwWorkingSet / 1024) " K"; LastTotalProcessCPUUsage = TotalProcessCPUUsage;
LastCurrentProcessCPUUsage = CurrentProcessCPUUsage; delete[] pProcInfo;
}
{
LARGE_INTEGER CreateTime;
DWORD dwUnknown1;
DWORD dwStartAddress;
DWORD StartEIP;
DWORD dwOwnerPID;
DWORD dwThreadId;
DWORD dwCurrentPriority;
DWORD dwBasePriority;
DWORD dwContextSwitches;
DWORD Unknown;
DWORD WaitReason;}THREADINFO, *PTHREADINFO;typedef struct _UNICODE_STRING
{
USHORT Length;
USHORT MaxLength;
PWSTR Buffer;} UNICODE_STRING;typedef struct _PROCESS_INFO
{
DWORD dwOffset;
DWORD dwThreadsCount;
DWORD dwUnused1[6];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName; DWORD dwBasePriority;
DWORD dwProcessID;
DWORD dwParentProcessId;
DWORD dwHandleCount;
DWORD dwUnused3[2]; DWORD dwVirtualBytesPeak;
DWORD dwVirtualBytes;
ULONG dwPageFaults;
DWORD dwWorkingSetPeak;
DWORD dwWorkingSet;
DWORD dwQuotaPeakPagedPoolUsage;
DWORD dwQuotaPagedPoolUsage;
DWORD dwQuotaPeakNonPagedPoolUsage;
DWORD dwQuotaNonPagedPoolUsage;
DWORD dwPageFileUsage;
DWORD dwPageFileUsagePeak; DWORD dCommitCharge;
THREADINFO ThreadSysInfo[1];} PROCESSINFO, *PPROCESSINFO;
//每秒钟查询一次
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Button2Click(NULL);
}
//---------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)
{
PVOID pProcInfo = NULL;
DWORD dwInfoSize = 0x20000;
PPROCESSINFO pProcessInfo;
DWORD dwWorkingSet;
long ( __stdcall *NtQuerySystemInformation )( DWORD, PVOID, DWORD, DWORD );
static __int64 LastTotalProcessCPUUsage = 0;
static __int64 LastCurrentProcessCPUUsage = 0; int CurrentDelta;
int TotalDelta; __int64 TotalProcessCPUUsage = 0;
__int64 CurrentProcessCPUUsage = 0; ///////////////////////////////// pProcInfo = (PVOID)(new byte[dwInfoSize]); NtQuerySystemInformation = (long(__stdcall*)(DWORD,PVOID,DWORD,DWORD))
GetProcAddress( GetModuleHandle( "ntdll.dll" ),"NtQuerySystemInformation" ); NtQuerySystemInformation(5,pProcInfo,dwInfoSize,0); pProcessInfo = (PPROCESSINFO)pProcInfo; do
{
TotalProcessCPUUsage += (__int64)pProcessInfo->KernelTime.QuadPart + (__int64)pProcessInfo->UserTime.QuadPart; if(pProcessInfo->dwProcessID == GetCurrentProcessId())
{
dwWorkingSet = pProcessInfo->dwWorkingSet;
CurrentProcessCPUUsage += (__int64)pProcessInfo->KernelTime.QuadPart + (__int64)pProcessInfo->UserTime.QuadPart;
} /////////
if(pProcessInfo->dwOffset == 0)
{
break;
}
pProcessInfo = (PPROCESSINFO)((byte*)pProcessInfo + pProcessInfo->dwOffset);
}
while(true); TotalDelta = TotalProcessCPUUsage - LastTotalProcessCPUUsage;
CurrentDelta = CurrentProcessCPUUsage - LastCurrentProcessCPUUsage; if(TotalDelta != 0)
this->Caption = "CPU = " + IntToStr(100 * CurrentDelta / TotalDelta) +
"Memory = "+ IntToStr(dwWorkingSet / 1024) " K"; LastTotalProcessCPUUsage = TotalProcessCPUUsage;
LastCurrentProcessCPUUsage = CurrentProcessCPUUsage; delete[] pProcInfo;
}
.h文件
typedef struct _tag_PDHCounterStruct {
HCOUNTER hCounter; // Handle to the counter - given to use by PDH Library
int nNextIndex; // element to get the next raw value
int nOldestIndex; // element containing the oldes raw value
int nRawCount; // number of elements containing raw values
PDH_RAW_COUNTER a_RawValue[1024]; // Ring buffer to contain raw values
} PDHCOUNTERSTRUCT, *PPDHCOUNTERSTRUCT;PDH_STATUS __stdcall PDH_BrowseCallback(DWORD dwParam);
BOOL PDH_AddCounter(LPTSTR szCounterName, int nItemIndex);
void InitQuery();
extern PDH_BROWSE_DLG_CONFIG gpdhBrowseDlgConfig;
extern PPDHCOUNTERSTRUCT MyCounter;
extern HQUERY hQuery;
extern LPTSTR gszReturnPath;
extern DWORD gdwReturnPathSize;
extern PACKAGE TForm1 *Form1;
extern nCounterIndex;.cpp文件
void InitQuery()
{
PDH_STATUS pdhStatus = PdhOpenQuery (NULL, 0, &hQuery);
if (IsErrorSeverity(pdhStatus))
{
return ;
} MyCounter = (PPDHCOUNTERSTRUCT)GlobalAlloc(GPTR, sizeof(PDHCOUNTERSTRUCT)*1024);
gdwReturnPathSize = 1024;
gszReturnPath = (LPTSTR) LocalAlloc(LPTR, gdwReturnPathSize);
nCounterIndex = 0;
}
int TForm1::GetProcessCount()
{
PDH_STATUS pdhStatus;
PDH_FMT_COUNTERVALUE fmtValue;
DWORD ctrType;
int nRetCode = 0; pdhStatus = PdhCollectQueryData (hQuery); // Get the current value of this counter.
for(int i=0;i<ListView2->Items->Count;i++)
{
pdhStatus = PdhGetFormattedCounterValue (MyCounter[i].hCounter,PDH_FMT_LONG,
NULL,&fmtValue);
if (pdhStatus == ERROR_SUCCESS)
{
ListView2->Items->Item[i]->SubItems->Strings[0] = FormatFloat("#,###,###,##0.",fmtValue.longValue);
}
}
/* else
{
// Print the error value.
ShowMessage("错误");;
}*/ return 0;}int TForm1::GetTotalCommittedMemory(int ProcessID)
{
HANDLE hProcess;
Pointer pAddr =0;
int dwTotalCommit =0;
int ret;
MEMORY_BASIC_INFORMATION mi;
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,0,ProcessID);
ret = VirtualQueryEx((char*)hProcess,(char*)pAddr,&mi,sizeof(mi)); do
{
pAddr = (char *)(mi.BaseAddress) + mi.RegionSize;
if((int)pAddr > 0x7fffffff)
break;
if(mi.State == MEM_COMMIT)
{
dwTotalCommit +=mi.RegionSize;
}
ret = VirtualQueryEx((char*)hProcess,(char*)pAddr,&mi,sizeof(mi));
}while(ret == sizeof(mi));
CloseHandle(hProcess);
return dwTotalCommit/1024;
}void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
GetProcessCount();
}
//---------------------------------------------------------------------------
#include <pdhmsg.h>
PDH_BROWSE_DLG_CONFIG gpdhBrowseDlgConfig;
LPTSTR gszReturnPath;
DWORD gdwReturnPathSize;
PPDHCOUNTERSTRUCT MyCounter;
HQUERY hQuery;
int nCounterIndex;PDH_STATUS __stdcall PDH_BrowseCallback(DWORD dwParam)
{
PDH_STATUS returnValue;
LPTSTR szCurrentPath;
int nLen; if (gpdhBrowseDlgConfig.CallBackStatus == PDH_MORE_DATA) {
// Buffer too small for the counters selected // Free original buffer
if (NULL != LocalFree(gszReturnPath)) {
return PDH_MEMORY_ALLOCATION_FAILURE;
} // Alloc new larger buffer
gdwReturnPathSize += 1024;
gszReturnPath = (LPTSTR) LocalAlloc(LPTR, gdwReturnPathSize);
if (gszReturnPath == NULL) {
return PDH_MEMORY_ALLOCATION_FAILURE;
} // Set the config structure members for the new buffer
gpdhBrowseDlgConfig.szReturnPathBuffer = gszReturnPath;
gpdhBrowseDlgConfig.cchReturnPathLength = gdwReturnPathSize; // retry the counter browse selection
return PDH_RETRY;
} returnValue = ERROR_SUCCESS;
szCurrentPath = gszReturnPath;
// This string manipulation code is in a try/except block
// to gracefully handle any problems
// with pointer values, null termination, boundary conditions, etc.
__try {
while (TRUE) {
nLen = lstrlen(szCurrentPath); if (nLen == 0)
break; PDH_AddCounter(szCurrentPath, nCounterIndex);
nCounterIndex++;
szCurrentPath += (nLen + 1);
}
}
__except(EXCEPTION_EXECUTE_HANDLER) {
returnValue = PDH_INVALID_BUFFER;
} return returnValue ;
}
void __fastcall TForm1::Button9Click(TObject *Sender)
{ ZeroMemory(&gpdhBrowseDlgConfig, sizeof(gpdhBrowseDlgConfig));
gpdhBrowseDlgConfig.hWndOwner = this->Handle; gpdhBrowseDlgConfig.bIncludeInstanceIndex = false;
gpdhBrowseDlgConfig.bSingleCounterPerAdd = false;
gpdhBrowseDlgConfig.bSingleCounterPerDialog = false;
gpdhBrowseDlgConfig.bLocalCountersOnly = true;
gpdhBrowseDlgConfig.bWildCardInstances = true;
gpdhBrowseDlgConfig.bHideDetailBox = true;
gpdhBrowseDlgConfig.bInitializePath = true;
gpdhBrowseDlgConfig.szReturnPathBuffer = gszReturnPath;
gpdhBrowseDlgConfig.cchReturnPathLength = gdwReturnPathSize; gpdhBrowseDlgConfig.pCallBack = PDH_BrowseCallback; __try {
PdhBrowseCounters(&gpdhBrowseDlgConfig);
}
__except(EXCEPTION_EXECUTE_HANDLER) {
// UpdateStatus(TEXT("Exception in PdhBrowseCounters. (Handled)"));
// MessageBeep(0);
}
}
//---------------------------------------------------------------------------
BOOL PDH_AddCounter(LPTSTR szCounterName, int nItemIndex)
{
BOOL fRes = TRUE; // Allocate a PDHCOUNTERSTRUCT for this new counter // Add the counter to the list view control
__try {
// Add the counter to the current query
if (ERROR_SUCCESS == PdhAddCounter(hQuery, szCounterName, (DWORD)(&MyCounter[nItemIndex]), &(MyCounter[nItemIndex].hCounter)))
{
TListItem * Item = Form1->ListView2->Items->Add();
Item->Caption = szCounterName;
Item->SubItems->Add("");
fRes = FALSE;
}
}
__except(EXCEPTION_EXECUTE_HANDLER) {
fRes = FALSE;
} // If the add failed, then clean up the list view and the counter struct return fRes;
}