📄 pviewdat.c
字号:
}
else
return PVIEW_PRIORITY_NORMAL;
}
//*********************************************************************
//
// RefreshPerfData
//
// Get a new set of performance data. pData should be NULL initially.
//
PPERF_DATA RefreshPerfData (HKEY hPerfKey,
LPTSTR szObjectIndex,
PPERF_DATA pData,
DWORD *pDataSize)
{
if (GetPerfData (hPerfKey, szObjectIndex, &pData, pDataSize) == ERROR_SUCCESS)
return pData;
else
return NULL;
}
//*********************************************************************
//
// SetProcessListText
//
// Format the process list text.
//
void SetProcessListText (PPERF_INSTANCE pInst,
PPERF_COUNTER pCPU,
PPERF_COUNTER pPRIV,
PPERF_COUNTER pProcID,
double fTime,
LPTSTR str)
{
DWORD *pdwProcID;
LARGE_INTEGER *liCPU;
LARGE_INTEGER *liPRIV;
double fCPU = 0;
double fPRIV = 0;
INT PcntPRIV = 0;
INT PcntUSER = 0;
TIME_FIELD TimeFld;
TCHAR szTemp[100];
if (pCPU)
{
liCPU = (LARGE_INTEGER *) CounterData (pInst, pCPU);
fCPU = Li2Double (*liCPU);
}
if (pPRIV)
{
liPRIV = (LARGE_INTEGER *) CounterData (pInst, pPRIV);
fPRIV = Li2Double (*liPRIV);
}
if (fCPU > 0)
{
PcntPRIV = (INT)(fPRIV / fCPU * 100 + 0.5);
PcntUSER = 100 - PcntPRIV;
}
if (pProcID)
{
pdwProcID = (DWORD *) CounterData (pInst, pProcID);
wsprintf (szTemp, TEXT("%ls (%#x)"), InstanceName(pInst), *pdwProcID);
}
else
wsprintf (szTemp, TEXT("%ls"), InstanceName(pInst));
FormatTimeFields (fCPU/1.0e7, &TimeFld);
wsprintf (str,TEXT("%s\t%3ld:%02ld:%02ld.%03ld\t%3ld%%\t%3ld%%"),
szTemp, TimeFld.Hours,TimeFld.Mins,TimeFld.Secs,
TimeFld.mSecs,PcntPRIV, PcntUSER);
}
//*********************************************************************
//
// RefreshProcessList
//
// Find all process and update the process list.
//
void RefreshProcessList (HWND hProcessList,
PPERF_OBJECT pObject)
{
PPERF_INSTANCE pInstance;
TCHAR szListText[256];
INT ListIndex;
PPERF_COUNTER pCounterCPU;
PPERF_COUNTER pCounterPRIV;
PPERF_COUNTER pCounterProcID;
double fObjectFreq;
double fObjectTime;
double fTime;
INT InstanceIndex = 0;
INT err;
if (pObject)
{
if ((pCounterCPU = FindCounter (pObject, PX_PROCESS_CPU)) &&
(pCounterPRIV = FindCounter (pObject, PX_PROCESS_PRIV)) &&
(pCounterProcID = FindCounter (pObject, PX_PROCESS_ID)))
{
fObjectFreq = Li2Double (pObject->PerfFreq);
fObjectTime = Li2Double (pObject->PerfTime);
fTime = fObjectTime / fObjectFreq;
pInstance = FirstInstance (pObject);
while (pInstance && InstanceIndex < pObject->NumInstances)
{
SetProcessListText (pInstance,pCounterCPU,pCounterPRIV,
pCounterProcID,fTime,szListText);
ListIndex = SendMessage (hProcessList, LB_ADDSTRING, 0, (DWORD)szListText);
err = SendMessage (hProcessList, LB_SETITEMDATA, ListIndex, InstanceIndex);
pInstance = NextInstance (pInstance);
InstanceIndex++;
}
}
}
}
//*********************************************************************
//
// RefreshProcessData
//
// Find data for a given process and update.
//
void RefreshProcessData (HWND hWnd,
PPERF_OBJECT pObject,
DWORD ProcessIndex)
{
PPERF_INSTANCE pInstance;
if (pInstance = FindInstanceN (pObject, ProcessIndex))
{
PutCounterDWKB (hWnd, PVIEW_WS, pInstance, pObject, PX_PROCESS_WORKING_SET);
SetDlgItemText (hWnd, PVIEW_TOTALPRIVATE_COMMIT, NODATA);
// set priority
//
CheckRadioButton (hWnd,PVIEW_PRIORITY_HIGH,PVIEW_PRIORITY_IDL,
ProcessPriority (pObject, pInstance));
}
}
//*********************************************************************
//
// SetThreadListText
//
// Format the thread list text.
//
void SetThreadListText (PPERF_INSTANCE pInst,
PPERF_COUNTER pCPU,
PPERF_COUNTER pPRIV,
double fTime,
LPTSTR str)
{
LARGE_INTEGER *liCPU;
LARGE_INTEGER *liPRIV;
double fCPU = 0;
double fPRIV = 0;
INT PcntPRIV = 0;
INT PcntUSER = 0;
TIME_FIELD TimeFld;
TCHAR szTemp[100];
if (pCPU)
{
liCPU = (LARGE_INTEGER *) CounterData (pInst, pCPU);
fCPU = Li2Double (*liCPU);
}
if (pPRIV)
{
liPRIV = (LARGE_INTEGER *) CounterData (pInst, pPRIV);
fPRIV = Li2Double (*liPRIV);
}
if (fCPU > 0)
{
PcntPRIV = (INT)(fPRIV / fCPU * 100 + 0.5);
PcntUSER = 100 - PcntPRIV;
}
if (pInst->UniqueID != PERF_NO_UNIQUE_ID)
wsprintf (szTemp, TEXT("%ls (%#x)"), InstanceName(pInst), pInst->UniqueID);
else
wsprintf (szTemp, TEXT("%ls"), InstanceName(pInst));
FormatTimeFields (fCPU/1.0e7, &TimeFld);
wsprintf (str,TEXT("%s\t%3ld:%02ld:%02ld.%03ld\t%3ld%%\t%3ld %%"),
szTemp,TimeFld.Hours,TimeFld.Mins,TimeFld.Secs,
TimeFld.mSecs,PcntPRIV,PcntUSER);
}
//*********************************************************************
//
// RefreshThreadList
//
// Find all threads for a given process and update the thread list.
//
void RefreshThreadList (HWND hThreadList,
PPERF_OBJECT pObject,
DWORD ParentIndex)
{
PPERF_INSTANCE pInstance;
TCHAR szListText[256];
INT ListIndex;
PPERF_COUNTER pCounterCPU;
PPERF_COUNTER pCounterPRIV;
double fObjectFreq;
double fObjectTime;
double fTime;
INT InstanceIndex = 0;
INT err;
if (pObject)
{
if ((pCounterCPU = FindCounter (pObject, PX_THREAD_CPU)) &&
(pCounterPRIV = FindCounter (pObject, PX_THREAD_PRIV)))
{
fObjectFreq = Li2Double (pObject->PerfFreq);
fObjectTime = Li2Double (pObject->PerfTime);
fTime = fObjectTime / fObjectFreq;
pInstance = FirstInstance (pObject);
while (pInstance && InstanceIndex < pObject->NumInstances)
{
if (ParentIndex == pInstance->ParentObjectInstance)
{
SetThreadListText (pInstance,pCounterCPU,
pCounterPRIV,fTime,szListText);
ListIndex = SendMessage (hThreadList,LB_INSERTSTRING,
(WPARAM)-1,(DWORD)szListText);
err = SendMessage (hThreadList, LB_SETITEMDATA, ListIndex, InstanceIndex);
}
pInstance = NextInstance (pInstance);
InstanceIndex++;
}
}
}
}
//*********************************************************************
//
// RefreshThreadData
//
// Find data for a given thread and update.
//
void RefreshThreadData (HWND hWnd,
PPERF_OBJECT pThreadObj,
DWORD ThreadIndex,
PPERF_OBJECT pProcessObj,
PPERF_INSTANCE pProcessInst)
{
PPERF_INSTANCE pInstance;
PPERF_COUNTER pCounter;
DWORD *pdwData;
DWORD *pdwProcPrio;
BOOL bPrioCounter = TRUE;
if (pInstance = FindInstanceN (pThreadObj, ThreadIndex))
{
SetDlgItemText (hWnd, PVIEW_THREAD_PC, NODATA);
PutCounterHEX (hWnd, PVIEW_THREAD_START, pInstance, pThreadObj, PX_THREAD_START);
PutCounterDW (hWnd, PVIEW_THREAD_SWITCHES, pInstance, pThreadObj, PX_THREAD_SWITCHES);
PutCounterDW (hWnd, PVIEW_THREAD_DYNAMIC, pInstance, pThreadObj, PX_THREAD_PRIO);
}
if (pInstance)
{
// get thread base priority
//
if (pCounter = FindCounter (pThreadObj, PX_THREAD_BASE_PRIO))
pdwData = CounterData (pInstance, pCounter);
else
bPrioCounter = FALSE;
// get process priority
//
if (pCounter = FindCounter (pProcessObj, PX_PROCESS_PRIO))
pdwProcPrio = CounterData (pProcessInst, pCounter);
else
bPrioCounter = FALSE;
}
else
bPrioCounter = FALSE;
// set thread base priority
//
if (!bPrioCounter)
CheckRadioButton (hWnd,PVIEW_THREAD_HIGHEST,
PVIEW_THREAD_LOWEST,PVIEW_THREAD_NORMAL);
else
{
switch (*pdwData - *pdwProcPrio)
{
case 2:
CheckRadioButton (hWnd,
PVIEW_THREAD_HIGHEST,
PVIEW_THREAD_LOWEST,
PVIEW_THREAD_HIGHEST);
break;
case 1:
CheckRadioButton (hWnd,
PVIEW_THREAD_HIGHEST,
PVIEW_THREAD_LOWEST,
PVIEW_THREAD_ABOVE);
break;
case -1:
CheckRadioButton (hWnd,
PVIEW_THREAD_HIGHEST,
PVIEW_THREAD_LOWEST,
PVIEW_THREAD_BELOW);
break;
case -2:
CheckRadioButton (hWnd,
PVIEW_THREAD_HIGHEST,
PVIEW_THREAD_LOWEST,
PVIEW_THREAD_LOWEST);
break;
case 0:
default:
CheckRadioButton (hWnd,
PVIEW_THREAD_HIGHEST,
PVIEW_THREAD_LOWEST,
PVIEW_THREAD_NORMAL);
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -