|
|
// dphcidlg.cpp : implementation file
//
#include <tchar.h>
#include "stdafx.h"
#include "DPH_TEST.h"
#include "dphcidlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__; #endif
#define LODWORD(x) ((DWORD)((x) & 0x00000000FFFFFFFF))
#define HIDWORD(x) ((DWORD)(((x)>>32) & 0x00000000FFFFFFFF))
/////////////////////////////////////////////////////////////////////////////
// CDphCounterInfoDlg dialog
CDphCounterInfoDlg::CDphCounterInfoDlg(CWnd* pParent /*=NULL*/, HCOUNTER hCounterArg /*=NULL*/, HQUERY hQueryArg /*=NULL*/) : CDialog(CDphCounterInfoDlg::IDD, pParent) { //{{AFX_DATA_INIT(CDphCounterInfoDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// save this counter's handle for updates
hCounter = hCounterArg; hQuery = hQueryArg;
// init the timer variables
nTimerId = 0; bTimerRunning = FALSE; bGetDefinitions = TRUE;
// clear the statistical data buffer
memset (RawDataArray, 0, sizeof(RawDataArray)); dwFirstIndex = 0; dwNextIndex = 0; dwItemsUsed = 0; }
void CDphCounterInfoDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDphCounterInfoDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDphCounterInfoDlg, CDialog) //{{AFX_MSG_MAP(CDphCounterInfoDlg)
ON_BN_CLICKED(IDC_GET_NEW_DATA, OnGetNewData) ON_BN_CLICKED(IDC_1SEC_BTN, On1secBtn) ON_WM_TIMER() ON_WM_DESTROY() //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDphCounterInfoDlg message handlers
BOOL CDphCounterInfoDlg::OnInitDialog() { CDialog::OnInitDialog(); OnGetNewData(); SetDefID (IDC_GET_NEW_DATA);
// set button text to reflect current state
SetDlgItemText (IDC_1SEC_BTN, TEXT("&Start Timer")); // clear statistics display
SetDlgItemText (IDC_CI_DATA_POINTS, TEXT("")); SetDlgItemText (IDC_CI_AVERAGE_VALUE, TEXT("")); SetDlgItemText (IDC_CI_MIN_VALUE, TEXT("")); SetDlgItemText (IDC_CI_MAX_VALUE, TEXT(""));
return FALSE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDphCounterInfoDlg::OnGetNewData() { PPDH_COUNTER_INFO pciData; PDH_RAW_COUNTER RawData; PDH_STATUS Status; DWORD dwCounterType; DWORD dwBufLen = 4096; LPTSTR szTextBuffer; PDH_FMT_COUNTERVALUE dfValue; double dValue; LONGLONG llValue; LONG lValue; SYSTEMTIME stTimeStamp; pciData = (PPDH_COUNTER_INFO)new char[dwBufLen]; szTextBuffer = new TCHAR[dwBufLen];
if ((pciData == NULL) || (szTextBuffer == NULL)) { Status = ERROR_OUTOFMEMORY; } else { Status = ERROR_SUCCESS; }
if (Status == ERROR_SUCCESS) {
Status = PdhCollectQueryData (hQuery);
if (Status == PDH_NO_MORE_DATA) { if (bTimerRunning) { // stop the timer to prevent updating the display
KillTimer (nTimerId); nTimerId = 0; bTimerRunning = FALSE; SetDlgItemText (IDC_1SEC_BTN, TEXT("&Start Timer")); } // disable the data buttons
GetDlgItem(IDC_1SEC_BTN)->EnableWindow(FALSE); GetDlgItem(IDC_GET_NEW_DATA)->EnableWindow(FALSE); } else { // update the display values
Status = PdhGetRawCounterValue ( hCounter, &dwCounterType, &RawData);
if ((Status == ERROR_SUCCESS) && bGetDefinitions) {
Status = PdhGetCounterInfo ( hCounter, TRUE, &dwBufLen, pciData); }
if (Status == ERROR_SUCCESS) { // get formatted values
Status = PdhGetFormattedCounterValue ( hCounter, PDH_FMT_LONG, NULL, &dfValue); if (Status == ERROR_SUCCESS) { lValue = dfValue.longValue; } else { lValue = (LONG)-1; } }
if (Status == ERROR_SUCCESS) { // get formatted values
Status = PdhGetFormattedCounterValue ( hCounter, PDH_FMT_DOUBLE, NULL, &dfValue); if (Status == ERROR_SUCCESS) { dValue = dfValue.doubleValue; } else { dValue = (double)-1.0; } }
if (Status == ERROR_SUCCESS) { // get formatted values
Status = PdhGetFormattedCounterValue ( hCounter, PDH_FMT_LARGE, NULL, &dfValue); if (Status == ERROR_SUCCESS) { llValue = dfValue.largeValue; } else { llValue = (LONGLONG)-1; } } } }
if (Status == ERROR_SUCCESS) { if (bGetDefinitions) { bGetDefinitions = FALSE; // only do once
// load dialog box
_stprintf (szTextBuffer, TEXT("%d"), pciData->dwLength); SetDlgItemText (IDC_CI_LENGTH, szTextBuffer);
_stprintf (szTextBuffer, TEXT("0x%8.8x"), pciData->dwType); SetDlgItemText (IDC_CI_TYPE, szTextBuffer);
_stprintf (szTextBuffer, TEXT("0x%8.8x"), pciData->CVersion); SetDlgItemText (IDC_CI_VERSION, szTextBuffer);
_stprintf (szTextBuffer, TEXT("0x%8.8x"), pciData->CStatus); SetDlgItemText (IDC_CI_STATUS, szTextBuffer);
_stprintf (szTextBuffer, TEXT("%d"), pciData->lScale); SetDlgItemText (IDC_CI_SCALE, szTextBuffer);
_stprintf (szTextBuffer, TEXT("%d"), pciData->lDefaultScale); SetDlgItemText (IDC_CI_DEFAULT_SCALE, szTextBuffer);
_stprintf (szTextBuffer, TEXT("0x%8.8x"), pciData->dwUserData); SetDlgItemText (IDC_CI_USER_DATA, szTextBuffer);
SetDlgItemText (IDC_CI_MACHINE_NAME, pciData->szMachineName); SetDlgItemText (IDC_CI_OBJECT_NAME, pciData->szObjectName);
_stprintf (szTextBuffer, TEXT("%s:%d"), pciData->szInstanceName, pciData->dwInstanceIndex); SetDlgItemText (IDC_CI_INSTANCE_NAME, szTextBuffer);
SetDlgItemText (IDC_CI_PARENT_NAME, pciData->szParentInstance); SetDlgItemText (IDC_CI_COUNTER_NAME, pciData->szCounterName); SetDlgItemText (IDC_CI_EXPLAIN_TEXT, pciData->szExplainText);
SetDlgItemText (IDC_CI_FULL_NAME, pciData->szFullPath); }
_stprintf (szTextBuffer, TEXT("0x%8.8x"), RawData.CStatus); SetDlgItemText (IDC_RV_STATUS, szTextBuffer);
FileTimeToSystemTime ((LPFILETIME)&RawData.TimeStamp, &stTimeStamp); _stprintf (szTextBuffer, TEXT("%2.2d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d.%3.3d"), stTimeStamp.wMonth, stTimeStamp.wDay, stTimeStamp.wYear, stTimeStamp.wHour, stTimeStamp.wMinute, stTimeStamp.wSecond, stTimeStamp.wMilliseconds); SetDlgItemText (IDC_TIME_STAMP, szTextBuffer);
_stprintf (szTextBuffer, TEXT("0x%8.8x%8.8x"), HIDWORD(RawData.FirstValue), LODWORD(RawData.FirstValue)); SetDlgItemText (IDC_RV_FIRST, szTextBuffer);
_stprintf (szTextBuffer, TEXT("0x%8.8x%8.8x"), HIDWORD(RawData.SecondValue), LODWORD(RawData.SecondValue)); SetDlgItemText (IDC_RV_SECOND, szTextBuffer);
_stprintf (szTextBuffer, TEXT("0x%8.8x"), dwCounterType); SetDlgItemText (IDC_RV_TYPE, szTextBuffer);
_stprintf (szTextBuffer, TEXT("%d"), lValue); SetDlgItemText (IDC_FMT_LONG_VALUE, szTextBuffer);
_stprintf (szTextBuffer, TEXT("%f"), dValue); SetDlgItemText (IDC_FMT_DBL_VALUE, szTextBuffer);
_stprintf (szTextBuffer, TEXT("0x%8.8x%8.8x"), HIDWORD(llValue), LODWORD(llValue)); SetDlgItemText (IDC_FMT_LARGE_VALUE, szTextBuffer); } else if (Status != PDH_NO_MORE_DATA) { // clear fields and display error message
// in explain text
// if any error but the end of the log file
szTextBuffer[0] = 0; SetDlgItemText (IDC_CI_LENGTH, szTextBuffer); SetDlgItemText (IDC_CI_TYPE, szTextBuffer); SetDlgItemText (IDC_CI_VERSION, szTextBuffer); SetDlgItemText (IDC_CI_STATUS, szTextBuffer); SetDlgItemText (IDC_CI_SCALE, szTextBuffer); SetDlgItemText (IDC_CI_USER_DATA, szTextBuffer); SetDlgItemText (IDC_CI_FULL_NAME, szTextBuffer); SetDlgItemText (IDC_CI_COUNTER_NAME, szTextBuffer); SetDlgItemText (IDC_RV_STATUS, szTextBuffer); SetDlgItemText (IDC_RV_FIRST, szTextBuffer); SetDlgItemText (IDC_RV_SECOND, szTextBuffer); SetDlgItemText (IDC_RV_TYPE, szTextBuffer); SetDlgItemText (IDC_FMT_LONG_VALUE, szTextBuffer); SetDlgItemText (IDC_FMT_DBL_VALUE, szTextBuffer); SetDlgItemText (IDC_FMT_LARGE_VALUE, szTextBuffer);
_stprintf (szTextBuffer, TEXT("Unable to query counter data, Error 0x%8.8x"), Status); SetDlgItemText (IDC_CI_EXPLAIN_TEXT, szTextBuffer); } else { _stprintf (szTextBuffer, TEXT("End of Log File Reached."), Status); SetDlgItemText (IDC_CI_EXPLAIN_TEXT, szTextBuffer); }
if (pciData != NULL) delete pciData; if (szTextBuffer != NULL) delete szTextBuffer; }
void CDphCounterInfoDlg::On1secBtn() { if (bTimerRunning) { KillTimer (nTimerId); nTimerId = 0; bTimerRunning = FALSE; SetDlgItemText (IDC_1SEC_BTN, TEXT("&Start Timer")); // clear display
SetDlgItemText (IDC_CI_DATA_POINTS, TEXT("")); SetDlgItemText (IDC_CI_AVERAGE_VALUE, TEXT("")); SetDlgItemText (IDC_CI_MIN_VALUE, TEXT("")); SetDlgItemText (IDC_CI_MAX_VALUE, TEXT("")); } else { nTimerId = SetTimer (ID_TIMER, 1000, NULL); if (nTimerId != 0) { bTimerRunning = TRUE; SetDlgItemText (IDC_1SEC_BTN, TEXT("&Stop Timer")); } else { MessageBeep (0xFFFFFFFF); //standard beep
} } }
void CDphCounterInfoDlg::OnTimer(UINT nIDEvent) { PDH_RAW_COUNTER RawDataItem; PDH_STATUS Status; DWORD dwCounterType; PDH_STATISTICS CtrStats; TCHAR szValue[MAX_PATH];
// get data
OnGetNewData();
Status = PdhGetRawCounterValue ( hCounter, &dwCounterType, &RawDataItem);
// add raw value to array
RawDataArray[dwNextIndex] = RawDataItem;
// get statistics on raw data
Status = PdhComputeCounterStatistics ( hCounter, PDH_FMT_DOUBLE, dwFirstIndex, ++dwItemsUsed, RawDataArray, &CtrStats);
// display in window
if (Status == ERROR_SUCCESS) { _stprintf (szValue, TEXT("%d/%d"), CtrStats.count, dwItemsUsed); SetDlgItemText (IDC_CI_DATA_POINTS, szValue);
_stprintf (szValue, TEXT("%f"), CtrStats.mean.doubleValue); SetDlgItemText (IDC_CI_AVERAGE_VALUE, szValue);
_stprintf (szValue, TEXT("%f"), CtrStats.min.doubleValue); SetDlgItemText (IDC_CI_MIN_VALUE, szValue);
_stprintf (szValue, TEXT("%f"), CtrStats.max.doubleValue); SetDlgItemText (IDC_CI_MAX_VALUE, szValue); } else { _stprintf (szValue, TEXT("%d"), dwItemsUsed); SetDlgItemText (IDC_CI_DATA_POINTS, szValue); // unable to compute statistics
lstrcpy (szValue, TEXT("Error")); SetDlgItemText (IDC_CI_AVERAGE_VALUE, szValue); SetDlgItemText (IDC_CI_MIN_VALUE, szValue); SetDlgItemText (IDC_CI_MAX_VALUE, szValue); } // update pointers & indeces
if (dwItemsUsed < RAW_DATA_ITEMS) { dwNextIndex = ++dwNextIndex % RAW_DATA_ITEMS; } else { --dwItemsUsed; dwNextIndex = dwFirstIndex; dwFirstIndex = ++dwFirstIndex % RAW_DATA_ITEMS; }
CDialog::OnTimer(nIDEvent); }
void CDphCounterInfoDlg::OnDestroy() { CDialog::OnDestroy(); if (bTimerRunning) { KillTimer (nTimerId); nTimerId = 0; bTimerRunning = FALSE; } }
|