[TASKMGR] Cherry pick Hermes fixes

** WIP ** [TASKMGR] Get rid of thread-oriented updates. Just do it synchronously on WM_TIMER.

** WIP ** Merge RefreshPerformancePage() and PerformancePageRefreshThread(), now that we removed the separate performance page refreshing thread.

- Use _ui64tow() instead of _ultow() for converting ULONGLONGs into
  a string representation.

- Isolate the update of the status bar.

- Isolate the actual graphs redrawing. The idea for later is to not
  trigger any redrawings (and run unnecessary code) if the page is deactivated.

[TASKMGR] No need to get and save global handles for all the controls in the performance page.

... and especially for controls that are used only in one place.
Only handles to the graph controls are sufficient. For the others,
we can manage by using dialog control IDs.

- Rename AdjustFrameSize() 'pos' parameter to be more explicit.

** WIP ** Group trios of Memory performance getters together, as they are always used in succession.

- Group PerfDataGetCommitCharge[Total|Limit|Peak]K() together into
  PerfDataGetCommitChargeK().

- Group PerfDataGetKernelMemory[Total|Paged|NonPaged]K() together
  into PerfDataGetKernelMemoryK().

- Group PerfDataGetPhysicalMemory[Total|Available|SystemCache]K()
  together into PerfDataGetPhysicalMemoryK().

- Use these new Mem performance getters.

[TASKMGR] Use owner-drawn performance graphs.

- Use owner-drawn buttons to implement correct graph painting while
  maintaining the 3D appearance. As done on Windows (TM)

  Why using buttons (that should be disabled btw.)?
  Because we want, if the graphs fail to be created (due to e.g.
  lack of resources), to show a descriptive label of what's missing.

  This also allow the graphs to be drawn **properly** inside a 3D-border window.

- Redraw graphs on WM_DRAWITEM.

- Don't need to subclass button controls.

- Use DeferWindowPos() to avoid controls blinking on resize.

- Fix the problem of the buttons resizing as "1/x": this was due to
  the fact, using GetClientRect + Mapping, did't take the border into
  account. Instead, use GetWindowRect + a different coord mapping to
  fix all that.

- Remove some dead code.

- Rename the remaining ridiculously long variable names.

** WIP ** CPU/Mem meters: keep a separate copy of the CPU/Mem perf values.

+ Use structure for keeping state.

** WIP ** Add support for multiple-CPU stats. (In progress, needs code cleanup.)

In particular, use SystemProcessorTimeInfo to calculate the idle time
as done in ROSAPPS' ctm.exe, see commit c0873723.

See also https://ladydebug.com/blog/codes/cpuusage_win.htm

+ Fix the problem of NtQuerySystemInformation(SystemPerformanceInformation)
  that shows up when running a 32-bit build under Windows 7 x64.

** WIP ** Investigating showing physical memory in the MEM gauge.
This commit is contained in:
Hermès Bélusca-Maïto 2021-12-20 03:19:38 +02:00 committed by Timo Kreuzer
parent b036b616ea
commit 129f10ea26
43 changed files with 1234 additions and 1279 deletions

View file

@ -25,7 +25,7 @@ HWND hApplicationPageNewTaskButton; /* Application New Task button *
static int nApplicationPageWidth;
static int nApplicationPageHeight;
static BOOL bSortAscending = TRUE;
DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter);
DWORD WINAPI ApplicationPageRefreshThread(PVOID Parameter);
BOOL noApps;
BOOL bApplicationPageSelectionMade = FALSE;
@ -38,11 +38,6 @@ void ApplicationPageShowContextMenu2(void);
int CALLBACK ApplicationPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
int ProcGetIndexByProcessId(DWORD dwProcessId);
#ifdef RUN_APPS_PAGE
static HANDLE hApplicationThread = NULL;
static DWORD dwApplicationThread;
#endif
static INT
GetSystemColorDepth(VOID)
{
@ -131,21 +126,12 @@ ApplicationPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
UpdateApplicationListControlViewSetting();
/* Start our refresh thread */
#ifdef RUN_APPS_PAGE
hApplicationThread = CreateThread(NULL, 0, ApplicationPageRefreshThread, NULL, 0, &dwApplicationThread);
#endif
/* Refresh page */
ApplicationPageUpdate();
return TRUE;
case WM_DESTROY:
/* Close refresh thread */
#ifdef RUN_APPS_PAGE
EndLocalThread(&hApplicationThread, dwApplicationThread);
#endif
AppPageCleanup();
break;
@ -222,11 +208,7 @@ ApplicationPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
void RefreshApplicationPage(void)
{
#ifdef RUN_APPS_PAGE
/* Signal the event so that our refresh thread
* will wake up and refresh the application page */
PostThreadMessage(dwApplicationThread, WM_TIMER, 0, 0);
#endif
ApplicationPageRefreshThread(NULL);
}
void UpdateApplicationListControlViewSetting(void)
@ -245,9 +227,9 @@ void UpdateApplicationListControlViewSetting(void)
RefreshApplicationPage();
}
DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter)
DWORD WINAPI ApplicationPageRefreshThread(PVOID Parameter)
{
MSG msg;
// MSG msg;
INT i;
BOOL bItemRemoved = FALSE;
LV_ITEM item;
@ -255,14 +237,14 @@ DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter)
HIMAGELIST hImageListLarge;
HIMAGELIST hImageListSmall;
/* If we couldn't create the event then exit the thread */
while (1)
///* If we couldn't create the event then exit the thread */
//while (1)
{
/* Wait for an the event or application close */
if (GetMessage(&msg, NULL, 0, 0) <= 0)
return 0;
///* Wait for an the event or application close */
//if (GetMessage(&msg, NULL, 0, 0) <= 0)
// return 0;
if (msg.message == WM_TIMER)
//if (msg.message == WM_TIMER)
{
// FIXME: Should this be EnumDesktopWindows() instead?
noApps = TRUE;
@ -323,6 +305,8 @@ DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter)
ApplicationPageUpdate();
}
}
return 0;
}
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)

View file

@ -3,206 +3,112 @@
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: Performance Graph Meters.
* COPYRIGHT: Copyright 1999-2001 Brian Palmer <brianp@reactos.org>
* Copyright 2022 Hermès Bélusca-Maïto
*/
#include "precomp.h"
int nlastBarsUsed = 0;
WNDPROC OldGraphWndProc;
void Graph_DrawCpuUsageGraph(HDC hDC, HWND hWnd);
void Graph_DrawMemUsageGraph(HDC hDC, HWND hWnd);
void Graph_DrawMemUsageHistoryGraph(HDC hDC, HWND hWnd);
/* Snapshot of instantaneous values */
ULONGLONG Meter_CommitChargeTotal = 0;
ULONGLONG Meter_CommitChargeLimit = 0;
INT_PTR CALLBACK
Graph_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
LONG WindowId;
switch (message)
{
case WM_ERASEBKGND:
return TRUE;
/*
* Filter out mouse & keyboard messages
*/
/* case WM_APPCOMMAND: */
case WM_CAPTURECHANGED:
case WM_LBUTTONDBLCLK:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_MBUTTONDBLCLK:
case WM_MBUTTONDOWN:
case WM_MBUTTONUP:
case WM_MOUSEACTIVATE:
case WM_MOUSEHOVER:
case WM_MOUSELEAVE:
case WM_MOUSEMOVE:
/* case WM_MOUSEWHEEL: */
case WM_NCHITTEST:
case WM_NCLBUTTONDBLCLK:
case WM_NCLBUTTONDOWN:
case WM_NCLBUTTONUP:
case WM_NCMBUTTONDBLCLK:
case WM_NCMBUTTONDOWN:
case WM_NCMBUTTONUP:
/* case WM_NCMOUSEHOVER: */
/* case WM_NCMOUSELEAVE: */
case WM_NCMOUSEMOVE:
case WM_NCRBUTTONDBLCLK:
case WM_NCRBUTTONDOWN:
case WM_NCRBUTTONUP:
/* case WM_NCXBUTTONDBLCLK: */
/* case WM_NCXBUTTONDOWN: */
/* case WM_NCXBUTTONUP: */
case WM_RBUTTONDBLCLK:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
/* case WM_XBUTTONDBLCLK: */
/* case WM_XBUTTONDOWN: */
/* case WM_XBUTTONUP: */
case WM_ACTIVATE:
case WM_CHAR:
case WM_DEADCHAR:
case WM_GETHOTKEY:
case WM_HOTKEY:
case WM_KEYDOWN:
case WM_KEYUP:
case WM_KILLFOCUS:
case WM_SETFOCUS:
case WM_SETHOTKEY:
case WM_SYSCHAR:
case WM_SYSDEADCHAR:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
case WM_NCCALCSIZE:
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
WindowId = GetWindowLongPtrW(hWnd, GWLP_ID);
switch (WindowId)
{
case IDC_CPU_USAGE_GRAPH:
Graph_DrawCpuUsageGraph(hdc, hWnd);
break;
case IDC_MEM_USAGE_GRAPH:
Graph_DrawMemUsageGraph(hdc, hWnd);
break;
case IDC_MEM_USAGE_HISTORY_GRAPH:
Graph_DrawMemUsageHistoryGraph(hdc, hWnd);
break;
}
EndPaint(hWnd, &ps);
return 0;
}
/*
* Pass on all non-handled messages
*/
return CallWindowProcW(OldGraphWndProc, hWnd, message, wParam, lParam);
}
void Graph_DrawCpuUsageGraph(HDC hDC, HWND hWnd)
Graph_DrawUsageGraph(HWND hWnd, PTM_GAUGE_CONTROL gauge, WPARAM wParam, LPARAM lParam)
{
RECT rcClient;
RECT rcBarLeft;
RECT rcBarRight;
RECT rcText;
COLORREF crPrevForeground;
WCHAR Text[260];
HFONT hOldFont;
ULONG CpuUsage;
ULONG CpuKernelUsage;
int nBars;
int nBarsUsed;
/* Bottom bars that are "used", i.e. are bright green, representing used cpu time */
int nBarsUsedKernel;
/* Bottom bars that are "used", i.e. are bright green, representing used cpu kernel time */
int nBarsFree;
/* Top bars that are "unused", i.e. are dark green, representing free cpu time */
int i;
WCHAR Text[260];
/*
* Get the client area rectangle
*/
/* Total number of bars */
int nBars;
/* Bottom bars that are "used", i.e. are bright green, representing used CPU time / used memory */
int nBarsUsed = 0;
/* Bottom bars that are "used", i.e. are bright green, representing used CPU kernel time */
int nBarsUsedKernel;
/* Top bars that are "unused", i.e. are dark green, representing free CPU time / free memory */
int nBarsFree;
int i;
HDC hDC = (HDC)wParam;
/* Get the client area rectangle */
GetClientRect(hWnd, &rcClient);
/*
* Fill it with blackness
*/
/* Fill it with blackness */
FillSolidRect(hDC, &rcClient, RGB(0, 0, 0));
/*
* Get the CPU usage
*/
CpuUsage = PerfDataGetProcessorUsage();
wsprintfW(Text, L"%d%%", (int)CpuUsage);
if (gauge->bIsCPU)
{
/* Show the CPU usage */
wsprintfW(Text, L"%lu%%", gauge->Current1);
}
else
{
/* Show the memory usage */
if (Meter_CommitChargeTotal > 1024)
wsprintfW(Text, L"%lu MB", (ULONG)(Meter_CommitChargeTotal / 1024));
else
wsprintfW(Text, L"%lu K", (ULONG)Meter_CommitChargeTotal);
}
/*
* Draw the font text onto the graph
* Draw the text onto the graph
*/
rcText = rcClient;
InflateRect(&rcText, -2, -2);
crPrevForeground = SetTextColor(hDC, RGB(0, 255, 0));
crPrevForeground = SetTextColor(hDC, BRIGHT_GREEN);
hOldFont = SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT));
DrawTextW(hDC, Text, -1, &rcText, DT_BOTTOM | DT_CENTER | DT_NOPREFIX | DT_SINGLELINE);
SelectObject(hDC, hOldFont);
SetTextColor(hDC, crPrevForeground);
/*
* Draw the graph. So first find out how many bars we can fit
* Now we have to draw the graph.
* So first find out how many bars we can fit.
*/
nBars = ((rcClient.bottom - rcClient.top) - 25) / 3;
nBarsUsed = (nBars * CpuUsage) / 100;
if ((CpuUsage) && (nBarsUsed == 0))
{
nBarsUsed = (nBars * gauge->Current1) / 100;
if ((gauge->Current1 > 0) && (nBarsUsed == 0))
nBarsUsed = 1;
}
nBarsFree = nBars - (nlastBarsUsed>nBarsUsed ? nlastBarsUsed : nBarsUsed);
if (TaskManagerSettings.ShowKernelTimes)
if (gauge->bIsCPU)
{
CpuKernelUsage = PerfDataGetProcessorSystemUsage();
nBarsUsedKernel = (nBars * CpuKernelUsage) / 100;
nBarsFree = nBars - max(nBarsUsed, gauge->nlastBarsUsed);
if (TaskManagerSettings.ShowKernelTimes)
nBarsUsedKernel = (nBars * gauge->Current2) / 100;
else
nBarsUsedKernel = 0;
nBarsUsedKernel = min(max(nBarsUsedKernel, 0), nBars);
}
else
{
nBarsUsedKernel = 0;
nBarsFree = nBars - nBarsUsed;
}
nBarsUsed = min(max(nBarsUsed, 0), nBars);
nBarsFree = min(max(nBarsFree, 0), nBars);
/*
* Draw the bar graph
*/
rcBarLeft.left = ((rcClient.right - rcClient.left) - 33) / 2;
rcBarLeft.right = rcBarLeft.left + 16;
rcBarLeft.left = ((rcClient.right - rcClient.left) - 33) / 2;
rcBarLeft.right = rcBarLeft.left + 16;
rcBarRight.left = rcBarLeft.left + 17;
rcBarRight.right = rcBarLeft.right + 17;
rcBarLeft.top = rcBarRight.top = 5;
rcBarLeft.bottom = rcBarRight.bottom = 7;
if (nBarsUsed < 0) nBarsUsed = 0;
if (nBarsUsed > nBars) nBarsUsed = nBars;
if (nBarsFree < 0) nBarsFree = 0;
if (nBarsFree > nBars) nBarsFree = nBars;
if (nBarsUsedKernel < 0) nBarsUsedKernel = 0;
if (nBarsUsedKernel > nBars) nBarsUsedKernel = nBars;
/*
* Draw the "free" bars
*/
for (i=0; i<nBarsFree; i++)
for (i = 0; i < nBarsFree; i++)
{
FillSolidRect(hDC, &rcBarLeft, DARK_GREEN);
FillSolidRect(hDC, &rcBarRight, DARK_GREEN);
@ -214,31 +120,43 @@ void Graph_DrawCpuUsageGraph(HDC hDC, HWND hWnd)
rcBarRight.bottom += 3;
}
/*
* Draw the last "used" bars
*/
if ((nlastBarsUsed - nBarsUsed) > 0) {
for (i=0; i< (nlastBarsUsed - nBarsUsed); i++)
#if 1 // TEST
if (gauge->bIsCPU)
{
/*
* Draw the last "used" bars
*/
if ((gauge->nlastBarsUsed - nBarsUsed) > 0)
{
if (nlastBarsUsed > 5000) nlastBarsUsed = 5000;
for (i = 0; i < (gauge->nlastBarsUsed - nBarsUsed); i++)
{
if (gauge->nlastBarsUsed > 5000)
gauge->nlastBarsUsed = 5000;
FillSolidRect(hDC, &rcBarLeft, MEDIUM_GREEN);
FillSolidRect(hDC, &rcBarRight, MEDIUM_GREEN);
FillSolidRect(hDC, &rcBarLeft, MEDIUM_GREEN);
FillSolidRect(hDC, &rcBarRight, MEDIUM_GREEN);
rcBarLeft.top += 3;
rcBarLeft.bottom += 3;
rcBarLeft.top += 3;
rcBarLeft.bottom += 3;
rcBarRight.top += 3;
rcBarRight.bottom += 3;
rcBarRight.top += 3;
rcBarRight.bottom += 3;
}
}
gauge->nlastBarsUsed = nBarsUsed;
}
nlastBarsUsed = nBarsUsed;
/*
* Draw the "used" bars
*/
for (i=0; i<nBarsUsed; i++)
for (i = 0; i < nBarsUsed; i++)
{
if (nBarsUsed > 5000) nBarsUsed = 5000;
if (gauge->bIsCPU)
{
if (nBarsUsed > 5000)
nBarsUsed = 5000;
}
FillSolidRect(hDC, &rcBarLeft, BRIGHT_GREEN);
FillSolidRect(hDC, &rcBarRight, BRIGHT_GREEN);
@ -250,188 +168,32 @@ void Graph_DrawCpuUsageGraph(HDC hDC, HWND hWnd)
rcBarRight.bottom += 3;
}
/*
* Draw the "used" kernel bars
*/
rcBarLeft.top -=3;
rcBarLeft.bottom -=3;
rcBarRight.top -=3;
rcBarRight.bottom -=3;
for (i=0; i<nBarsUsedKernel; i++)
if (gauge->bIsCPU)
{
FillSolidRect(hDC, &rcBarLeft, RED);
FillSolidRect(hDC, &rcBarRight, RED);
/*
* Draw the "used" kernel bars
*/
rcBarLeft.top -=3;
rcBarLeft.bottom -=3;
rcBarRight.top -=3;
rcBarRight.bottom -=3;
}
SelectObject(hDC, hOldFont);
}
void Graph_DrawMemUsageGraph(HDC hDC, HWND hWnd)
{
RECT rcClient;
RECT rcBarLeft;
RECT rcBarRight;
RECT rcText;
COLORREF crPrevForeground;
WCHAR Text[260];
HFONT hOldFont;
ULONGLONG CommitChargeTotal;
ULONGLONG CommitChargeLimit;
int nBars;
int nBarsUsed = 0;
/* Bottom bars that are "used", i.e. are bright green, representing used memory */
int nBarsFree;
/* Top bars that are "unused", i.e. are dark green, representing free memory */
int i;
/*
* Get the client area rectangle
*/
GetClientRect(hWnd, &rcClient);
/*
* Fill it with blackness
*/
FillSolidRect(hDC, &rcClient, RGB(0, 0, 0));
/*
* Get the memory usage
*/
CommitChargeTotal = (ULONGLONG)PerfDataGetCommitChargeTotalK();
CommitChargeLimit = (ULONGLONG)PerfDataGetCommitChargeLimitK();
if (CommitChargeTotal > 1024)
wsprintfW(Text, L"%d MB", (int)(CommitChargeTotal / 1024));
else
wsprintfW(Text, L"%d K", (int)CommitChargeTotal);
/*
* Draw the font text onto the graph
*/
rcText = rcClient;
InflateRect(&rcText, -2, -2);
crPrevForeground = SetTextColor(hDC, RGB(0, 255, 0));
hOldFont = SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT));
DrawTextW(hDC, Text, -1, &rcText, DT_BOTTOM | DT_CENTER | DT_NOPREFIX | DT_SINGLELINE);
SelectObject(hDC, hOldFont);
SetTextColor(hDC, crPrevForeground);
/*
* Draw the graph. So first find out how many bars we can fit
*/
nBars = ((rcClient.bottom - rcClient.top) - 25) / 3;
if (CommitChargeLimit)
nBarsUsed = (nBars * (int)((CommitChargeTotal * 100) / CommitChargeLimit)) / 100;
nBarsFree = nBars - nBarsUsed;
if (nBarsUsed < 0) nBarsUsed = 0;
if (nBarsUsed > nBars) nBarsUsed = nBars;
if (nBarsFree < 0) nBarsFree = 0;
if (nBarsFree > nBars) nBarsFree = nBars;
/*
* Draw the bar graph
*/
rcBarLeft.left = ((rcClient.right - rcClient.left) - 33) / 2;
rcBarLeft.right = rcBarLeft.left + 16;
rcBarRight.left = rcBarLeft.left + 17;
rcBarRight.right = rcBarLeft.right + 17;
rcBarLeft.top = rcBarRight.top = 5;
rcBarLeft.bottom = rcBarRight.bottom = 7;
/*
* Draw the "free" bars
*/
for (i=0; i<nBarsFree; i++)
{
FillSolidRect(hDC, &rcBarLeft, DARK_GREEN);
FillSolidRect(hDC, &rcBarRight, DARK_GREEN);
rcBarLeft.top += 3;
rcBarLeft.bottom += 3;
rcBarRight.top += 3;
rcBarRight.bottom += 3;
}
/*
* Draw the "used" bars
*/
for (i=0; i<nBarsUsed; i++)
{
FillSolidRect(hDC, &rcBarLeft, BRIGHT_GREEN);
FillSolidRect(hDC, &rcBarRight, BRIGHT_GREEN);
rcBarLeft.top += 3;
rcBarLeft.bottom += 3;
rcBarRight.top += 3;
rcBarRight.bottom += 3;
}
SelectObject(hDC, hOldFont);
}
void Graph_DrawMemUsageHistoryGraph(HDC hDC, HWND hWnd)
{
RECT rcClient;
//ULONGLONG CommitChargeLimit;
int i;
static int offset = 0;
if (offset++ >= 10)
offset = 0;
/*
* Get the client area rectangle
*/
GetClientRect(hWnd, &rcClient);
/*
* Fill it with blackness
*/
FillSolidRect(hDC, &rcClient, RGB(0, 0, 0));
/*
* Get the memory usage
*/
//CommitChargeLimit = (ULONGLONG)PerfDataGetCommitChargeLimitK();
/*
* Draw the graph background and horizontal bars
*/
for (i=0; i<rcClient.bottom; i++)
{
if ((i % 11) == 0)
for (i = 0; i < nBarsUsedKernel; i++)
{
//FillSolidRect2(hDC, 0, i, rcClient.right, 1, DARK_GREEN);
FillSolidRect(hDC, &rcBarLeft, RED);
FillSolidRect(hDC, &rcBarRight, RED);
rcBarLeft.top -=3;
rcBarLeft.bottom -=3;
rcBarRight.top -=3;
rcBarRight.bottom -=3;
}
}
/*
* Draw the vertical bars
*/
for (i=11; i<rcClient.right + offset; i++)
{
if ((i % 11) == 0)
{
//FillSolidRect2(hDC, i - offset, 0, 1, rcClient.bottom, DARK_GREEN);
}
}
#endif
/*
* Draw the memory usage
*/
for (i=rcClient.right; i>=0; i--)
{
}
return 0;
}

View file

@ -3,25 +3,34 @@
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: Performance Graph Meters
* COPYRIGHT: Copyright 1999-2001 Brian Palmer <brianp@reactos.org>
* Copyright 2022 Hermès Bélusca-Maïto
*/
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#define BRIGHT_GREEN RGB(0, 255, 0)
#define MEDIUM_GREEN RGB(0, 190, 0)
#define DARK_GREEN RGB(0, 130, 0)
#define RED RGB(255, 0, 0)
typedef struct _TM_GAUGE_CONTROL
{
// HWND hParentWnd;
// HWND hWnd;
ULONG Current1; // Usage
ULONG Current2;
ULONG Maximum; // Limit
BOOL DrawSecondaryLevel;
#define BRIGHT_GREEN RGB(0, 255, 0)
#define MEDIUM_GREEN RGB(0, 190, 0)
#define DARK_GREEN RGB(0, 130, 0)
#define RED RGB(255, 0, 0)
INT nlastBarsUsed;
extern WNDPROC OldGraphWndProc;
/*** TEMP! ***/
BOOL bIsCPU; // TRUE: Gauge for CPU; FALSE: Gauge for Memory
} TM_GAUGE_CONTROL, *PTM_GAUGE_CONTROL;
INT_PTR CALLBACK Graph_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
/* Snapshot of instantaneous values */
extern ULONGLONG Meter_CommitChargeTotal;
extern ULONGLONG Meter_CommitChargeLimit;
#ifdef __cplusplus
};
#endif
INT_PTR CALLBACK
Graph_DrawUsageGraph(HWND hWnd, PTM_GAUGE_CONTROL gauge, WPARAM wParam, LPARAM lParam);

View file

@ -9,10 +9,6 @@
#include "precomp.h"
#include <math.h>
WNDPROC OldGraphCtrlWndProc;
BOOL
GraphCtrl_Create(PTM_GRAPH_CONTROL inst, HWND hWnd, HWND hParentWnd, PTM_FORMAT fmt)
{
@ -292,124 +288,38 @@ GraphCtrl_RedrawOnHeightChange(PTM_GRAPH_CONTROL inst, INT nh)
GraphCtrl_RedrawBitmap(inst, nh);
}
extern TM_GRAPH_CONTROL PerformancePageCpuUsageHistoryGraph;
extern TM_GRAPH_CONTROL PerformancePageMemUsageHistoryGraph;
extern HWND hPerformancePageCpuUsageHistoryGraph;
extern HWND hPerformancePageMemUsageHistoryGraph;
INT_PTR CALLBACK
GraphCtrl_OnSize(HWND hWnd, PTM_GRAPH_CONTROL graph, WPARAM wParam, LPARAM lParam)
{
#if 0
RECT rcClient;
GetClientRect(hWnd, &rcClient);
// rcClient.bottom - rcClient.top is the sought new height.
#endif
if (HIWORD(lParam) != graph->BitmapHeight)
{
GraphCtrl_RedrawOnHeightChange(graph, HIWORD(lParam));
}
InvalidateRect(hWnd, NULL, FALSE);
return 0;
}
INT_PTR CALLBACK
GraphCtrl_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
GraphCtrl_OnDraw(HWND hWnd, PTM_GRAPH_CONTROL graph, WPARAM wParam, LPARAM lParam)
{
PTM_GRAPH_CONTROL graph;
RECT rcClient;
HDC hdc = (HDC)wParam;
switch (message)
{
case WM_ERASEBKGND:
return TRUE;
/*
* Filter out mouse & keyboard messages
*/
// case WM_APPCOMMAND:
case WM_CAPTURECHANGED:
case WM_LBUTTONDBLCLK:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_MBUTTONDBLCLK:
case WM_MBUTTONDOWN:
case WM_MBUTTONUP:
case WM_MOUSEACTIVATE:
case WM_MOUSEHOVER:
case WM_MOUSELEAVE:
case WM_MOUSEMOVE:
// case WM_MOUSEWHEEL:
case WM_NCHITTEST:
case WM_NCLBUTTONDBLCLK:
case WM_NCLBUTTONDOWN:
case WM_NCLBUTTONUP:
case WM_NCMBUTTONDBLCLK:
case WM_NCMBUTTONDOWN:
case WM_NCMBUTTONUP:
// case WM_NCMOUSEHOVER:
// case WM_NCMOUSELEAVE:
case WM_NCMOUSEMOVE:
case WM_NCRBUTTONDBLCLK:
case WM_NCRBUTTONDOWN:
case WM_NCRBUTTONUP:
// case WM_NCXBUTTONDBLCLK:
// case WM_NCXBUTTONDOWN:
// case WM_NCXBUTTONUP:
case WM_RBUTTONDBLCLK:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
// case WM_XBUTTONDBLCLK:
// case WM_XBUTTONDOWN:
// case WM_XBUTTONUP:
case WM_ACTIVATE:
case WM_CHAR:
case WM_DEADCHAR:
case WM_GETHOTKEY:
case WM_HOTKEY:
case WM_KEYDOWN:
case WM_KEYUP:
case WM_KILLFOCUS:
case WM_SETFOCUS:
case WM_SETHOTKEY:
case WM_SYSCHAR:
case WM_SYSDEADCHAR:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
return 0;
GetClientRect(hWnd, &rcClient);
BitBlt(hdc, 0, 0,
rcClient.right,
rcClient.bottom,
graph->hdcGraph,
graph->BitmapWidth - rcClient.right,
0,
SRCCOPY);
case WM_NCCALCSIZE:
return 0;
case WM_SIZE:
{
if (hWnd == hPerformancePageCpuUsageHistoryGraph)
graph = &PerformancePageCpuUsageHistoryGraph;
else if (hWnd == hPerformancePageMemUsageHistoryGraph)
graph = &PerformancePageMemUsageHistoryGraph;
else
return 0;
if (HIWORD(lParam) != graph->BitmapHeight)
{
GraphCtrl_RedrawOnHeightChange(graph, HIWORD(lParam));
}
InvalidateRect(hWnd, NULL, FALSE);
return 0;
}
case WM_PAINT:
{
RECT rcClient;
HDC hdc;
PAINTSTRUCT ps;
if (hWnd == hPerformancePageCpuUsageHistoryGraph)
graph = &PerformancePageCpuUsageHistoryGraph;
else if (hWnd == hPerformancePageMemUsageHistoryGraph)
graph = &PerformancePageMemUsageHistoryGraph;
else
return 0;
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rcClient);
BitBlt(hdc, 0, 0,
rcClient.right,
rcClient.bottom,
graph->hdcGraph,
graph->BitmapWidth - rcClient.right,
0,
SRCCOPY);
EndPaint(hWnd, &ps);
return 0;
}
}
/*
* We pass on all non-handled messages
*/
return CallWindowProcW(OldGraphCtrlWndProc, hWnd, message, wParam, lParam);
return 0;
}

View file

@ -12,10 +12,6 @@
#define NUM_PLOTS 2
#define PLOT_SHIFT 2
#ifdef __cplusplus
extern "C" {
#endif
typedef struct _TM_GRAPH_CONTROL
{
HWND hParentWnd;
@ -54,15 +50,11 @@ typedef struct _TM_FORMAT
}
TM_FORMAT, *PTM_FORMAT;
extern WNDPROC OldGraphCtrlWndProc;
INT_PTR CALLBACK GraphCtrl_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK GraphCtrl_OnSize(HWND hWnd, PTM_GRAPH_CONTROL graph, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK GraphCtrl_OnDraw(HWND hWnd, PTM_GRAPH_CONTROL graph, WPARAM wParam, LPARAM lParam);
BOOL GraphCtrl_Create(PTM_GRAPH_CONTROL inst, HWND hWnd, HWND hParentWnd, PTM_FORMAT fmt);
void GraphCtrl_Dispose(PTM_GRAPH_CONTROL inst);
void GraphCtrl_AddPoint(PTM_GRAPH_CONTROL inst, BYTE val0, BYTE val1);
void GraphCtrl_RedrawOnHeightChange(PTM_GRAPH_CONTROL inst, INT nh);
void GraphCtrl_RedrawBitmap(PTM_GRAPH_CONTROL inst, INT h);
#ifdef __cplusplus
}
#endif

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Дневник на ЦПУ", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Дневник на паметта", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Показване заетостта на паметта", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Дневник на ЦПУ", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Дневник на паметта", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Показване заетостта на паметта", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Дневник на ЦПУ", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Дневник на паметта", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Historie využití CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Historie využití paměti", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Zobrazení využití CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Zobrazení využití paměti", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historie využití CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historie využití paměti", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Zobrazení využití CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Zobrazení využití paměti", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historie využití CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historie využití paměti", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU Usage History", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "MEM Hukommelses Forbrug Historik", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU Forbrug Visning", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Hukommelses Forbrug Visning", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Forbrug Historik", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Hukommelses Forbrug Historik", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Forbrug Visning", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Hukommelses Forbrug Visning", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Forbrug Historik", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Hukommelses Forbrug Historik", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,12 +224,12 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
EDITTEXT IDC_KERNEL_MEMORY_NONPAGED, 192, 193, 45, 8, ES_RIGHT | ES_READONLY |
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU-Lastverlauf", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Speicher-Lastverlauf", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU-Lastanzeige", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Speicher-Lastanzeige", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU-Lastverlaufsanzeige", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Speicher-Lastverlaufsanzeige", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
GROUPBOX "Verlauf der CPU-Auslastung", IDC_CPU_USAGE_HISTORY_FRAME, 76, 5, 166, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Verlauf der Auslagerungsdateiauslastung", IDC_MEMORY_USAGE_HISTORY_FRAME, 76, 63, 166, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU-Auslastungsanzeige", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Auslagerungsdateiauslastungsanzeige", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU-Auslastungsverlaufsanzeige", IDC_CPU_USAGE_HISTORY_GRAPH, 82, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Auslagerungsdateiauslastungs-Verlaufsanzeige", IDC_MEM_USAGE_HISTORY_GRAPH, 82, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU Usage History", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Memory Usage History", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage Display", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Usage History", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage History", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage Display", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Usage History", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage History", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU Usage History", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Memory Usage History", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage Display", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Usage History", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage History", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage Display", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Usage History", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage History", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Historial de uso de CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Historial de uso de memoria física", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Gráfico de uso de CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Gráfico de uso de memoria", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historial de uso de CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historial de uso de memoria", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Gráfico de uso de CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Gráfico de uso de memoria", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historial de uso de CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historial de uso de memoria", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -230,10 +230,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU hõivatuse ajalugu", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Füüsilise mälu hõivatuse ajalugu", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU hõivatuse kuva", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Füüsilise mälu hõivatuse kuva", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU hõivatuse ajalugu", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Füüsilise mälu hõivatuse ajalugu", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU hõivatuse kuva", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Füüsilise mälu hõivatuse kuva", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU hõivatuse ajalugu", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Füüsilise mälu hõivatuse ajalugu", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Historique de l'utilisation de l'UC", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Historique d'utilisation de la mémoire", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Affichage de l'utilisation de l'UC", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Affichage de l'utilisation du fichier d'échange", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historique de l'utilisation de l'UC", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historique d'utilisation du fichier d'échange", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Affichage de l'utilisation de l'UC", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Affichage de l'utilisation du fichier d'échange", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historique de l'utilisation de l'UC", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historique d'utilisation du fichier d'échange", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "היסטורית שימוש במעבד", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "היסטורית שימוש בזיכרון", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage Display", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "היסטורית שימוש במעבד", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "היסטורית שימוש בזיכרון", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage Display", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "היסטורית שימוש במעבד", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "היסטורית שימוש בזיכרון", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU használat", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Memória használat", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU használat megjelenítése", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Memória használat megjelenítése", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU használata", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Memória használata", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU használat megjelenítése", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Memória használat megjelenítése", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU használata", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Memória használata", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Riwayat Pemakaian CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Riwayat Pemakaian MEM", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Tampilan Pemakaian CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Tampilan Pemakaian MEM", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Riwayat Pemakaian CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Riwayat Pemakaian MEM", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Tampilan Pemakaian CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Tampilan Pemakaian MEM", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Riwayat Pemakaian CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Riwayat Pemakaian MEM", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Storico uso CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Storico uso Memoria", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Visualizzazione uso CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Visualizzazione uso MEM", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Storico uso CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Storico uso MEM", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Visualizzazione uso CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Visualizzazione uso MEM", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Storico uso CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Storico uso MEM", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU 使用率の履歴", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "メモリ使用量の履歴", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU 使用率の表示", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "メモリ使用量の表示", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU 使用率の履歴", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "メモリ使用量の履歴", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU 使用率の表示", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "メモリ使用量の表示", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU 使用率の履歴", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "メモリ使用量の履歴", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU 사용 기록", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "메모리 사용 기록", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU 사용 표시", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "메모리 사용 표시", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU 사용 기록", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "메모리 사용 기록", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU 사용 표시", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "메모리 사용 표시", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU 사용 기록", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "메모리 사용 기록", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Geschiedenis van CPU gebruik", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Geschiedenis van wisselbestandsgebruik", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Weergave van CPU-gebruik", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Weergave van wisselbestandsgebruik", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Geschiedenis van CPU gebruik", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Geschiedenis van wisselbestandsgebruik", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Weergave van CPU-gebruik", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Weergave van wisselbestandsgebruik", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Geschiedenis van CPU gebruik", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Geschiedenis van wisselbestandsgebruik", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Logg for bruk av prosessor", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Logg for bruk av fysisk minne", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Vis prosessorbruk", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Vis minnebruk", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Logg for prosessorbruk", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Minne bruk historie", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Vis prosessorbruk", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Vis minnebruk", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Logg for prosessorbruk", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Minne bruk historie", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -229,10 +229,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Historia użycia procesora CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Historia uzycia pliku stronicowania MEM", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Wyświetl użycie procesora", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Wyświetl zużycie pamięci", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historia użycia procesora", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historia zużycia pamięci", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Wyświetl użycie procesora", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Wyświetl zużycie pamięci", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historia użycia procesora", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historia zużycia pamięci", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Histórico de uso de CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Histórico de uso de Memoria", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage Display", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Usage History", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage History", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Usage Display", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage Display", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Usage History", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "MEM Usage History", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Histórico de uso de CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Histórico de uso de Memoria", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Mostra o uso da CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Mostra o uso da RAM", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Histórico de uso da CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Histórico de uso da memória RAM", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Mostra o uso da CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Mostra o uso da RAM", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Histórico de uso da CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Histórico de uso da memória RAM", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -233,10 +233,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Istoric utilizare CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Istoric utilizare memorie", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Afișare utilizare CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Afișare utilizare memorie", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Afișare istoric utlizare procesor", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Afișare istoric utlizare memorie", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Afișare utilizare CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Afișare utilizare memorie", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Afișare istoric utilizare procesor", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Afișare istoric utilizare memorie", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Хронология загрузки ЦП", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Хронология использования файла подкачки", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Отображение загрузки ЦП", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Отображение использования памяти", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Хронология загрузки ЦП", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Хронология использования памяти", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Отображение загрузки ЦП", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Отображение использования памяти", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Хронология загрузки ЦП", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Хронология использования памяти", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "História využitia procesora", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "História využitia stránkovacieho súboru", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Zobrazenie využitia procesora", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Zobrazenie využitia pamäte", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "História využitia procesora", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "História využitia pamäte", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Zobrazenie využitia procesora", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Zobrazenie využitia pamäte", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "História využitia procesora", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "História využitia pamäte", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 270, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Historia e perdorimit CPU", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Historia e perdorimit Memories", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Shfaq perdorimin e CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Shfaq perdorimin e MEM", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historia e perdorimit CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historia e perdorimit MEM", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Shfaq perdorimin e CPU", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Shfaq perdorimin e MEM", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historia e perdorimit CPU", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Historia e perdorimit MEM", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Processorhistorik", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Minneshistorik", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Processoranvändning", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Minnesanvändning", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Processorhistorik", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Minneshistorik", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Processoranvändning", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Minnesanvändning", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Processorhistorik", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Minneshistorik", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -226,10 +226,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU Kullanım Geçmişi", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Bellek Kullanım Geçmişi", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU Kullanım Grafiği", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Bellek Kullanım Grafiği", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Kullanım Geçmişi Grafiği", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Bellek Kullanım Geçmişi Grafiği", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Kullanım Grafiği", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Bellek Kullanım Grafiği", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU Kullanım Geçmişi Grafiği", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Bellek Kullanım Geçmişi Grafiği", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -224,10 +224,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "Хронологія використання ЦП", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "Хронологія використання пам'яті", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "Відображення використання ЦП", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Відображення використання пам'яті", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Хронологія використання ЦП", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Хронологія використання пам'яті", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Відображення використання ЦП", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Відображення використання пам'яті", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Хронологія використання ЦП", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "Хронологія використання пам'яті", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -227,10 +227,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU 使用记录", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "内存使用记录", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU 使用情况显示", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "内存使用情况显示", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU 使用记录", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "内存使用记录", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU 使用情况显示", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "内存使用情况显示", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU 使用记录", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "内存使用记录", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -232,10 +232,10 @@ BEGIN
ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP
GROUPBOX "CPU 使用記錄", IDC_CPU_USAGE_HISTORY_FRAME, 74, 5, 168, 54, 0, WS_EX_TRANSPARENT
GROUPBOX "記憶體使用記錄", IDC_MEMORY_USAGE_HISTORY_FRAME, 74, 63, 168, 54, 0, WS_EX_TRANSPARENT
PUSHBUTTON "CPU 使用情況顯示", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "記憶體使用情況顯示", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU 使用記錄", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "記憶體使用記錄", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU 使用情況顯示", IDC_CPU_USAGE_GRAPH, 12, 17, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "記憶體使用情況顯示", IDC_MEM_USAGE_GRAPH, 12, 75, 47, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "CPU 使用記錄", IDC_CPU_USAGE_HISTORY_GRAPH, 81, 17, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
PUSHBUTTON "記憶體使用記錄", IDC_MEM_USAGE_HISTORY_GRAPH, 81, 75, 153, 37, BS_OWNERDRAW | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
END
IDD_AFFINITY_DIALOG DIALOGEX 0, 0, 231, 154

View file

@ -15,22 +15,32 @@
#include <ndk/psfuncs.h>
#include <ndk/exfuncs.h>
CRITICAL_SECTION PerfDataCriticalSection;
PPERFDATA pPerfDataOld = NULL; /* Older perf data (saved to establish delta values) */
PPERFDATA pPerfData = NULL; /* Most recent copy of perf data */
ULONG ProcessCountOld = 0;
ULONG ProcessCount = 0;
double dbIdleTime;
double dbKernelTime;
double dbSystemTime;
LARGE_INTEGER liOldIdleTime = {{0,0}};
double OldKernelTime = 0;
LARGE_INTEGER liOldSystemTime = {{0,0}};
SYSTEM_PERFORMANCE_INFORMATION SystemPerfInfo;
CRITICAL_SECTION PerfDataCriticalSection;
PPERFDATA pPerfDataOld = NULL; /* Older perf data (saved to establish delta values) */
PPERFDATA pPerfData = NULL; /* Most recent copy of perf data */
ULONG ProcessCountOld = 0;
ULONG ProcessCount = 0;
typedef struct _CPU_TIMES
{
double dbIdleTime;
double dbKernelTime;
LARGE_INTEGER OldIdleTime;
LARGE_INTEGER OldKernelTime;
} CPU_TIMES, *PCPU_TIMES;
static PCPU_TIMES ProcessorTimes = NULL;
static CPU_TIMES ProcessorMeanTimes = {0};
double dbSystemTime;
LARGE_INTEGER OldSystemTime = {{0,0}};
SYSTEM_BASIC_INFORMATION SystemBasicInfo;
SYSTEM_FILECACHE_INFORMATION SystemCacheInfo;
ULONG SystemNumberOfHandles;
PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION SystemProcessorTimeInfo = NULL;
SYSTEM_PERFORMANCE_INFORMATION SystemPerfInfo = {0};
SYSTEM_FILECACHE_INFORMATION SystemCacheInfo = {0};
ULONG SystemNumberOfHandles = 0;
PSID SystemUserSid = NULL;
PCMD_LINE_CACHE global_cache = NULL;
@ -46,38 +56,71 @@ typedef struct _SIDTOUSERNAME
static LIST_ENTRY SidToUserNameHead = {&SidToUserNameHead, &SidToUserNameHead};
BOOL PerfDataInitialize(void)
/*static*/ VOID
__cdecl
_DiagError(
_In_ PCWSTR Format,
...)
{
va_list args;
WCHAR Buffer[1024];
va_start(args, Format);
StringCbVPrintfW(Buffer, sizeof(Buffer), Format, args);
va_end(args);
MessageBoxW(NULL, Buffer, L"Error", MB_ICONERROR | MB_OK);
}
BOOL PerfDataInitialize(VOID)
{
SID_IDENTIFIER_AUTHORITY NtSidAuthority = {SECURITY_NT_AUTHORITY};
NTSTATUS status;
NTSTATUS status;
ULONG BufferSize;
InitializeCriticalSection(&PerfDataCriticalSection);
/*
* Get number of processors in the system
*/
/* Retrieve basic system information, including the number of processors in the system */
status = NtQuerySystemInformation(SystemBasicInformation, &SystemBasicInfo, sizeof(SystemBasicInfo), NULL);
if (!NT_SUCCESS(status))
{
// ZeroMemory(&SystemBasicInfo, sizeof(SystemBasicInfo));
return FALSE;
}
/*
* Create the SYSTEM Sid
*/
/* Allocate the array for per-processor time information */
// TODO: For supporting more CPUs, see e.g.
// https://github.com/processhacker/processhacker/commit/8b3a09f99d06e45df64bfee2ce4c91d7c02b8b3d
// but this should be Win7+.
BufferSize = sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * SystemBasicInfo.NumberOfProcessors;
SystemProcessorTimeInfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, BufferSize);
/* Allocate an array for per-CPU times. If allocation fails (e.g.
* low memory resources), use the mean times instead. */
ProcessorTimes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(CPU_TIMES) * SystemBasicInfo.NumberOfProcessors);
if (!ProcessorTimes)
ProcessorTimes = &ProcessorMeanTimes;
/* Create the SYSTEM Sid */
AllocateAndInitializeSid(&NtSidAuthority, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &SystemUserSid);
return TRUE;
}
void PerfDataUninitialize(void)
VOID PerfDataUninitialize(VOID)
{
PLIST_ENTRY pCur;
PSIDTOUSERNAME pEntry;
if (pPerfData != NULL)
if (pPerfData)
{
HeapFree(GetProcessHeap(), 0, pPerfData);
pPerfData = NULL;
}
DeleteCriticalSection(&PerfDataCriticalSection);
if (SystemUserSid != NULL)
if (SystemUserSid)
{
FreeSid(SystemUserSid);
SystemUserSid = NULL;
@ -92,12 +135,24 @@ void PerfDataUninitialize(void)
HeapFree(GetProcessHeap(), 0, pEntry);
}
if (SystemProcessorTimeInfo) {
if (ProcessorTimes && (ProcessorTimes != &ProcessorMeanTimes))
{
HeapFree(GetProcessHeap(), 0, ProcessorTimes);
ProcessorTimes = NULL;
}
if (SystemProcessorTimeInfo)
{
HeapFree(GetProcessHeap(), 0, SystemProcessorTimeInfo);
SystemProcessorTimeInfo = NULL;
}
}
static void SidToUserName(PSID Sid, LPWSTR szBuffer, DWORD BufferSize)
static VOID
SidToUserName(
_In_ PSID Sid,
_Out_ LPWSTR szBuffer,
_In_ DWORD BufferSize)
{
static WCHAR szDomainNameUnused[255];
DWORD DomainNameLen = _countof(szDomainNameUnused);
@ -107,12 +162,13 @@ static void SidToUserName(PSID Sid, LPWSTR szBuffer, DWORD BufferSize)
LookupAccountSidW(NULL, Sid, szBuffer, &BufferSize, szDomainNameUnused, &DomainNameLen, &Use);
}
/* Should be from utildll.dll */
VOID
WINAPI
CachedGetUserFromSid(
PSID pSid,
LPWSTR pUserName,
PULONG pcwcUserName)
_In_ PSID pSid,
_Out_ LPWSTR pUserName,
_Inout_ PULONG pcwcUserName)
{
PLIST_ENTRY pCur;
PSIDTOUSERNAME pEntry;
@ -121,9 +177,9 @@ CachedGetUserFromSid(
cwcUserName = *pcwcUserName;
/* Walk through the list */
for(pCur = SidToUserNameHead.Flink;
pCur != &SidToUserNameHead;
pCur = pCur->Flink)
for (pCur = SidToUserNameHead.Flink;
pCur != &SidToUserNameHead;
pCur = pCur->Flink)
{
pEntry = CONTAINING_RECORD(pCur, SIDTOUSERNAME, List);
if (EqualSid((PSID)&pEntry->Data, pSid))
@ -149,73 +205,93 @@ CachedGetUserFromSid(
wcsncpy(pEntry->pszName, pUserName, cwcUserName);
/* Insert the new entry */
// InsertHeadList();
pEntry->List.Flink = &SidToUserNameHead;
pEntry->List.Blink = SidToUserNameHead.Blink;
SidToUserNameHead.Blink->Flink = &pEntry->List;
SidToUserNameHead.Blink = &pEntry->List;
}
void PerfDataRefresh(void)
VOID PerfDataRefresh(VOID)
{
ULONG ulSize;
NTSTATUS status;
LPBYTE pBuffer;
ULONG BufferSize;
PSYSTEM_PROCESS_INFORMATION pSPI;
PPERFDATA pPDOld;
ULONG Idx, Idx2;
HANDLE hProcess;
HANDLE hProcessToken;
SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
SYSTEM_TIMEOFDAY_INFORMATION SysTimeInfo;
SYSTEM_FILECACHE_INFORMATION SysCacheInfo;
SYSTEM_HANDLE_INFORMATION SysHandleInfoData;
PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION SysProcessorTimeInfo;
double CurrentKernelTime;
PSECURITY_DESCRIPTOR ProcessSD;
PSID ProcessUser;
ULONG Buffer[64]; /* must be 4 bytes aligned! */
ULONG cwcUserName;
ULONG ulSize;
NTSTATUS status;
LPBYTE pBuffer;
ULONG BufferSize;
PSYSTEM_PROCESS_INFORMATION pSPI;
PPERFDATA pPDOld;
ULONG Idx, Idx2;
HANDLE hProcess;
HANDLE hProcessToken;
SYSTEM_TIMEOFDAY_INFORMATION SysTimeInfo = {0};
#if (NTDDI_VERSION < NTDDI_WIN7)
/* Larger on Win2k8/Win7 */
DECLSPEC_ALIGN(8) BYTE SysPerfInfoData[sizeof(SYSTEM_PERFORMANCE_INFORMATION) + 16] = {0};
#else
SYSTEM_PERFORMANCE_INFORMATION SysPerfInfoData = {0};
#endif
PSYSTEM_PERFORMANCE_INFORMATION pSysPerfInfo = (PSYSTEM_PERFORMANCE_INFORMATION)SysPerfInfoData;
SYSTEM_FILECACHE_INFORMATION SysCacheInfo = {0};
SYSTEM_HANDLE_INFORMATION SysHandleInfo = {0};
LARGE_INTEGER CurrentIdleTime, MeanIdleTime;
LARGE_INTEGER CurrentKernelTime, MeanKernelTime;
LARGE_INTEGER liCurrentTime;
PSECURITY_DESCRIPTOR ProcessSD;
PSID ProcessUser;
ULONG Buffer[64]; /* Must be 4 bytes aligned! */
ULONG cwcUserName;
/*
* Retrieve several pieces of system information.
*
* Retrieval may sometimes fail, either because we are actually interested
* only in partial information (e.g. SystemHandleInformation), or because
* we are low in memory resources, or because of (Windows 7 WOW64-only) bugs
* (see below). In any of these cases, we try to fallback to sane values,
* and continue retrieving other information.
*/
/* Get new system time */
status = NtQuerySystemInformation(SystemTimeOfDayInformation, &SysTimeInfo, sizeof(SysTimeInfo), NULL);
if (!NT_SUCCESS(status))
return;
SysTimeInfo.CurrentTime = OldSystemTime;
/* Get new CPU's idle time */
status = NtQuerySystemInformation(SystemPerformanceInformation, &SysPerfInfo, sizeof(SysPerfInfo), NULL);
/*
* Get general system performance info.
*
* The SYSTEM_PERFORMANCE_INFORMATION structure's size increased in Win7+.
* NtQuerySystemInformation(SystemPerformanceInformation) also supports its
* older version by filling in as much of the whole structure as possible,
* and returns STATUS_SUCCESS. However, Windows 7 x64 WOW64 has a bug, in
* wow64.dll!whNtQuerySystemInformation_SystemPerformanceInformation(),
* that fails to handle the different structures sizes, only supporting
* the largest possible one, and fails if the structure uses its legacy
* size (no data is copied, and STATUS_INFO_LENGTH_MISMATCH is returned).
* This problem thus happens only for 32-bit compiled code, but does not
* happen with native 64-bit compiled code. This problems does not happen
* on 32-bit Windows 7.
*/
// ZeroMemory(&SysPerfInfoData, sizeof(SysPerfInfoData));
status = NtQuerySystemInformation(SystemPerformanceInformation, &SysPerfInfoData, sizeof(SysPerfInfoData), NULL);
if (!NT_SUCCESS(status))
return;
*pSysPerfInfo = SystemPerfInfo;
/* Get system cache information */
status = NtQuerySystemInformation(SystemFileCacheInformation, &SysCacheInfo, sizeof(SysCacheInfo), NULL);
if (!NT_SUCCESS(status))
return;
SysCacheInfo = SystemCacheInfo;
/* Get processor time information */
SysProcessorTimeInfo = (PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)HeapAlloc(GetProcessHeap(), 0, sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * SystemBasicInfo.NumberOfProcessors);
status = NtQuerySystemInformation(SystemProcessorPerformanceInformation, SysProcessorTimeInfo, sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * SystemBasicInfo.NumberOfProcessors, &ulSize);
/* Get handle information. Number of handles is enough, no need for data array. */
status = NtQuerySystemInformation(SystemHandleInformation, &SysHandleInfo, sizeof(SysHandleInfo), NULL);
if (!NT_SUCCESS(status) && (status != STATUS_INFO_LENGTH_MISMATCH))
SysHandleInfo.NumberOfHandles = SystemNumberOfHandles;
if (!NT_SUCCESS(status))
{
if (SysProcessorTimeInfo != NULL)
HeapFree(GetProcessHeap(), 0, SysProcessorTimeInfo);
return;
}
/* Get handle information
* Number of handles is enough, no need for data array.
*/
status = NtQuerySystemInformation(SystemHandleInformation, &SysHandleInfoData, sizeof(SysHandleInfoData), NULL);
/* On unexpected error, reuse previous value.
* STATUS_SUCCESS (0-1 handle) should never happen.
*/
if (status != STATUS_INFO_LENGTH_MISMATCH)
SysHandleInfoData.NumberOfHandles = SystemNumberOfHandles;
/* Get process information
/* Get process information.
* We don't know how much data there is so just keep
* increasing the buffer size until the call succeeds
* increasing the buffer size until the call succeeds.
*/
BufferSize = 0;
do
@ -224,110 +300,170 @@ void PerfDataRefresh(void)
pBuffer = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, BufferSize);
status = NtQuerySystemInformation(SystemProcessInformation, pBuffer, BufferSize, &ulSize);
if (status == STATUS_INFO_LENGTH_MISMATCH) {
if (status == STATUS_INFO_LENGTH_MISMATCH)
HeapFree(GetProcessHeap(), 0, pBuffer);
}
} while (status == STATUS_INFO_LENGTH_MISMATCH);
EnterCriticalSection(&PerfDataCriticalSection);
/*
* Save system performance info
*/
memcpy(&SystemPerfInfo, &SysPerfInfo, sizeof(SYSTEM_PERFORMANCE_INFORMATION));
/* Save system performance, cache, and handle information */
SystemPerfInfo = *pSysPerfInfo;
SystemCacheInfo = SysCacheInfo;
SystemNumberOfHandles = SysHandleInfo.NumberOfHandles;
/*
* Save system cache info
*/
memcpy(&SystemCacheInfo, &SysCacheInfo, sizeof(SYSTEM_FILECACHE_INFORMATION));
/*
* Save system processor time info
*/
if (SystemProcessorTimeInfo) {
HeapFree(GetProcessHeap(), 0, SystemProcessorTimeInfo);
/* If it's a first call, skip idle time calcs */
if (OldSystemTime.QuadPart != 0)
{
liCurrentTime.QuadPart = SysTimeInfo.CurrentTime.QuadPart - OldSystemTime.QuadPart;
dbSystemTime = Li2Double(liCurrentTime);
}
SystemProcessorTimeInfo = SysProcessorTimeInfo;
/* Store the system time */
OldSystemTime = SysTimeInfo.CurrentTime;
/*
* Save system handle info
*/
SystemNumberOfHandles = SysHandleInfoData.NumberOfHandles;
for (CurrentKernelTime=0, Idx=0; Idx<(ULONG)SystemBasicInfo.NumberOfProcessors; Idx++) {
CurrentKernelTime += Li2Double(SystemProcessorTimeInfo[Idx].KernelTime);
CurrentKernelTime += Li2Double(SystemProcessorTimeInfo[Idx].DpcTime);
CurrentKernelTime += Li2Double(SystemProcessorTimeInfo[Idx].InterruptTime);
/* Get system processor time information. In case of failure, keep the old data. */
ulSize = sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * SystemBasicInfo.NumberOfProcessors;
status = NtQuerySystemInformation(SystemProcessorPerformanceInformation,
SystemProcessorTimeInfo,
ulSize,
NULL);
if (!NT_SUCCESS(status))
{
/* Keep the same data as before */
// ZeroMemory(SystemProcessorTimeInfo, ulSize);
}
/* If it's a first call - skip idle time calcs */
if (liOldIdleTime.QuadPart != 0) {
/* CurrentValue = NewValue - OldValue */
dbIdleTime = Li2Double(SysPerfInfo.IdleProcessTime) - Li2Double(liOldIdleTime);
dbKernelTime = CurrentKernelTime - OldKernelTime;
dbSystemTime = Li2Double(SysTimeInfo.CurrentTime) - Li2Double(liOldSystemTime);
MeanIdleTime.QuadPart = 0;
MeanKernelTime.QuadPart = 0;
for (Idx = 0; Idx < SystemBasicInfo.NumberOfProcessors; Idx++)
{
/* IDLE Time */
CurrentIdleTime = SystemProcessorTimeInfo[Idx].IdleTime;
/* CurrentCpuIdle = IdleTime / SystemTime */
dbIdleTime = dbIdleTime / dbSystemTime;
dbKernelTime = dbKernelTime / dbSystemTime;
/* Kernel Time */
CurrentKernelTime = SystemProcessorTimeInfo[Idx].KernelTime;
CurrentKernelTime.QuadPart += SystemProcessorTimeInfo[Idx].DpcTime.QuadPart;
CurrentKernelTime.QuadPart += SystemProcessorTimeInfo[Idx].InterruptTime.QuadPart;
/* CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors */
dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SystemBasicInfo.NumberOfProcessors; /* + 0.5; */
dbKernelTime = 100.0 - dbKernelTime * 100.0 / (double)SystemBasicInfo.NumberOfProcessors; /* + 0.5; */
/* Save the per-CPU times */
if (ProcessorTimes != &ProcessorMeanTimes)
{
/* If it's a first call, skip idle time calcs */
if (ProcessorMeanTimes.OldIdleTime.QuadPart != 0)
{
/* CurrentValue = NewValue - OldValue */
liCurrentTime.QuadPart = CurrentIdleTime.QuadPart;
liCurrentTime.QuadPart -= ProcessorTimes[Idx].OldIdleTime.QuadPart;
ProcessorTimes[Idx].dbIdleTime = Li2Double(liCurrentTime);
liCurrentTime.QuadPart = CurrentKernelTime.QuadPart;
liCurrentTime.QuadPart -= ProcessorTimes[Idx].OldKernelTime.QuadPart;
ProcessorTimes[Idx].dbKernelTime = Li2Double(liCurrentTime);
/* CurrentCpuIdle = IdleTime / SystemTime */
ProcessorTimes[Idx].dbIdleTime /= dbSystemTime;
ProcessorTimes[Idx].dbKernelTime /= dbSystemTime;
/* CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) */
ProcessorTimes[Idx].dbIdleTime =
100.0 - ProcessorTimes[Idx].dbIdleTime * 100.0; /* + 0.5; */
ProcessorTimes[Idx].dbKernelTime =
100.0 - ProcessorTimes[Idx].dbKernelTime * 100.0; /* + 0.5; */
/* Sanitize the values (percentages between 0 and 100) */
ProcessorTimes[Idx].dbIdleTime = min(max(ProcessorTimes[Idx].dbIdleTime, 0.), 100.);
ProcessorTimes[Idx].dbKernelTime = min(max(ProcessorTimes[Idx].dbKernelTime, 0.), 100.);
}
/* Store new CPU's idle and kernel times */
ProcessorTimes[Idx].OldIdleTime = CurrentIdleTime;
ProcessorTimes[Idx].OldKernelTime = CurrentKernelTime;
}
/* Calculate the mean values as well */
MeanIdleTime.QuadPart += CurrentIdleTime.QuadPart;
MeanKernelTime.QuadPart += CurrentKernelTime.QuadPart;
}
/* Store new CPU's idle and system time */
liOldIdleTime = SysPerfInfo.IdleProcessTime;
liOldSystemTime = SysTimeInfo.CurrentTime;
OldKernelTime = CurrentKernelTime;
/* If it's a first call, skip idle time calcs */
if (ProcessorMeanTimes.OldIdleTime.QuadPart != 0)
{
/* CurrentValue = NewValue - OldValue */
liCurrentTime.QuadPart = MeanIdleTime.QuadPart - ProcessorMeanTimes.OldIdleTime.QuadPart;
ProcessorMeanTimes.dbIdleTime = Li2Double(liCurrentTime);
/* Determine the process count
liCurrentTime.QuadPart = MeanKernelTime.QuadPart - ProcessorMeanTimes.OldKernelTime.QuadPart;
ProcessorMeanTimes.dbKernelTime = Li2Double(liCurrentTime);
/* CurrentCpuIdle = IdleTime / SystemTime */
ProcessorMeanTimes.dbIdleTime /= dbSystemTime;
ProcessorMeanTimes.dbKernelTime /= dbSystemTime;
/* CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors */
ProcessorMeanTimes.dbIdleTime =
100.0 - ProcessorMeanTimes.dbIdleTime * 100.0 / (double)SystemBasicInfo.NumberOfProcessors; /* + 0.5; */
ProcessorMeanTimes.dbKernelTime =
100.0 - ProcessorMeanTimes.dbKernelTime * 100.0 / (double)SystemBasicInfo.NumberOfProcessors; /* + 0.5; */
/* Sanitize the values (percentages between 0 and 100) */
ProcessorMeanTimes.dbIdleTime = min(max(ProcessorMeanTimes.dbIdleTime, 0.), 100.);
ProcessorMeanTimes.dbKernelTime = min(max(ProcessorMeanTimes.dbKernelTime, 0.), 100.);
}
/* Store the mean CPU times */
ProcessorMeanTimes.OldIdleTime = MeanIdleTime;
ProcessorMeanTimes.OldKernelTime = MeanKernelTime;
/* Determine the process count.
* We loop through the data we got from NtQuerySystemInformation
* and count how many structures there are (until RelativeOffset is 0)
* and count how many structures there are (until NextEntryOffset is 0)
*/
ProcessCountOld = ProcessCount;
ProcessCount = 0;
pSPI = (PSYSTEM_PROCESS_INFORMATION)pBuffer;
while (pSPI) {
for (pSPI = (PSYSTEM_PROCESS_INFORMATION)pBuffer;
pSPI && (pSPI->NextEntryOffset != 0);
pSPI = (PSYSTEM_PROCESS_INFORMATION)((ULONG_PTR)pSPI + pSPI->NextEntryOffset))
{
ProcessCount++;
if (pSPI->NextEntryOffset == 0)
break;
pSPI = (PSYSTEM_PROCESS_INFORMATION)((LPBYTE)pSPI + pSPI->NextEntryOffset);
}
/* Now alloc a new PERFDATA array and fill in the data */
pPerfData = (PPERFDATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PERFDATA) * ProcessCount);
pSPI = (PSYSTEM_PROCESS_INFORMATION)pBuffer;
for (Idx=0; Idx<ProcessCount; Idx++) {
/* Get the old perf data for this process (if any) */
/* so that we can establish delta values */
for (Idx=0; Idx<ProcessCount; Idx++)
{
/* Get the old perf data for this process (if any)
* so that we can establish delta values */
pPDOld = NULL;
if (pPerfDataOld) {
for (Idx2=0; Idx2<ProcessCountOld; Idx2++) {
if (pPerfDataOld[Idx2].ProcessId == pSPI->UniqueProcessId) {
if (pPerfDataOld)
{
for (Idx2=0; Idx2<ProcessCountOld; Idx2++)
{
if (pPerfDataOld[Idx2].ProcessId == pSPI->UniqueProcessId)
{
pPDOld = &pPerfDataOld[Idx2];
break;
}
}
}
if (pSPI->ImageName.Buffer) {
/* Don't assume a UNICODE_STRING Buffer is zero terminated: */
int len = pSPI->ImageName.Length / 2;
/* Check against max size and allow for terminating zero (already zeroed): */
if(len >= MAX_PATH)len=MAX_PATH - 1;
wcsncpy(pPerfData[Idx].ImageName, pSPI->ImageName.Buffer, len);
} else {
LoadStringW(hInst, IDS_IDLE_PROCESS, pPerfData[Idx].ImageName,
_countof(pPerfData[Idx].ImageName));
if (pSPI->ImageName.Buffer)
{
StringCbCopyNW(pPerfData[Idx].ImageName, sizeof(pPerfData[Idx].ImageName),
pSPI->ImageName.Buffer, pSPI->ImageName.Length);
}
else
{
LoadStringW(hInst, IDS_IDLE_PROCESS,
pPerfData[Idx].ImageName,
_countof(pPerfData[Idx].ImageName));
}
pPerfData[Idx].ProcessId = pSPI->UniqueProcessId;
if (pPDOld) {
if (pPDOld)
{
double CurTime = Li2Double(pSPI->KernelTime) + Li2Double(pSPI->UserTime);
double OldTime = Li2Double(pPDOld->KernelTime) + Li2Double(pPDOld->UserTime);
double CpuTime = (CurTime - OldTime) / dbSystemTime;
@ -337,15 +473,19 @@ void PerfDataRefresh(void)
pPerfData[Idx].CPUTime.QuadPart = pSPI->UserTime.QuadPart + pSPI->KernelTime.QuadPart;
pPerfData[Idx].WorkingSetSizeBytes = pSPI->WorkingSetSize;
pPerfData[Idx].PeakWorkingSetSizeBytes = pSPI->PeakWorkingSetSize;
if (pPDOld)
pPerfData[Idx].WorkingSetSizeDelta = labs((LONG)pSPI->WorkingSetSize - (LONG)pPDOld->WorkingSetSizeBytes);
else
pPerfData[Idx].WorkingSetSizeDelta = 0;
pPerfData[Idx].PageFaultCount = pSPI->PageFaultCount;
if (pPDOld)
pPerfData[Idx].PageFaultCountDelta = labs((LONG)pSPI->PageFaultCount - (LONG)pPDOld->PageFaultCount);
else
pPerfData[Idx].PageFaultCountDelta = 0;
pPerfData[Idx].VirtualMemorySizeBytes = pSPI->VirtualSize;
pPerfData[Idx].PagedPoolUsagePages = pSPI->QuotaPeakPagedPoolUsage;
pPerfData[Idx].NonPagedPoolUsagePages = pSPI->QuotaPeakNonPagedPoolUsage;
@ -359,11 +499,13 @@ void PerfDataRefresh(void)
ProcessUser = SystemUserSid;
ProcessSD = NULL;
if (pSPI->UniqueProcessId != NULL) {
if (pSPI->UniqueProcessId != NULL)
{
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | READ_CONTROL, FALSE, PtrToUlong(pSPI->UniqueProcessId));
if (hProcess) {
/* don't query the information of the system process. It's possible but
returns Administrators as the owner of the process instead of SYSTEM */
if (hProcess)
{
/* Don't query the information of the system process. It's possible but
* returns Administrators as the owner of the process instead of SYSTEM. */
if (pSPI->UniqueProcessId != (HANDLE)0x4)
{
if (OpenProcessToken(hProcess, TOKEN_QUERY, &hProcessToken))
@ -391,12 +533,16 @@ ReadProcOwner:
GetProcessIoCounters(hProcess, &pPerfData[Idx].IOCounters);
CloseHandle(hProcess);
} else {
}
else
{
goto ClearInfo;
}
} else {
}
else
{
ClearInfo:
/* clear information we were unable to fetch */
/* Clear information we were unable to fetch */
ZeroMemory(&pPerfData[Idx].IOCounters, sizeof(IO_COUNTERS));
}
@ -404,19 +550,27 @@ ClearInfo:
CachedGetUserFromSid(ProcessUser, pPerfData[Idx].UserName, &cwcUserName);
if (ProcessSD != NULL)
{
LocalFree((HLOCAL)ProcessSD);
}
pPerfData[Idx].UserTime.QuadPart = pSPI->UserTime.QuadPart;
pPerfData[Idx].KernelTime.QuadPart = pSPI->KernelTime.QuadPart;
pSPI = (PSYSTEM_PROCESS_INFORMATION)((LPBYTE)pSPI + pSPI->NextEntryOffset);
pSPI = (PSYSTEM_PROCESS_INFORMATION)((ULONG_PTR)pSPI + pSPI->NextEntryOffset);
}
HeapFree(GetProcessHeap(), 0, pBuffer);
if (pPerfDataOld) {
if (pPerfDataOld)
HeapFree(GetProcessHeap(), 0, pPerfDataOld);
}
pPerfDataOld = pPerfData;
LeaveCriticalSection(&PerfDataCriticalSection);
}
VOID PerfDataAcquireLock(VOID)
{
EnterCriticalSection(&PerfDataCriticalSection);
}
VOID PerfDataReleaseLock(VOID)
{
LeaveCriticalSection(&PerfDataCriticalSection);
}
@ -452,24 +606,45 @@ ULONG PerfDataGetProcessCount(void)
return Result;
}
ULONG PerfDataGetProcessorUsage(void)
ULONG PerfDataGetProcessorCount(VOID)
{
/* Note: No need for locking since this is a one-time initialized data */
// TODO: Investigate how this should be fixed with NUMA support.
return SystemBasicInfo.NumberOfProcessors;
}
ULONG PerfDataGetProcessorUsage(VOID)
{
ULONG Result;
EnterCriticalSection(&PerfDataCriticalSection);
Result = (ULONG)min(max(dbIdleTime, 0.), 100.);
Result = (ULONG)ProcessorMeanTimes.dbIdleTime;
LeaveCriticalSection(&PerfDataCriticalSection);
return Result;
}
ULONG PerfDataGetProcessorSystemUsage(void)
ULONG PerfDataGetProcessorSystemUsage(VOID)
{
ULONG Result;
EnterCriticalSection(&PerfDataCriticalSection);
Result = (ULONG)min(max(dbKernelTime, 0.), 100.);
Result = (ULONG)ProcessorMeanTimes.dbKernelTime;
LeaveCriticalSection(&PerfDataCriticalSection);
return Result;
}
ULONG PerfDataGetProcessorUsagePerCPU(ULONG CPUIndex)
{
if (CPUIndex >= SystemBasicInfo.NumberOfProcessors)
return 0;
return (ULONG)ProcessorTimes[CPUIndex].dbIdleTime;
}
ULONG PerfDataGetProcessorSystemUsagePerCPU(ULONG CPUIndex)
{
if (CPUIndex >= SystemBasicInfo.NumberOfProcessors)
return 0;
return (ULONG)ProcessorTimes[CPUIndex].dbKernelTime;
}
BOOL PerfDataGetImageName(ULONG Index, LPWSTR lpImageName, ULONG nMaxCount)
{
BOOL bSuccessful;
@ -916,161 +1091,86 @@ BOOL PerfDataGetIOCounters(ULONG Index, PIO_COUNTERS pIoCounters)
return bSuccessful;
}
ULONG PerfDataGetCommitChargeTotalK(void)
VOID
PerfDataGetCommitChargeK(
_Out_opt_ PULONGLONG ChargeTotal,
_Out_opt_ PULONGLONG ChargeLimit,
_Out_opt_ PULONGLONG ChargePeak)
{
ULONG Total;
ULONG PageSize;
ULONG Total;
ULONG Limit;
ULONG Peak;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Total = SystemPerfInfo.CommittedPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Total = Total * (PageSize / 1024);
return Total;
}
ULONG PerfDataGetCommitChargeLimitK(void)
{
ULONG Limit;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Limit = SystemPerfInfo.CommitLimit;
Peak = SystemPerfInfo.PeakCommitment;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Limit = Limit * (PageSize / 1024);
return Limit;
if (ChargeTotal)
*ChargeTotal = (ULONGLONG)Total * (PageSize / 1024);
if (ChargeLimit)
*ChargeLimit = (ULONGLONG)Limit * (PageSize / 1024);
if (ChargePeak)
*ChargePeak = (ULONGLONG)Peak * (PageSize / 1024);
}
ULONG PerfDataGetCommitChargePeakK(void)
VOID
PerfDataGetKernelMemoryK(
_Out_opt_ PULONGLONG MemTotal,
_Out_opt_ PULONGLONG MemPaged,
_Out_opt_ PULONGLONG MemNonPaged)
{
ULONG Peak;
ULONG PageSize;
ULONG Paged;
ULONG NonPaged;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Peak = SystemPerfInfo.PeakCommitment;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Peak = Peak * (PageSize / 1024);
return Peak;
}
ULONG PerfDataGetKernelMemoryTotalK(void)
{
ULONG Total;
ULONG Paged;
ULONG NonPaged;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Paged = SystemPerfInfo.PagedPoolPages;
Paged = SystemPerfInfo.PagedPoolPages;
NonPaged = SystemPerfInfo.NonPagedPoolPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Paged = Paged * (PageSize / 1024);
NonPaged = NonPaged * (PageSize / 1024);
Total = Paged + NonPaged;
return Total;
if (MemTotal)
*MemTotal = (ULONGLONG)(Paged + NonPaged) * (PageSize / 1024);
if (MemPaged)
*MemPaged = (ULONGLONG)Paged * (PageSize / 1024);
if (MemNonPaged)
*MemNonPaged = (ULONGLONG)NonPaged * (PageSize / 1024);
}
ULONG PerfDataGetKernelMemoryPagedK(void)
VOID
PerfDataGetPhysicalMemoryK(
_Out_opt_ PULONGLONG MemTotal,
_Out_opt_ PULONGLONG MemAvailable,
_Out_opt_ PULONGLONG MemSysCache)
{
ULONG Paged;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Paged = SystemPerfInfo.PagedPoolPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Paged = Paged * (PageSize / 1024);
return Paged;
}
ULONG PerfDataGetKernelMemoryNonPagedK(void)
{
ULONG NonPaged;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
NonPaged = SystemPerfInfo.NonPagedPoolPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
NonPaged = NonPaged * (PageSize / 1024);
return NonPaged;
}
ULONG PerfDataGetPhysicalMemoryTotalK(void)
{
ULONG Total;
ULONG PageSize;
ULONG Total;
ULONG Available;
ULONG SystemCache;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Total = SystemBasicInfo.NumberOfPhysicalPages;
Available = SystemPerfInfo.AvailablePages;
SystemCache = SystemCacheInfo.CurrentSizeIncludingTransitionInPages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Total = Total * (PageSize / 1024);
return Total;
}
ULONG PerfDataGetPhysicalMemoryAvailableK(void)
{
ULONG Available;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
Available = SystemPerfInfo.AvailablePages;
PageSize = SystemBasicInfo.PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
Available = Available * (PageSize / 1024);
return Available;
}
ULONG PerfDataGetPhysicalMemorySystemCacheK(void)
{
ULONG SystemCache;
ULONG PageSize;
EnterCriticalSection(&PerfDataCriticalSection);
PageSize = SystemBasicInfo.PageSize;
SystemCache = SystemCacheInfo.CurrentSizeIncludingTransitionInPages * PageSize;
LeaveCriticalSection(&PerfDataCriticalSection);
return SystemCache / 1024;
if (MemTotal)
*MemTotal = (ULONGLONG)Total * (PageSize / 1024);
if (MemAvailable)
*MemAvailable = (ULONGLONG)Available * (PageSize / 1024);
if (MemSysCache)
*MemSysCache = (ULONGLONG)SystemCache * (PageSize / 1024);
}
ULONG PerfDataGetSystemHandleCount(void)

View file

@ -45,15 +45,24 @@ typedef struct _CMD_LINE_CACHE
struct _CMD_LINE_CACHE* pnext;
} CMD_LINE_CACHE, *PCMD_LINE_CACHE;
BOOL PerfDataInitialize(void);
void PerfDataUninitialize(void);
void PerfDataRefresh(void);
BOOL PerfDataInitialize(VOID);
VOID PerfDataUninitialize(VOID);
VOID PerfDataRefresh(VOID);
VOID PerfDataAcquireLock(VOID);
VOID PerfDataReleaseLock(VOID);
BOOL PerfDataGet(ULONG Index, PPERFDATA *lppData);
ULONG PerfDataGetProcessIndex(ULONG pid);
ULONG PerfDataGetProcessCount(void);
ULONG PerfDataGetProcessorUsage(void);
ULONG PerfDataGetProcessorSystemUsage(void);
ULONG PerfDataGetProcessorCount(VOID);
ULONG PerfDataGetProcessorUsage(VOID);
ULONG PerfDataGetProcessorSystemUsage(VOID);
/****/
ULONG PerfDataGetProcessorUsagePerCPU(ULONG CPUIndex);
ULONG PerfDataGetProcessorSystemUsagePerCPU(ULONG CPUIndex);
/****/
BOOL PerfDataGetImageName(ULONG Index, LPWSTR lpImageName, ULONG nMaxCount);
ULONG PerfDataGetProcessId(ULONG Index);
@ -80,17 +89,23 @@ ULONG PerfDataGetUSERObjectCount(ULONG Index);
ULONG PerfDataGetGDIObjectCount(ULONG Index);
BOOL PerfDataGetIOCounters(ULONG Index, PIO_COUNTERS pIoCounters);
ULONG PerfDataGetCommitChargeTotalK(void);
ULONG PerfDataGetCommitChargeLimitK(void);
ULONG PerfDataGetCommitChargePeakK(void);
VOID
PerfDataGetCommitChargeK(
_Out_opt_ PULONGLONG Total,
_Out_opt_ PULONGLONG Limit,
_Out_opt_ PULONGLONG Peak);
ULONG PerfDataGetKernelMemoryTotalK(void);
ULONG PerfDataGetKernelMemoryPagedK(void);
ULONG PerfDataGetKernelMemoryNonPagedK(void);
VOID
PerfDataGetKernelMemoryK(
_Out_opt_ PULONGLONG MemTotal,
_Out_opt_ PULONGLONG MemPaged,
_Out_opt_ PULONGLONG MemNonPaged);
ULONG PerfDataGetPhysicalMemoryTotalK(void);
ULONG PerfDataGetPhysicalMemoryAvailableK(void);
ULONG PerfDataGetPhysicalMemorySystemCacheK(void);
VOID
PerfDataGetPhysicalMemoryK(
_Out_opt_ PULONGLONG MemTotal,
_Out_opt_ PULONGLONG MemAvailable,
_Out_opt_ PULONGLONG MemSysCache);
ULONG PerfDataGetSystemHandleCount(void);

View file

@ -8,57 +8,48 @@
#include "precomp.h"
#include <shlwapi.h>
TM_GRAPH_CONTROL PerformancePageCpuUsageHistoryGraph;
TM_GRAPH_CONTROL PerformancePageMemUsageHistoryGraph;
#define MAX_CPU_PER_LINE 16 // TODO: Make this selectable in submenu.
HWND hPerformancePage; /* Performance Property Page */
static HWND hCpuUsageGraph; /* CPU Usage Graph */
static HWND hMemUsageGraph; /* MEM Usage Graph */
HWND hPerformancePageCpuUsageHistoryGraph; /* CPU Usage History Graph */
HWND hPerformancePageMemUsageHistoryGraph; /* Memory Usage History Graph */
static HWND hTotalsFrame; /* Totals Frame */
static HWND hCommitChargeFrame; /* Commit Charge Frame */
static HWND hKernelMemoryFrame; /* Kernel Memory Frame */
static HWND hPhysicalMemoryFrame; /* Physical Memory Frame */
static HWND hCpuUsageFrame;
static HWND hMemUsageFrame;
static HWND hCpuUsageHistoryFrame;
static HWND hMemUsageHistoryFrame;
static HWND hCommitChargeTotalEdit; /* Commit Charge Total Edit Control */
static HWND hCommitChargeLimitEdit; /* Commit Charge Limit Edit Control */
static HWND hCommitChargePeakEdit; /* Commit Charge Peak Edit Control */
static HWND hKernelMemoryTotalEdit; /* Kernel Memory Total Edit Control */
static HWND hKernelMemoryPagedEdit; /* Kernel Memory Paged Edit Control */
static HWND hKernelMemoryNonPagedEdit; /* Kernel Memory NonPaged Edit Control */
static HWND hPhysicalMemoryTotalEdit; /* Physical Memory Total Edit Control */
static HWND hPhysicalMemoryAvailableEdit; /* Physical Memory Available Edit Control */
static HWND hPhysicalMemorySystemCacheEdit; /* Physical Memory System Cache Edit Control */
static HWND hTotalsHandleCountEdit; /* Total Handles Edit Control */
static HWND hTotalsProcessCountEdit; /* Total Processes Edit Control */
static HWND hTotalsThreadCountEdit; /* Total Threads Edit Control */
// typedef struct _CPU_GRAPH CPU_GRAPH, *PCPU_GRAPH;
static ULONG CpuTotalPanes = 0;
static PTM_GRAPH_CONTROL CpuUsageHistoryGraphs = NULL; /* CPU Usage History Graphs Array */
#ifdef RUN_PERF_PAGE
static HANDLE hPerformanceThread = NULL;
static DWORD dwPerformanceThread;
#endif
static HWND hCpuUsageHistoryGraph; /* CPU Usage History Graph */
static TM_GRAPH_CONTROL CpuUsageHistoryGraph; /* CPU Usage History Graph template control */
static RECT rcCpuGraphArea; /* Rectangle area for CPU graphs */
static HWND hMemUsageHistoryGraph; /* Memory Usage History Graph */
static TM_GRAPH_CONTROL MemUsageHistoryGraph;
static HWND hCpuUsageGraph; /* CPU Usage Graph */
static HWND hMemUsageGraph; /* MEM Usage Graph */
static TM_GAUGE_CONTROL CpuUsageGraph = {0};
static TM_GAUGE_CONTROL MemUsageGraph = {0};
HWND hPerformancePage; /* Performance Property Page */
static int nPerformancePageWidth;
static int nPerformancePageHeight;
static int lastX, lastY;
DWORD WINAPI PerformancePageRefreshThread(PVOID Parameter);
void AdjustFrameSize(HWND hCntrl, HWND hDlg, int nXDifference, int nYDifference, int pos)
static void
AdjustFrameSize(HDWP* phdwp, HWND hCntrl, HWND hDlg, int nXDifference, int nYDifference, int posFlag)
{
RECT rc;
int cx, cy, sx, sy;
RECT rc;
int cx, cy, sx, sy;
GetClientRect(hCntrl, &rc);
MapWindowPoints(hCntrl, hDlg, (LPPOINT)(PRECT)(&rc), sizeof(RECT)/sizeof(POINT));
if (pos) {
if (!phdwp || !*phdwp)
return;
GetWindowRect(hCntrl, &rc);
MapWindowPoints(NULL, hDlg, (LPPOINT)&rc, sizeof(RECT) / sizeof(POINT));
if (posFlag)
{
cx = rc.left;
cy = rc.top;
sx = rc.right - rc.left;
switch (pos) {
switch (posFlag)
{
case 1:
break;
case 2:
@ -73,44 +64,38 @@ void AdjustFrameSize(HWND hCntrl, HWND hDlg, int nXDifference, int nYDifference,
break;
}
sy = rc.bottom - rc.top + nYDifference / 2;
SetWindowPos(hCntrl, NULL, cx, cy, sx, sy, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOZORDER);
} else {
*phdwp = DeferWindowPos(*phdwp,
hCntrl, NULL,
cx, cy, sx, sy,
SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOZORDER);
}
else
{
cx = rc.left + nXDifference;
cy = rc.top + nYDifference;
SetWindowPos(hCntrl, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
*phdwp = DeferWindowPos(*phdwp,
hCntrl, NULL,
cx, cy, 0, 0,
SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
}
InvalidateRect(hCntrl, NULL, TRUE);
}
// AdjustControlPosition
static inline
void AdjustControlPosition(HWND hCntrl, HWND hDlg, int nXDifference, int nYDifference)
void AdjustCntrlPos(HDWP* phdwp, int ctrl_id, HWND hDlg, int nXDifference, int nYDifference)
{
AdjustFrameSize(hCntrl, hDlg, nXDifference, nYDifference, 0);
}
static inline
void AdjustCntrlPos(int ctrl_id, HWND hDlg, int nXDifference, int nYDifference)
{
AdjustFrameSize(GetDlgItem(hDlg, ctrl_id), hDlg, nXDifference, nYDifference, 0);
AdjustFrameSize(phdwp, GetDlgItem(hDlg, ctrl_id), hDlg, nXDifference, nYDifference, 0);
}
INT_PTR CALLBACK
PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
RECT rc;
switch (message)
{
case WM_DESTROY:
GraphCtrl_Dispose(&PerformancePageCpuUsageHistoryGraph);
GraphCtrl_Dispose(&PerformancePageMemUsageHistoryGraph);
#ifdef RUN_PERF_PAGE
EndLocalThread(&hPerformanceThread, dwPerformanceThread);
#endif
break;
case WM_INITDIALOG:
{
RECT rc;
BOOL bGraph;
TM_FORMAT fmt;
@ -122,84 +107,194 @@ PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
/* Update window position */
SetWindowPos(hDlg, NULL, 15, 30, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
/*
* Get handles to all the controls
*/
hTotalsFrame = GetDlgItem(hDlg, IDC_TOTALS_FRAME);
hCommitChargeFrame = GetDlgItem(hDlg, IDC_COMMIT_CHARGE_FRAME);
hKernelMemoryFrame = GetDlgItem(hDlg, IDC_KERNEL_MEMORY_FRAME);
hPhysicalMemoryFrame = GetDlgItem(hDlg, IDC_PHYSICAL_MEMORY_FRAME);
hCpuUsageFrame = GetDlgItem(hDlg, IDC_CPU_USAGE_FRAME);
hMemUsageFrame = GetDlgItem(hDlg, IDC_MEM_USAGE_FRAME);
hCpuUsageHistoryFrame = GetDlgItem(hDlg, IDC_CPU_USAGE_HISTORY_FRAME);
hMemUsageHistoryFrame = GetDlgItem(hDlg, IDC_MEMORY_USAGE_HISTORY_FRAME);
hCommitChargeTotalEdit = GetDlgItem(hDlg, IDC_COMMIT_CHARGE_TOTAL);
hCommitChargeLimitEdit = GetDlgItem(hDlg, IDC_COMMIT_CHARGE_LIMIT);
hCommitChargePeakEdit = GetDlgItem(hDlg, IDC_COMMIT_CHARGE_PEAK);
hKernelMemoryTotalEdit = GetDlgItem(hDlg, IDC_KERNEL_MEMORY_TOTAL);
hKernelMemoryPagedEdit = GetDlgItem(hDlg, IDC_KERNEL_MEMORY_PAGED);
hKernelMemoryNonPagedEdit = GetDlgItem(hDlg, IDC_KERNEL_MEMORY_NONPAGED);
hPhysicalMemoryTotalEdit = GetDlgItem(hDlg, IDC_PHYSICAL_MEMORY_TOTAL);
hPhysicalMemoryAvailableEdit = GetDlgItem(hDlg, IDC_PHYSICAL_MEMORY_AVAILABLE);
hPhysicalMemorySystemCacheEdit = GetDlgItem(hDlg, IDC_PHYSICAL_MEMORY_SYSTEM_CACHE);
hTotalsHandleCountEdit = GetDlgItem(hDlg, IDC_TOTALS_HANDLE_COUNT);
hTotalsProcessCountEdit = GetDlgItem(hDlg, IDC_TOTALS_PROCESS_COUNT);
hTotalsThreadCountEdit = GetDlgItem(hDlg, IDC_TOTALS_THREAD_COUNT);
/* Get handles to the graph controls */
hCpuUsageGraph = GetDlgItem(hDlg, IDC_CPU_USAGE_GRAPH);
hMemUsageGraph = GetDlgItem(hDlg, IDC_MEM_USAGE_GRAPH);
hPerformancePageMemUsageHistoryGraph = GetDlgItem(hDlg, IDC_MEM_USAGE_HISTORY_GRAPH);
hPerformancePageCpuUsageHistoryGraph = GetDlgItem(hDlg, IDC_CPU_USAGE_HISTORY_GRAPH);
hCpuUsageHistoryGraph = GetDlgItem(hDlg, IDC_CPU_USAGE_HISTORY_GRAPH);
hMemUsageHistoryGraph = GetDlgItem(hDlg, IDC_MEM_USAGE_HISTORY_GRAPH);
/* Create the graph controls */
CpuUsageGraph.bIsCPU = TRUE;
// CpuUsageGraph.hWnd = hCpuUsageGraph;
MemUsageGraph.bIsCPU = FALSE;
// MemUsageGraph.hWnd = hMemUsageGraph;
/* Create the controls */
fmt.clrBack = RGB(0, 0, 0);
fmt.clrGrid = RGB(0, 128, 64);
fmt.clrPlot0 = RGB(0, 255, 0);
fmt.clrPlot1 = RGB(255, 0, 0);
fmt.GridCellWidth = fmt.GridCellHeight = 12;
fmt.DrawSecondaryPlot = TaskManagerSettings.ShowKernelTimes;
bGraph = GraphCtrl_Create(&PerformancePageCpuUsageHistoryGraph, hPerformancePageCpuUsageHistoryGraph, hDlg, &fmt);
if (!bGraph)
/* Retrieve the size of the single original CPU graph control,
* that will serve as our overall CPU graph area where the
* per-CPU graph panels will reside. */
GetWindowRect(hCpuUsageHistoryGraph, &rcCpuGraphArea);
MapWindowPoints(NULL, hDlg, (LPPOINT)&rcCpuGraphArea, sizeof(RECT) / sizeof(POINT));
/* Initialize the number of total CPU history graph panes to the number of CPUs on the system */
CpuTotalPanes = PerfDataGetProcessorCount();
/* Initialize the CPU history graph panes */
if (CpuTotalPanes > 1)
{
EndDialog(hDlg, 0);
return FALSE;
/*
* Inherit the characteristics of the new per-CPU graph panes
* from the main original one, and create their corresponding panes.
*/
LPCWSTR lpClassAtom = (LPCWSTR)GetClassLongPtrW(hCpuUsageHistoryGraph, GCW_ATOM);
DWORD dwExStyle = GetWindowLongPtrW(hCpuUsageHistoryGraph, GWL_EXSTYLE);
DWORD dwStyle = GetWindowLongPtrW(hCpuUsageHistoryGraph, GWL_STYLE);
HWND hwndParent = GetParent(hCpuUsageHistoryGraph);
HWND hwndCPU;
ULONG i;
CpuUsageHistoryGraphs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(TM_GRAPH_CONTROL) * CpuTotalPanes);
if (!CpuUsageHistoryGraphs)
goto oneCPUGraph; /* Fall back to one graph for all CPUs */
/* Initialize the first entry for CPU #0 */
bGraph = GraphCtrl_Create(&CpuUsageHistoryGraphs[0], hCpuUsageHistoryGraph, hDlg, &fmt);
if (!bGraph)
{
/* Ignore graph creation failure (may happen under low memory resources) */
// CpuUsageHistoryGraphs[0].hWnd = hCpuUsageHistoryGraph;
// NOTHING;
}
/* Start the loop at 1 for the other CPUs */
ASSERT(CpuTotalPanes <= MAXWORD);
for (i = 1; i < CpuTotalPanes; ++i)
{
/* Allocate a new window, inheriting its class and style
* from the single original CPU graph control. Its actual
* position will be determined at the first WM_SIZE event
* after the property sheet page gets created. */
hwndCPU = CreateWindowExW(dwExStyle, lpClassAtom, L"CPU Graph", dwStyle,
rcCpuGraphArea.left, rcCpuGraphArea.top,
0, 0,
hwndParent,
/* Specifies child ID */
(HMENU)ULongToHandle(MAKELONG(IDC_CPU_USAGE_HISTORY_GRAPH, (WORD)i)),
hInst, NULL);
if (!hwndCPU)
continue;
bGraph = GraphCtrl_Create(&CpuUsageHistoryGraphs[i], hwndCPU, hDlg, &fmt);
if (!bGraph)
{
/* Ignore graph creation failure (may happen under low memory resources) */
// CpuUsageHistoryGraphs[i].hWnd = hwndCPU;
// NOTHING;
}
ShowWindow(hwndCPU, TaskManagerSettings.CPUHistory_OneGraphPerCPU ? SW_SHOW : SW_HIDE);
}
}
else
{
HMENU hCPUHistoryMenu;
oneCPUGraph:
/* Fall back to one graph for all CPUs */
CpuTotalPanes = 1;
CpuUsageHistoryGraphs = &CpuUsageHistoryGraph;
bGraph = GraphCtrl_Create(&CpuUsageHistoryGraphs[0], hCpuUsageHistoryGraph, hDlg, &fmt);
if (!bGraph)
{
/* Ignore graph creation failure (may happen under low memory resources) */
// NOTHING;
}
/* Select one graph for all CPUs and disable the per-CPU graph menu item */
PerformancePage_OnViewCPUHistoryGraph(TRUE);
hCPUHistoryMenu = GetSubMenu(GetSubMenu(GetMenu(hMainWnd), 2), 3);
EnableMenuItem(hCPUHistoryMenu, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, MF_BYCOMMAND | MF_DISABLED);
}
fmt.clrPlot0 = RGB(255, 255, 0);
fmt.clrPlot1 = RGB(100, 255, 255);
fmt.DrawSecondaryPlot = TRUE;
bGraph = GraphCtrl_Create(&PerformancePageMemUsageHistoryGraph, hPerformancePageMemUsageHistoryGraph, hDlg, &fmt);
bGraph = GraphCtrl_Create(&MemUsageHistoryGraph, hMemUsageHistoryGraph, hDlg, &fmt);
if (!bGraph)
{
EndDialog(hDlg, 0);
return FALSE;
/* Ignore graph creation failure (may happen under low memory resources) */
// NOTHING;
}
/* Start our refresh thread */
#ifdef RUN_PERF_PAGE
hPerformanceThread = CreateThread(NULL, 0, PerformancePageRefreshThread, NULL, 0, &dwPerformanceThread);
#endif
/*
* Subclass graph buttons
*/
OldGraphWndProc = (WNDPROC)SetWindowLongPtrW(hCpuUsageGraph, GWLP_WNDPROC, (LONG_PTR)Graph_WndProc);
SetWindowLongPtrW(hMemUsageGraph, GWLP_WNDPROC, (LONG_PTR)Graph_WndProc);
OldGraphCtrlWndProc = (WNDPROC)SetWindowLongPtrW(hPerformancePageMemUsageHistoryGraph, GWLP_WNDPROC, (LONG_PTR)GraphCtrl_WndProc);
SetWindowLongPtrW(hPerformancePageCpuUsageHistoryGraph, GWLP_WNDPROC, (LONG_PTR)GraphCtrl_WndProc);
return TRUE;
}
case WM_COMMAND:
case WM_DESTROY:
{
if (CpuUsageHistoryGraphs && (CpuUsageHistoryGraphs != &CpuUsageHistoryGraph))
{
ULONG i;
for (i = 0; i < CpuTotalPanes; ++i)
{
HWND hwnd = CpuUsageHistoryGraphs[i].hWnd;
GraphCtrl_Dispose(&CpuUsageHistoryGraphs[i]);
DestroyWindow(hwnd);
}
HeapFree(GetProcessHeap(), 0, CpuUsageHistoryGraphs);
CpuUsageHistoryGraphs = NULL;
}
GraphCtrl_Dispose(&CpuUsageHistoryGraph);
GraphCtrl_Dispose(&MemUsageHistoryGraph);
break;
}
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT drawItem = (LPDRAWITEMSTRUCT)lParam;
if (LOWORD(drawItem->CtlID) == IDC_CPU_USAGE_HISTORY_GRAPH)
{
ULONG i = HIWORD(drawItem->CtlID);
if ((i < CpuTotalPanes) &&
(drawItem->hwndItem == CpuUsageHistoryGraphs[i].hWnd))
{
GraphCtrl_OnDraw(drawItem->hwndItem,
&CpuUsageHistoryGraphs[i],
(WPARAM)drawItem->hDC, 0);
}
}
else if (drawItem->CtlID == IDC_MEM_USAGE_HISTORY_GRAPH)
{
ASSERT(drawItem->hwndItem == MemUsageHistoryGraph.hWnd);
GraphCtrl_OnDraw(drawItem->hwndItem,
&MemUsageHistoryGraph,
(WPARAM)drawItem->hDC, 0);
}
else if (drawItem->CtlID == IDC_CPU_USAGE_GRAPH)
{
Graph_DrawUsageGraph(drawItem->hwndItem,
&CpuUsageGraph,
(WPARAM)drawItem->hDC, 0);
}
else if (drawItem->CtlID == IDC_MEM_USAGE_GRAPH)
{
Graph_DrawUsageGraph(drawItem->hwndItem,
&MemUsageGraph,
(WPARAM)drawItem->hDC, 0);
}
break;
// return TRUE;
}
case WM_SIZE:
{
int cx, cy;
int nXDifference;
int nYDifference;
int cx, cy;
int nXDifference;
int nYDifference;
HDWP hdwp;
RECT rcClient;
ULONG CPUPanes;
ULONG i;
if (wParam == SIZE_MINIMIZED)
return 0;
@ -211,36 +306,40 @@ PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
nPerformancePageWidth = cx;
nPerformancePageHeight = cy;
/* Reposition the performance page's controls */
AdjustFrameSize(hTotalsFrame, hDlg, 0, nYDifference, 0);
AdjustFrameSize(hCommitChargeFrame, hDlg, 0, nYDifference, 0);
AdjustFrameSize(hKernelMemoryFrame, hDlg, 0, nYDifference, 0);
AdjustFrameSize(hPhysicalMemoryFrame, hDlg, 0, nYDifference, 0);
AdjustCntrlPos(IDS_COMMIT_CHARGE_TOTAL, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_COMMIT_CHARGE_LIMIT, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_COMMIT_CHARGE_PEAK, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_KERNEL_MEMORY_TOTAL, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_KERNEL_MEMORY_PAGED, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_KERNEL_MEMORY_NONPAGED, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_PHYSICAL_MEMORY_TOTAL, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_PHYSICAL_MEMORY_AVAILABLE, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_PHYSICAL_MEMORY_SYSTEM_CACHE, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_TOTALS_HANDLE_COUNT, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_TOTALS_PROCESS_COUNT, hDlg, 0, nYDifference);
AdjustCntrlPos(IDS_TOTALS_THREAD_COUNT, hDlg, 0, nYDifference);
CPUPanes = (TaskManagerSettings.CPUHistory_OneGraphPerCPU ? CpuTotalPanes : 1);
AdjustControlPosition(hCommitChargeTotalEdit, hDlg, 0, nYDifference);
AdjustControlPosition(hCommitChargeLimitEdit, hDlg, 0, nYDifference);
AdjustControlPosition(hCommitChargePeakEdit, hDlg, 0, nYDifference);
AdjustControlPosition(hKernelMemoryTotalEdit, hDlg, 0, nYDifference);
AdjustControlPosition(hKernelMemoryPagedEdit, hDlg, 0, nYDifference);
AdjustControlPosition(hKernelMemoryNonPagedEdit, hDlg, 0, nYDifference);
AdjustControlPosition(hPhysicalMemoryTotalEdit, hDlg, 0, nYDifference);
AdjustControlPosition(hPhysicalMemoryAvailableEdit, hDlg, 0, nYDifference);
AdjustControlPosition(hPhysicalMemorySystemCacheEdit, hDlg, 0, nYDifference);
AdjustControlPosition(hTotalsHandleCountEdit, hDlg, 0, nYDifference);
AdjustControlPosition(hTotalsProcessCountEdit, hDlg, 0, nYDifference);
AdjustControlPosition(hTotalsThreadCountEdit, hDlg, 0, nYDifference);
hdwp = BeginDeferWindowPos(16 + 12 + 6 + CPUPanes + 1);
/* Reposition the performance page's controls */
AdjustCntrlPos(&hdwp, IDC_TOTALS_FRAME, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_COMMIT_CHARGE_FRAME, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_KERNEL_MEMORY_FRAME, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_PHYSICAL_MEMORY_FRAME, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_COMMIT_CHARGE_TOTAL, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_COMMIT_CHARGE_LIMIT, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_COMMIT_CHARGE_PEAK, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_KERNEL_MEMORY_TOTAL, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_KERNEL_MEMORY_PAGED, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_KERNEL_MEMORY_NONPAGED, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_PHYSICAL_MEMORY_TOTAL, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_PHYSICAL_MEMORY_AVAILABLE, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_PHYSICAL_MEMORY_SYSTEM_CACHE, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_TOTALS_HANDLE_COUNT, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_TOTALS_PROCESS_COUNT, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDS_TOTALS_THREAD_COUNT, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_COMMIT_CHARGE_TOTAL, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_COMMIT_CHARGE_LIMIT, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_COMMIT_CHARGE_PEAK, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_KERNEL_MEMORY_TOTAL, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_KERNEL_MEMORY_PAGED, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_KERNEL_MEMORY_NONPAGED, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_PHYSICAL_MEMORY_TOTAL, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_PHYSICAL_MEMORY_AVAILABLE, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_PHYSICAL_MEMORY_SYSTEM_CACHE, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_TOTALS_HANDLE_COUNT, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_TOTALS_THREAD_COUNT, hDlg, 0, nYDifference);
AdjustCntrlPos(&hdwp, IDC_TOTALS_PROCESS_COUNT, hDlg, 0, nYDifference);
nXDifference += lastX;
nYDifference += lastY;
@ -271,38 +370,129 @@ PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
lastY--;
}
}
AdjustFrameSize(hCpuUsageFrame, hDlg, nXDifference, nYDifference, 1);
AdjustFrameSize(hMemUsageFrame, hDlg, nXDifference, nYDifference, 2);
AdjustFrameSize(hCpuUsageHistoryFrame, hDlg, nXDifference, nYDifference, 3);
AdjustFrameSize(hMemUsageHistoryFrame, hDlg, nXDifference, nYDifference, 4);
AdjustFrameSize(hCpuUsageGraph, hDlg, nXDifference, nYDifference, 1);
AdjustFrameSize(hMemUsageGraph, hDlg, nXDifference, nYDifference, 2);
AdjustFrameSize(hPerformancePageCpuUsageHistoryGraph, hDlg, nXDifference, nYDifference, 3);
AdjustFrameSize(hPerformancePageMemUsageHistoryGraph, hDlg, nXDifference, nYDifference, 4);
AdjustFrameSize(&hdwp, GetDlgItem(hDlg, IDC_CPU_USAGE_FRAME), hDlg, nXDifference, nYDifference, 1);
AdjustFrameSize(&hdwp, GetDlgItem(hDlg, IDC_MEM_USAGE_FRAME), hDlg, nXDifference, nYDifference, 2);
AdjustFrameSize(&hdwp, GetDlgItem(hDlg, IDC_CPU_USAGE_HISTORY_FRAME), hDlg, nXDifference, nYDifference, 3);
AdjustFrameSize(&hdwp, GetDlgItem(hDlg, IDC_MEMORY_USAGE_HISTORY_FRAME), hDlg, nXDifference, nYDifference, 4);
AdjustFrameSize(&hdwp, hCpuUsageGraph, hDlg, nXDifference, nYDifference, 1);
AdjustFrameSize(&hdwp, hMemUsageGraph, hDlg, nXDifference, nYDifference, 2);
/* Lay out the CPU graphs */
// if (CPUPanes > 1)
{
int nWidth, nHeight;
/* Lay out the several CPU graphs in a grid-like manner */
rcCpuGraphArea.right += nXDifference;
rcCpuGraphArea.bottom += nYDifference / 2;
nWidth = (rcCpuGraphArea.right - rcCpuGraphArea.left) / min(CPUPanes, MAX_CPU_PER_LINE); // - GetSystemMetrics(SM_CXBORDER);
nHeight = (rcCpuGraphArea.bottom - rcCpuGraphArea.top) / (1 + (CPUPanes-1) / MAX_CPU_PER_LINE); // - GetSystemMetrics(SM_CYBORDER);
for (i = 0; i < CPUPanes; ++i)
{
hdwp = DeferWindowPos(hdwp,
CpuUsageHistoryGraphs[i].hWnd,
NULL,
rcCpuGraphArea.left + (i % MAX_CPU_PER_LINE) * nWidth,
rcCpuGraphArea.top + (i / MAX_CPU_PER_LINE) * nHeight,
nWidth,
nHeight,
SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOZORDER);
InvalidateRect(CpuUsageHistoryGraphs[i].hWnd, NULL, TRUE);
}
}
#if 0
else
{
/* The single CPU graph takes the whole CPU graph area */
AdjustFrameSize(&hdwp, CpuUsageHistoryGraphs[0].hWnd, hDlg, nXDifference, nYDifference, 3);
}
#endif
AdjustFrameSize(&hdwp, hMemUsageHistoryGraph, hDlg, nXDifference, nYDifference, 4);
if (hdwp)
EndDeferWindowPos(hdwp);
/* Resize the graphs */
for (i = 0; i < CPUPanes; ++i)
{
GetClientRect(CpuUsageHistoryGraphs[i].hWnd, &rcClient);
GraphCtrl_OnSize(CpuUsageHistoryGraphs[i].hWnd,
&CpuUsageHistoryGraphs[i],
wParam,
MAKELPARAM(rcClient.right - rcClient.left,
rcClient.bottom - rcClient.top));
}
GetClientRect(hMemUsageHistoryGraph, &rcClient);
GraphCtrl_OnSize(hMemUsageHistoryGraph,
&MemUsageHistoryGraph,
wParam,
MAKELPARAM(rcClient.right - rcClient.left,
rcClient.bottom - rcClient.top));
break;
}
}
return 0;
}
void RefreshPerformancePage(void)
static void
UpdatePerfStatusBar(
_In_ ULONG TotalProcesses,
_In_ ULONG CpuUsage,
_In_ ULONGLONG CommitChargeTotal,
_In_ ULONGLONG CommitChargeLimit)
{
#ifdef RUN_PERF_PAGE
/* Signal the event so that our refresh thread
* will wake up and refresh the performance page */
PostThreadMessage(dwPerformanceThread, WM_TIMER, 0, 0);
#endif
extern BOOL bTrackMenu; // From taskmgr.c
static WCHAR szProcesses[256] = L"";
static WCHAR szCpuUsage[256] = L"";
static WCHAR szMemUsage[256] = L"";
WCHAR szChargeTotalFormat[256];
WCHAR szChargeLimitFormat[256];
WCHAR Text[260];
/* Do nothing if the status bar is used to show menu hints */
if (bTrackMenu)
return;
if (!*szProcesses)
LoadStringW(hInst, IDS_STATUS_PROCESSES, szProcesses, ARRAYSIZE(szProcesses));
if (!*szCpuUsage)
LoadStringW(hInst, IDS_STATUS_CPUUSAGE, szCpuUsage, ARRAYSIZE(szCpuUsage));
if (!*szMemUsage)
LoadStringW(hInst, IDS_STATUS_MEMUSAGE, szMemUsage, ARRAYSIZE(szMemUsage));
wsprintfW(Text, szProcesses, TotalProcesses);
SendMessageW(hStatusWnd, SB_SETTEXT, 0, (LPARAM)Text);
wsprintfW(Text, szCpuUsage, CpuUsage);
SendMessageW(hStatusWnd, SB_SETTEXT, 1, (LPARAM)Text);
StrFormatByteSizeW(CommitChargeTotal * 1024,
szChargeTotalFormat,
ARRAYSIZE(szChargeTotalFormat));
StrFormatByteSizeW(CommitChargeLimit * 1024,
szChargeLimitFormat,
ARRAYSIZE(szChargeLimitFormat));
wsprintfW(Text, szMemUsage, szChargeTotalFormat, szChargeLimitFormat,
(CommitChargeLimit ? ((CommitChargeTotal * 100) / CommitChargeLimit) : 0));
SendMessageW(hStatusWnd, SB_SETTEXT, 2, (LPARAM)Text);
}
DWORD WINAPI PerformancePageRefreshThread(PVOID Parameter)
void RefreshPerformancePage(void)
{
ULONGLONG CommitChargeTotal;
ULONGLONG CommitChargeLimit;
ULONGLONG CommitChargePeak;
ULONG CpuUsage;
ULONG CpuKernelUsage;
ULONGLONG KernelMemoryTotal;
ULONGLONG KernelMemoryPaged;
ULONGLONG KernelMemoryNonPaged;
@ -315,191 +505,194 @@ DWORD WINAPI PerformancePageRefreshThread(PVOID Parameter)
ULONG TotalThreads;
ULONG TotalProcesses;
MSG msg;
ULONG CpuUsage;
ULONG CpuKernelUsage;
ULONG i;
WCHAR Text[260];
WCHAR szMemUsage[256], szCpuUsage[256], szProcesses[256];
LoadStringW(hInst, IDS_STATUS_CPUUSAGE, szCpuUsage, _countof(szCpuUsage));
LoadStringW(hInst, IDS_STATUS_MEMUSAGE, szMemUsage, _countof(szMemUsage));
LoadStringW(hInst, IDS_STATUS_PROCESSES, szProcesses, _countof(szProcesses));
int nBarsUsed1;
int nBarsUsed2;
while (1)
/*
* Update the commit charge info
*/
PerfDataGetCommitChargeK(&CommitChargeTotal,
&CommitChargeLimit,
&CommitChargePeak);
_ui64tow(CommitChargeTotal, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_COMMIT_CHARGE_TOTAL, Text);
_ui64tow(CommitChargeLimit, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_COMMIT_CHARGE_LIMIT, Text);
_ui64tow(CommitChargePeak, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_COMMIT_CHARGE_PEAK, Text);
/*
* Update the kernel memory info
*/
PerfDataGetKernelMemoryK(&KernelMemoryTotal,
&KernelMemoryPaged,
&KernelMemoryNonPaged);
_ui64tow(KernelMemoryTotal, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_KERNEL_MEMORY_TOTAL, Text);
_ui64tow(KernelMemoryPaged, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_KERNEL_MEMORY_PAGED, Text);
_ui64tow(KernelMemoryNonPaged, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_KERNEL_MEMORY_NONPAGED, Text);
/*
* Update the physical memory info
*/
PerfDataGetPhysicalMemoryK(&PhysicalMemoryTotal,
&PhysicalMemoryAvailable,
&PhysicalMemorySystemCache);
_ui64tow(PhysicalMemoryTotal, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_PHYSICAL_MEMORY_TOTAL, Text);
_ui64tow(PhysicalMemoryAvailable, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_PHYSICAL_MEMORY_AVAILABLE, Text);
_ui64tow(PhysicalMemorySystemCache, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_PHYSICAL_MEMORY_SYSTEM_CACHE, Text);
/*
* Update the totals info
*/
TotalHandles = PerfDataGetSystemHandleCount();
TotalThreads = PerfDataGetTotalThreadCount();
TotalProcesses = PerfDataGetProcessCount();
_ultow(TotalHandles, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_TOTALS_HANDLE_COUNT, Text);
_ultow(TotalThreads, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_TOTALS_THREAD_COUNT, Text);
_ultow(TotalProcesses, Text, 10);
SetDlgItemTextW(hPerformancePage, IDC_TOTALS_PROCESS_COUNT, Text);
/*
* Get the CPU usage
*/
CpuUsage = PerfDataGetProcessorUsage();
CpuKernelUsage = PerfDataGetProcessorSystemUsage();
if (CpuUsageHistoryGraphs)
{
extern BOOL bTrackMenu; // From taskmgr.c
PerfDataAcquireLock();
int nBarsUsed1;
int nBarsUsed2;
WCHAR szChargeTotalFormat[256];
WCHAR szChargeLimitFormat[256];
/* Wait for an the event or application close */
if (GetMessage(&msg, NULL, 0, 0) <= 0)
return 0;
if (msg.message == WM_TIMER)
for (i = 0; i < CpuTotalPanes; ++i)
{
/*
* Update the commit charge info
*/
CommitChargeTotal = PerfDataGetCommitChargeTotalK();
CommitChargeLimit = PerfDataGetCommitChargeLimitK();
CommitChargePeak = PerfDataGetCommitChargePeakK();
_ultow(CommitChargeTotal, Text, 10);
SetWindowTextW(hCommitChargeTotalEdit, Text);
_ultow(CommitChargeLimit, Text, 10);
SetWindowTextW(hCommitChargeLimitEdit, Text);
_ultow(CommitChargePeak, Text, 10);
SetWindowTextW(hCommitChargePeakEdit, Text);
StrFormatByteSizeW(CommitChargeTotal * 1024,
szChargeTotalFormat,
_countof(szChargeTotalFormat));
StrFormatByteSizeW(CommitChargeLimit * 1024,
szChargeLimitFormat,
_countof(szChargeLimitFormat));
if (!bTrackMenu)
{
wsprintfW(Text, szMemUsage, szChargeTotalFormat, szChargeLimitFormat,
(CommitChargeLimit ? ((CommitChargeTotal * 100) / CommitChargeLimit) : 0));
SendMessageW(hStatusWnd, SB_SETTEXT, 2, (LPARAM)Text);
}
/*
* Update the kernel memory info
*/
KernelMemoryTotal = PerfDataGetKernelMemoryTotalK();
KernelMemoryPaged = PerfDataGetKernelMemoryPagedK();
KernelMemoryNonPaged = PerfDataGetKernelMemoryNonPagedK();
_ultow(KernelMemoryTotal, Text, 10);
SetWindowTextW(hKernelMemoryTotalEdit, Text);
_ultow(KernelMemoryPaged, Text, 10);
SetWindowTextW(hKernelMemoryPagedEdit, Text);
_ultow(KernelMemoryNonPaged, Text, 10);
SetWindowTextW(hKernelMemoryNonPagedEdit, Text);
/*
* Update the physical memory info
*/
PhysicalMemoryTotal = PerfDataGetPhysicalMemoryTotalK();
PhysicalMemoryAvailable = PerfDataGetPhysicalMemoryAvailableK();
PhysicalMemorySystemCache = PerfDataGetPhysicalMemorySystemCacheK();
_ultow(PhysicalMemoryTotal, Text, 10);
SetWindowTextW(hPhysicalMemoryTotalEdit, Text);
_ultow(PhysicalMemoryAvailable, Text, 10);
SetWindowTextW(hPhysicalMemoryAvailableEdit, Text);
_ultow(PhysicalMemorySystemCache, Text, 10);
SetWindowTextW(hPhysicalMemorySystemCacheEdit, Text);
/*
* Update the totals info
*/
TotalHandles = PerfDataGetSystemHandleCount();
TotalThreads = PerfDataGetTotalThreadCount();
TotalProcesses = PerfDataGetProcessCount();
_ultow(TotalHandles, Text, 10);
SetWindowTextW(hTotalsHandleCountEdit, Text);
_ultow(TotalThreads, Text, 10);
SetWindowTextW(hTotalsThreadCountEdit, Text);
_ultow(TotalProcesses, Text, 10);
SetWindowTextW(hTotalsProcessCountEdit, Text);
if (!bTrackMenu)
{
wsprintfW(Text, szProcesses, TotalProcesses);
SendMessageW(hStatusWnd, SB_SETTEXT, 0, (LPARAM)Text);
}
/*
* Redraw the graphs
*/
InvalidateRect(hCpuUsageGraph, NULL, FALSE);
InvalidateRect(hMemUsageGraph, NULL, FALSE);
/*
* Get the CPU usage
*/
CpuUsage = PerfDataGetProcessorUsage();
CpuKernelUsage = PerfDataGetProcessorSystemUsage();
if (!bTrackMenu)
{
wsprintfW(Text, szCpuUsage, CpuUsage);
SendMessageW(hStatusWnd, SB_SETTEXT, 1, (LPARAM)Text);
}
/*
* Get the memory usage
*/
CommitChargeTotal = PerfDataGetCommitChargeTotalK();
CommitChargeLimit = PerfDataGetCommitChargeLimitK();
nBarsUsed1 = CommitChargeLimit ? ((CommitChargeTotal * 100) / CommitChargeLimit) : 0;
PhysicalMemoryTotal = PerfDataGetPhysicalMemoryTotalK();
PhysicalMemoryAvailable = PerfDataGetPhysicalMemoryAvailableK();
nBarsUsed2 = PhysicalMemoryTotal ? ((PhysicalMemoryAvailable * 100) / PhysicalMemoryTotal) : 0;
GraphCtrl_AddPoint(&PerformancePageCpuUsageHistoryGraph, CpuUsage, CpuKernelUsage);
GraphCtrl_AddPoint(&PerformancePageMemUsageHistoryGraph, nBarsUsed1, nBarsUsed2);
InvalidateRect(hPerformancePageMemUsageHistoryGraph, NULL, FALSE);
InvalidateRect(hPerformancePageCpuUsageHistoryGraph, NULL, FALSE);
GraphCtrl_AddPoint(&CpuUsageHistoryGraphs[i],
PerfDataGetProcessorUsagePerCPU(i),
PerfDataGetProcessorSystemUsagePerCPU(i));
InvalidateRect(CpuUsageHistoryGraphs[i].hWnd, NULL, FALSE);
}
PerfDataReleaseLock();
}
return 0;
else
{
GraphCtrl_AddPoint(&CpuUsageHistoryGraph, CpuUsage, CpuKernelUsage);
InvalidateRect(CpuUsageHistoryGraph.hWnd, NULL, FALSE);
}
/*
* Update the graphs
*/
nBarsUsed1 = CommitChargeLimit ? ((CommitChargeTotal * 100) / CommitChargeLimit) : 0;
nBarsUsed2 = PhysicalMemoryTotal ? ((PhysicalMemoryAvailable * 100) / PhysicalMemoryTotal) : 0;
// nBarsUsed2 = PhysicalMemoryTotal ? (((PhysicalMemoryTotal - PhysicalMemoryAvailable) * 100) / PhysicalMemoryTotal) : 0;
GraphCtrl_AddPoint(&MemUsageHistoryGraph, nBarsUsed1, nBarsUsed2);
// CpuUsageGraph.Maximum = 100;
CpuUsageGraph.Current1 = CpuUsage;
CpuUsageGraph.Current2 = CpuKernelUsage;
//
// TODO: The memory gauge may show the commit charge (Win2000/XP/2003),
// or show the **physical** memory amount (Windows Vista+). Have something
// to set the preference...
//
Meter_CommitChargeTotal = (PhysicalMemoryTotal - PhysicalMemoryAvailable); // CommitChargeTotal;
Meter_CommitChargeLimit = PhysicalMemoryTotal; // CommitChargeLimit;
// MemUsageGraph.Maximum = Meter_CommitChargeLimit;
if (Meter_CommitChargeLimit)
MemUsageGraph.Current1 = (ULONG)((Meter_CommitChargeTotal * 100) / Meter_CommitChargeLimit);
else
MemUsageGraph.Current1 = 0;
/* Update the status bar */
UpdatePerfStatusBar(TotalProcesses, CpuUsage, CommitChargeTotal, CommitChargeLimit);
/** Down below, that's what we do IIF we are actually active and need to repaint stuff **/
/*
* Redraw the graphs
*/
InvalidateRect(hCpuUsageGraph, NULL, FALSE);
InvalidateRect(hMemUsageGraph, NULL, FALSE);
// InvalidateRect(CpuUsageHistoryGraph.hwndGraph, NULL, FALSE);
#if 0
for (i = 0; i < (TaskManagerSettings.CPUHistory_OneGraphPerCPU ? CpuTotalPanes : 1); ++i)
{
InvalidateRect(CpuUsageHistoryGraphs[i].hWnd, NULL, FALSE);
}
#endif
InvalidateRect(hMemUsageHistoryGraph, NULL, FALSE);
}
void PerformancePage_OnViewShowKernelTimes(void)
{
HMENU hMenu;
HMENU hViewMenu;
ULONG i;
hMenu = GetMenu(hMainWnd);
hViewMenu = GetSubMenu(hMenu, 2);
hViewMenu = GetSubMenu(GetMenu(hMainWnd), 2);
/* Check or uncheck the show 16-bit tasks menu item */
/* Check or uncheck the show kernel times menu item */
if (GetMenuState(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND) & MF_CHECKED)
{
CheckMenuItem(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND|MF_UNCHECKED);
TaskManagerSettings.ShowKernelTimes = FALSE;
PerformancePageCpuUsageHistoryGraph.DrawSecondaryPlot = FALSE;
}
else
{
CheckMenuItem(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND|MF_CHECKED);
TaskManagerSettings.ShowKernelTimes = TRUE;
PerformancePageCpuUsageHistoryGraph.DrawSecondaryPlot = TRUE;
}
GraphCtrl_RedrawBitmap(&PerformancePageCpuUsageHistoryGraph, PerformancePageCpuUsageHistoryGraph.BitmapHeight);
for (i = 0; i < CpuTotalPanes; ++i)
{
CpuUsageHistoryGraphs[i].DrawSecondaryPlot = TaskManagerSettings.ShowKernelTimes;
GraphCtrl_RedrawBitmap(&CpuUsageHistoryGraphs[i], CpuUsageHistoryGraphs[i].BitmapHeight);
}
RefreshPerformancePage();
}
void PerformancePage_OnViewCPUHistoryOneGraphAll(void)
VOID
PerformancePage_OnViewCPUHistoryGraph(
_In_ BOOL bShowAll)
{
HMENU hMenu;
HMENU hViewMenu;
HMENU hCPUHistoryMenu;
ULONG i;
hMenu = GetMenu(hMainWnd);
hViewMenu = GetSubMenu(hMenu, 2);
hCPUHistoryMenu = GetSubMenu(hViewMenu, 3);
hCPUHistoryMenu = GetSubMenu(GetSubMenu(GetMenu(hMainWnd), 2), 3);
TaskManagerSettings.CPUHistory_OneGraphPerCPU = FALSE;
CheckMenuRadioItem(hCPUHistoryMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHALL, MF_BYCOMMAND);
}
void PerformancePage_OnViewCPUHistoryOneGraphPerCPU(void)
{
HMENU hMenu;
HMENU hViewMenu;
HMENU hCPUHistoryMenu;
hMenu = GetMenu(hMainWnd);
hViewMenu = GetSubMenu(hMenu, 2);
hCPUHistoryMenu = GetSubMenu(hViewMenu, 3);
TaskManagerSettings.CPUHistory_OneGraphPerCPU = TRUE;
CheckMenuRadioItem(hCPUHistoryMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, MF_BYCOMMAND);
TaskManagerSettings.CPUHistory_OneGraphPerCPU = !bShowAll;
CheckMenuRadioItem(hCPUHistoryMenu,
ID_VIEW_CPUHISTORY_ONEGRAPHALL,
ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU,
bShowAll ? ID_VIEW_CPUHISTORY_ONEGRAPHALL
: ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU,
MF_BYCOMMAND);
/* Start the loop at 1 for the other CPUs; always keep the first CPU pane around */
// ShowWindow(CpuUsageHistoryGraphs[0].hwndGraph, SW_SHOW);
for (i = 1; i < CpuTotalPanes; ++i)
{
ShowWindow(CpuUsageHistoryGraphs[i].hWnd, TaskManagerSettings.CPUHistory_OneGraphPerCPU ? SW_SHOW : SW_HIDE);
}
// RefreshPerformancePage();
}

View file

@ -12,5 +12,11 @@ INT_PTR CALLBACK PerformancePageWndProc(HWND hDlg, UINT message, WPARAM wParam,
void RefreshPerformancePage(void);
void PerformancePage_OnViewShowKernelTimes(void);
void PerformancePage_OnViewCPUHistoryOneGraphAll(void);
void PerformancePage_OnViewCPUHistoryOneGraphPerCPU(void);
VOID
PerformancePage_OnViewCPUHistoryGraph(
_In_ BOOL bShowAll);
#ifdef __cplusplus
};
#endif

View file

@ -16,6 +16,9 @@
#include <stdlib.h>
#include <stdarg.h>
#include <assert.h>
#define ASSERT assert
#define WIN32_NO_STATUS
#include <windef.h>
@ -33,8 +36,9 @@
#include "column.h"
#include "taskmgr.h"
#include "perfdata.h"
#include "procpage.h"
#include "applpage.h"
#include "procpage.h"
#include "perfpage.h"
#include "endproc.h"
#include "graph.h"
#include "graphctl.h"

View file

@ -33,10 +33,6 @@ BOOL bProcessPageSelectionMade = FALSE; /* Is item in ListCtrl selected */
static int nProcessPageWidth;
static int nProcessPageHeight;
#ifdef RUN_PROC_PAGE
static HANDLE hProcessThread = NULL;
static DWORD dwProcessThread;
#endif
int CALLBACK ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
void AddProcess(ULONG Index);
@ -45,7 +41,7 @@ void gethmsfromlargeint(LARGE_INTEGER largeint, DWORD *dwHours, DWORD *dwMinutes
void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam);
void ProcessPageShowContextMenu(DWORD dwProcessId);
BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, ULONG nMaxCount);
DWORD WINAPI ProcessPageRefreshThread(void *lpParameter);
DWORD WINAPI ProcessPageRefreshThread(PVOID Parameter);
int ProcessRunning(ULONG ProcessId);
void Cleanup(void)
@ -158,22 +154,12 @@ ProcessPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
*/
OldProcessListWndProc = (WNDPROC)SetWindowLongPtrW(hProcessPageListCtrl, GWLP_WNDPROC, (LONG_PTR)ProcessListWndProc);
#ifdef RUN_PROC_PAGE
/* Start our refresh thread */
hProcessThread = CreateThread(NULL, 0, ProcessPageRefreshThread, NULL, 0, &dwProcessThread);
#endif
/* Refresh page */
ProcessPageUpdate();
return TRUE;
case WM_DESTROY:
/* Close the event handle, this will make the */
/* refresh thread exit when the wait fails */
#ifdef RUN_PROC_PAGE
EndLocalThread(&hProcessThread, dwProcessThread);
#endif
SaveColumnSettings();
Cleanup();
break;
@ -447,24 +433,21 @@ void ProcessPageShowContextMenu(DWORD dwProcessId)
void RefreshProcessPage(void)
{
#ifdef RUN_PROC_PAGE
/* Signal the event so that our refresh thread */
/* will wake up and refresh the process page */
PostThreadMessage(dwProcessThread, WM_TIMER, 0, 0);
#endif
ProcessPageRefreshThread(NULL);
}
DWORD WINAPI ProcessPageRefreshThread(void *lpParameter)
DWORD WINAPI ProcessPageRefreshThread(PVOID Parameter)
{
MSG msg;
//MSG msg;
while (1) {
/* Wait for an the event or application close */
if (GetMessage(&msg, NULL, 0, 0) <= 0)
return 0;
if (msg.message == WM_TIMER) {
//while (1)
{
///* Wait for an the event or application close */
//if (GetMessage(&msg, NULL, 0, 0) <= 0)
// return 0;
//if (msg.message == WM_TIMER)
{
UpdateProcesses();
if (IsWindowVisible(hProcessPage))

View file

@ -122,8 +122,8 @@
#define IDC_MEM_USAGE_GRAPH2 1048
#define IDC_MEM_USAGE_GRAPH 1048
#define IDC_CPU30 1049
#define IDC_MEM_USAGE_HISTORY_GRAPH 1049
#define IDC_CPU_USAGE_HISTORY_GRAPH 1050
#define IDC_CPU_USAGE_HISTORY_GRAPH 1049
#define IDC_MEM_USAGE_HISTORY_GRAPH 1050
#define IDC_CPU31 1051
#define IDS_TOTALS_HANDLE_COUNT 1060

View file

@ -233,10 +233,10 @@ TaskManagerWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
PerformancePage_OnViewShowKernelTimes();
break;
case ID_VIEW_CPUHISTORY_ONEGRAPHALL:
PerformancePage_OnViewCPUHistoryOneGraphAll();
PerformancePage_OnViewCPUHistoryGraph(TRUE);
break;
case ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU:
PerformancePage_OnViewCPUHistoryOneGraphPerCPU();
PerformancePage_OnViewCPUHistoryGraph(FALSE);
break;
case ID_VIEW_UPDATESPEED_HIGH:
case ID_VIEW_UPDATESPEED_NORMAL:
@ -497,7 +497,8 @@ void FillSolidRect(HDC hDC, LPCRECT lpRect, COLORREF clr)
static void SetUpdateSpeed(HWND hWnd)
{
/* Setup update speed (pause=fall down) */
switch (TaskManagerSettings.UpdateSpeed) {
switch (TaskManagerSettings.UpdateSpeed)
{
case ID_VIEW_UPDATESPEED_HIGH:
SetTimer(hWnd, 1, 500, NULL);
break;
@ -693,9 +694,8 @@ BOOL OnCreate(HWND hWnd)
SetUpdateSpeed(hWnd);
/*
* Refresh the performance data
* Sample it twice so we can establish
* the delta values & cpu usage
* Refresh the performance data. Sample it twice
* so we can establish the delta values & cpu usage.
*/
PerfDataRefresh();
PerfDataRefresh();
@ -1106,6 +1106,7 @@ LPWSTR GetLastErrorText(LPWSTR lpszBuf, DWORD dwSize)
return lpszBuf;
}
#if 0
DWORD EndLocalThread(HANDLE *hThread, DWORD dwThread)
{
DWORD dwExitCodeThread = 0;
@ -1128,4 +1129,4 @@ DWORD EndLocalThread(HANDLE *hThread, DWORD dwThread)
}
return dwExitCodeThread;
}
#endif

View file

@ -9,10 +9,6 @@
#include "resource.h"
#define RUN_APPS_PAGE
#define RUN_PROC_PAGE
#define RUN_PERF_PAGE
#define STATUS_WINDOW 2001
#define STATUS_SIZE1 85
#define STATUS_SIZE2 157 // he-IL.rc determines minimum width: 72 == 157 - 85