From 0bf490ecc80dbd49777e90d2f8a00af1a87a58a5 Mon Sep 17 00:00:00 2001 From: Pavel Yosifovich Date: Sun, 19 Feb 2017 12:19:57 +0200 Subject: [PATCH] added CPUSTRES --- CPUSTRES/AffinityDlg.cpp | 164 ++++++++ CPUSTRES/AffinityDlg.h | 50 +++ CPUSTRES/CPUSTRES.sln | 28 ++ CPUSTRES/CPUStressEx.cpp | 123 ++++++ CPUSTRES/CPUStressEx.h | 35 ++ CPUSTRES/CPUStressEx.rc | 589 +++++++++++++++++++++++++++ CPUSTRES/CPUStressEx.vcxproj | 240 +++++++++++ CPUSTRES/CPUStressEx.vcxproj.filters | 103 +++++ CPUSTRES/ChildView.cpp | 358 ++++++++++++++++ CPUSTRES/ChildView.h | 79 ++++ CPUSTRES/Globals.cpp | 32 ++ CPUSTRES/Globals.h | 11 + CPUSTRES/Icons/gear_add.ico | Bin 0 -> 26694 bytes CPUSTRES/Icons/gear_delete.ico | Bin 0 -> 26694 bytes CPUSTRES/Icons/gear_pause.ico | Bin 0 -> 26694 bytes CPUSTRES/Icons/gear_run.ico | Bin 0 -> 26694 bytes CPUSTRES/MainDialogBar.cpp | 55 +++ CPUSTRES/MainDialogBar.h | 27 ++ CPUSTRES/MainFrm.cpp | 192 +++++++++ CPUSTRES/MainFrm.h | 57 +++ CPUSTRES/README.md | 3 + CPUSTRES/Thread.cpp | 88 ++++ CPUSTRES/Thread.h | 72 ++++ CPUSTRES/ThreadsListCtrl.cpp | 59 +++ CPUSTRES/ThreadsListCtrl.h | 36 ++ CPUSTRES/publish_config.json | 15 + CPUSTRES/res/CPUStressEx.ico | Bin 0 -> 26694 bytes CPUSTRES/res/CPUStressEx.rc2 | Bin 0 -> 806 bytes CPUSTRES/resource.h | 65 +++ CPUSTRES/stdafx.cpp | 8 + CPUSTRES/stdafx.h | 54 +++ CPUSTRES/targetver.h | 8 + Tools.sln | 11 + 33 files changed, 2562 insertions(+) create mode 100644 CPUSTRES/AffinityDlg.cpp create mode 100644 CPUSTRES/AffinityDlg.h create mode 100644 CPUSTRES/CPUSTRES.sln create mode 100644 CPUSTRES/CPUStressEx.cpp create mode 100644 CPUSTRES/CPUStressEx.h create mode 100644 CPUSTRES/CPUStressEx.rc create mode 100644 CPUSTRES/CPUStressEx.vcxproj create mode 100644 CPUSTRES/CPUStressEx.vcxproj.filters create mode 100644 CPUSTRES/ChildView.cpp create mode 100644 CPUSTRES/ChildView.h create mode 100644 CPUSTRES/Globals.cpp create mode 100644 CPUSTRES/Globals.h create mode 100644 CPUSTRES/Icons/gear_add.ico create mode 100644 CPUSTRES/Icons/gear_delete.ico create mode 100644 CPUSTRES/Icons/gear_pause.ico create mode 100644 CPUSTRES/Icons/gear_run.ico create mode 100644 CPUSTRES/MainDialogBar.cpp create mode 100644 CPUSTRES/MainDialogBar.h create mode 100644 CPUSTRES/MainFrm.cpp create mode 100644 CPUSTRES/MainFrm.h create mode 100644 CPUSTRES/README.md create mode 100644 CPUSTRES/Thread.cpp create mode 100644 CPUSTRES/Thread.h create mode 100644 CPUSTRES/ThreadsListCtrl.cpp create mode 100644 CPUSTRES/ThreadsListCtrl.h create mode 100644 CPUSTRES/publish_config.json create mode 100644 CPUSTRES/res/CPUStressEx.ico create mode 100644 CPUSTRES/res/CPUStressEx.rc2 create mode 100644 CPUSTRES/resource.h create mode 100644 CPUSTRES/stdafx.cpp create mode 100644 CPUSTRES/stdafx.h create mode 100644 CPUSTRES/targetver.h diff --git a/CPUSTRES/AffinityDlg.cpp b/CPUSTRES/AffinityDlg.cpp new file mode 100644 index 0000000..55c12f3 --- /dev/null +++ b/CPUSTRES/AffinityDlg.cpp @@ -0,0 +1,164 @@ +// AffinityDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "CPUStressEx.h" +#include "AffinityDlg.h" +#include "afxdialogex.h" +#include "Globals.h" +#include "Thread.h" + +// CAffinityDlg dialog + +IMPLEMENT_DYNAMIC(CAffinityDlg, CDialogEx) + +CAffinityDlg::CAffinityDlg(bool affinity, CThread* pThread, const CString& title, CWnd* pParent) + : CDialogEx(IDD_AFFINITY, pParent), m_Affinity(affinity), m_Title(title), m_pThread(pThread) { +} + +CAffinityDlg::CAffinityDlg(const CString& title, CWnd* pParent) : CDialogEx(IDD_AFFINITY, pParent), m_Title(title), m_Process(true), m_Affinity(true) { +} + +CAffinityDlg::~CAffinityDlg() { +} + +void CAffinityDlg::DoDataExchange(CDataExchange* pDX) { + CDialogEx::DoDataExchange(pDX); + if(!m_Affinity) { + DDX_Radio(pDX, IDC_FIRST, m_IdealCPU); + } +} + +BEGIN_MESSAGE_MAP(CAffinityDlg, CDialogEx) + ON_BN_CLICKED(IDC_SELECTALL, &CAffinityDlg::OnBnClickedSelectall) + ON_BN_CLICKED(IDC_UNSELECTALL, &CAffinityDlg::OnBnClickedUnselectall) +END_MESSAGE_MAP() + + +// CAffinityDlg message handlers + + +BOOL CAffinityDlg::OnInitDialog() { + + SetWindowText(m_Title); + + CRect rc; + GetDlgItem(IDC_DUMMY)->GetClientRect(&rc); + int cpus = CGlobals::GetProcessorCount(); + + DWORD_PTR processAffinity, systemAffinity; + BOOL validAffinity = FALSE; + + if(m_Affinity && m_Process) + validAffinity = ::GetProcessAffinityMask(::GetCurrentProcess(), &processAffinity, &systemAffinity); + + CString name; + int row = cpus > 32 ? 8 : 4; + auto font = GetFont(); + for(int i = 0; i < cpus; i++) { + name.Format(L"CPU %d", i); + m_Buttons[i].Create(name, WS_CHILD | WS_VISIBLE | (m_Affinity ? BS_AUTOCHECKBOX : BS_AUTORADIOBUTTON | (i == 0 ? WS_GROUP : 0) | WS_TABSTOP), + CRect(CPoint(10 + (rc.Width() + 10) * (i % row), 20 + (rc.Height() + 10) * (i / row)), CSize(rc.Width(), rc.Height())), + this, IDC_FIRST + i); + if(m_Affinity && m_pThread == nullptr) + CheckDlgButton(IDC_FIRST + i, (validAffinity && processAffinity & (1i64 << i)) == 0 ? BST_UNCHECKED : BST_CHECKED); + m_Buttons[i].SetFont(font); + } + + if(cpus > 16) { + CRect rcButton, rcWindow; + GetDlgItem(IDOK)->GetClientRect(&rcButton); + GetWindowRect(&rcWindow); + int sizex = row == 4 ? rcWindow.Width() : (rcWindow.Width() - rcButton.Width()) * 2 + rcButton.Width(); + if(row > 4) { + int x1 = sizex / 2 - rcButton.Width() - 20; + int x2 = sizex / 2 + 20; + CRect rcButton2; + GetDlgItem(IDOK)->GetWindowRect(&rcButton2); + ScreenToClient(&rcButton2); + GetDlgItem(IDOK)->MoveWindow(x1, rcButton2.top, rcButton.Width(), rcButton.Height()); + GetDlgItem(IDCANCEL)->MoveWindow(x2, rcButton2.top, rcButton.Width(), rcButton.Height()); + + GetDlgItem(IDC_SELECTALL)->MoveWindow(sizex - rcButton.Width() - 30, 20, rcButton.Width(), rcButton.Height()); + GetDlgItem(IDC_UNSELECTALL)->MoveWindow(sizex - rcButton.Width() - 30, 30 + rcButton.Height(), rcButton.Width(), rcButton.Height()); + } + SetWindowPos(nullptr, 0, 0, sizex, rcWindow.Height(), SWP_NOMOVE | SWP_NOZORDER); + } + + if(!m_Affinity) { + GetDlgItem(IDC_SELECTALL)->ShowWindow(SW_HIDE); + GetDlgItem(IDC_UNSELECTALL)->ShowWindow(SW_HIDE); + } + + if(m_Affinity && m_pThread) { + auto affinity = m_pThread->GetAffinity(); + int i = 0; + while(affinity) { + if(affinity & 1) + CheckDlgButton(IDC_FIRST + i, BST_CHECKED); + affinity >>= 1; + i++; + } + } + if(m_Affinity && !m_Process) + DisableNonProcessAffinity(); + + if(!m_Affinity) { + m_IdealCPU = m_pThread ? m_pThread->GetIdealCPU() : 0; + } + CDialogEx::OnInitDialog(); + + return TRUE; +} + +void CAffinityDlg::DisableNonProcessAffinity() { + DWORD_PTR processAffinity, systemAffinity; + if(!::GetProcessAffinityMask(::GetCurrentProcess(), &processAffinity, &systemAffinity)) + return; + + if(processAffinity == systemAffinity) + return; + + // disable CPUs that are not part of the process affinity mask + int n = 0; + while(processAffinity) { + if((processAffinity & 1) == 0) { + CheckDlgButton(IDC_FIRST + n, BST_UNCHECKED); + m_Buttons[n].EnableWindow(FALSE); + } + processAffinity >>= 1; + ++n; + } +} + +DWORD_PTR CAffinityDlg::CalcAffinity() { + DWORD_PTR affinity = 0; + for(int i = 0; i < CGlobals::GetProcessorCount(); i++) + if(m_Buttons[i].GetCheck() == BST_CHECKED) + affinity |= (DWORD_PTR)1 << i; + return affinity; +} + +void CAffinityDlg::OnOK() { + UpdateData(); + + if(m_Affinity) { + auto affinity = CalcAffinity(); + if(affinity == 0) { + AfxMessageBox(L"Affinity of zero is not allowed"); + return; + } + m_SelectedAfinity = affinity; + } + EndDialog(IDOK); +} + +void CAffinityDlg::OnBnClickedSelectall() { + for(int i = 0; i < CGlobals::GetProcessorCount(); i++) + CheckDlgButton(IDC_FIRST + i, BST_CHECKED); +} + +void CAffinityDlg::OnBnClickedUnselectall() { + for(int i = 0; i < CGlobals::GetProcessorCount(); i++) + CheckDlgButton(IDC_FIRST + i, BST_UNCHECKED); +} diff --git a/CPUSTRES/AffinityDlg.h b/CPUSTRES/AffinityDlg.h new file mode 100644 index 0000000..c70d70a --- /dev/null +++ b/CPUSTRES/AffinityDlg.h @@ -0,0 +1,50 @@ +#pragma once + +class CThread; + +// CAffinityDlg dialog + +class CAffinityDlg : public CDialogEx +{ + DECLARE_DYNAMIC(CAffinityDlg) + +public: + CAffinityDlg(bool affinity, CThread* pThread, const CString& title, CWnd* pParent = nullptr); + CAffinityDlg(const CString& title, CWnd* pParent = nullptr); + + virtual ~CAffinityDlg(); + +// Dialog Data +#ifdef AFX_DESIGN_TIME + enum { IDD = IDD_AFFINITY }; +#endif + + enum { IDC_FIRST = 100 }; + + DWORD_PTR GetSelectedAffinity() const { + return m_SelectedAfinity; + } + int GetSelectedCPU() const { + return m_IdealCPU; + } + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + DWORD_PTR CalcAffinity(); + void DisableNonProcessAffinity(); + + bool m_Affinity; + bool m_Process = false; + CString m_Title; + CButton m_Buttons[64]; + CThread* m_pThread; + DWORD_PTR m_SelectedAfinity; + int m_IdealCPU; + + DECLARE_MESSAGE_MAP() + virtual BOOL OnInitDialog(); + void OnOK() override; +public: + afx_msg void OnBnClickedSelectall(); + afx_msg void OnBnClickedUnselectall(); +}; diff --git a/CPUSTRES/CPUSTRES.sln b/CPUSTRES/CPUSTRES.sln new file mode 100644 index 0000000..91b0813 --- /dev/null +++ b/CPUSTRES/CPUSTRES.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CPUStressEx", "CPUStressEx.vcxproj", "{DC1EF85A-8628-457A-A805-49CCC97DF5BF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DC1EF85A-8628-457A-A805-49CCC97DF5BF}.Debug|Win32.ActiveCfg = Debug|Win32 + {DC1EF85A-8628-457A-A805-49CCC97DF5BF}.Debug|Win32.Build.0 = Debug|Win32 + {DC1EF85A-8628-457A-A805-49CCC97DF5BF}.Debug|x64.ActiveCfg = Debug|x64 + {DC1EF85A-8628-457A-A805-49CCC97DF5BF}.Debug|x64.Build.0 = Debug|x64 + {DC1EF85A-8628-457A-A805-49CCC97DF5BF}.Release|Win32.ActiveCfg = Release|Win32 + {DC1EF85A-8628-457A-A805-49CCC97DF5BF}.Release|Win32.Build.0 = Release|Win32 + {DC1EF85A-8628-457A-A805-49CCC97DF5BF}.Release|x64.ActiveCfg = Release|x64 + {DC1EF85A-8628-457A-A805-49CCC97DF5BF}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/CPUSTRES/CPUStressEx.cpp b/CPUSTRES/CPUStressEx.cpp new file mode 100644 index 0000000..6cd802a --- /dev/null +++ b/CPUSTRES/CPUStressEx.cpp @@ -0,0 +1,123 @@ + +// CPUStressEx.cpp : Defines the class behaviors for the application. +// + +#include "stdafx.h" +#include "afxwinappex.h" +#include "afxdialogex.h" +#include "CPUStressEx.h" +#include "MainFrm.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + + +// CCPUStressExApp + +BEGIN_MESSAGE_MAP(CCPUStressExApp, CWinApp) + ON_COMMAND(ID_APP_ABOUT, &CCPUStressExApp::OnAppAbout) +END_MESSAGE_MAP() + + +// CCPUStressExApp construction + +CCPUStressExApp::CCPUStressExApp() { + // TODO: replace application ID string below with unique ID string; recommended + // format for string is CompanyName.ProductName.SubProduct.VersionInformation + SetAppID(_T("CPUStressEx.AppID.NoVersion")); + + // TODO: add construction code here, + // Place all significant initialization in InitInstance +} + +// The one and only CCPUStressExApp object + +CCPUStressExApp theApp; + + +// CCPUStressExApp initialization + +BOOL CCPUStressExApp::InitInstance() { + int argc = 0; + auto argv = ::CommandLineToArgvW(::GetCommandLine(), &argc); + + ::SetThreadPriority(::GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); + + // InitCommonControlsEx() is required on Windows XP if an application + // manifest specifies use of ComCtl32.dll version 6 or later to enable + // visual styles. Otherwise, any window creation will fail. + INITCOMMONCONTROLSEX InitCtrls; + InitCtrls.dwSize = sizeof(InitCtrls); + // Set this to include all the common control classes you want to use + // in your application. + InitCtrls.dwICC = ICC_LISTVIEW_CLASSES; + InitCommonControlsEx(&InitCtrls); + + CWinApp::InitInstance(); + + // To create the main window, this code creates a new frame window + // object and then sets it as the application's main window object + CMainFrame* pFrame = new CMainFrame; + if (!pFrame) + return FALSE; + + m_pMainWnd = pFrame; + // create and load the frame with its resources + pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW, NULL, NULL); + pFrame->SetWindowPos(nullptr, 0, 0, 640, 400, SWP_NOMOVE | SWP_NOZORDER | SWP_NOREPOSITION); + + // The one and only window has been initialized, so show and update it + pFrame->ShowWindow(SW_SHOW); + pFrame->UpdateWindow(); + + return TRUE; +} + +int CCPUStressExApp::ExitInstance() { + //TODO: handle additional resources you may have added + return CWinApp::ExitInstance(); +} + +// CCPUStressExApp message handlers + + +// CAboutDlg dialog used for App About + +class CAboutDlg : public CDialogEx { +public: + CAboutDlg(); + + // Dialog Data +#ifdef AFX_DESIGN_TIME + enum { IDD = IDD_ABOUTBOX }; +#endif + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + +// Implementation +protected: + DECLARE_MESSAGE_MAP() +}; + +CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) { +} + +void CAboutDlg::DoDataExchange(CDataExchange* pDX) { + CDialogEx::DoDataExchange(pDX); +} + +BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) +END_MESSAGE_MAP() + +// App command to run the dialog +void CCPUStressExApp::OnAppAbout() { + CAboutDlg aboutDlg; + aboutDlg.DoModal(); +} + +// CCPUStressExApp message handlers + + + diff --git a/CPUSTRES/CPUStressEx.h b/CPUSTRES/CPUStressEx.h new file mode 100644 index 0000000..f1e215e --- /dev/null +++ b/CPUSTRES/CPUStressEx.h @@ -0,0 +1,35 @@ + +// CPUStressEx.h : main header file for the CPUStressEx application +// +#pragma once + +#ifndef __AFXWIN_H__ + #error "include 'stdafx.h' before including this file for PCH" +#endif + +#include "resource.h" // main symbols + + +// CCPUStressExApp: +// See CPUStressEx.cpp for the implementation of this class +// + +class CCPUStressExApp : public CWinApp +{ +public: + CCPUStressExApp(); + + +// Overrides +public: + virtual BOOL InitInstance(); + virtual int ExitInstance(); + +// Implementation + +public: + afx_msg void OnAppAbout(); + DECLARE_MESSAGE_MAP() +}; + +extern CCPUStressExApp theApp; diff --git a/CPUSTRES/CPUStressEx.rc b/CPUSTRES/CPUStressEx.rc new file mode 100644 index 0000000..dbf0cb0 --- /dev/null +++ b/CPUSTRES/CPUStressEx.rc @@ -0,0 +1,589 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#ifndef APSTUDIO_INVOKED +#include "targetver.h" +#endif +#include "afxres.h" +#include "verrsrc.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#ifndef APSTUDIO_INVOKED\r\n" + "#include ""targetver.h""\r\n" + "#endif\r\n" + "#include ""afxres.h""\r\n" + "#include ""verrsrc.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "#define _AFX_NO_OLE_RESOURCES\r\n" + "#define _AFX_NO_TRACKER_RESOURCES\r\n" + "#define _AFX_NO_PROPERTY_RESOURCES\r\n" + "\r\n" + "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" + "LANGUAGE 9, 1\r\n" + "#include ""res\\CPUStressEx.rc2"" // non-Microsoft Visual C++ edited resources\r\n" + "#include ""afxres.rc"" // Standard components\r\n" + "#endif\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDR_MAINFRAME ICON "res\\CPUStressEx.ico" + +IDI_KILL ICON "Icons\\gear_delete.ico" + +IDI_PAUSE ICON "Icons\\gear_pause.ico" + +IDI_PLAY ICON "Icons\\gear_run.ico" + +IDI_CREATE ICON "Icons\\gear_add.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDR_MAINFRAME MENU +BEGIN + POPUP "&File" + BEGIN + MENUITEM "E&xit", ID_APP_EXIT + END + POPUP "&Process" + BEGIN + POPUP "Priority &Class" + BEGIN + MENUITEM "&Idle", ID_PRIORITYCLASS_IDLE + MENUITEM "&Below Normal", ID_PRIORITYCLASS_BELOWNORMAL + MENUITEM "&Normal", ID_PRIORITYCLASS_NORMAL + MENUITEM "&Above Normal", ID_PRIORITYCLASS_ABOVENORMAL + MENUITEM "&High", ID_PRIORITYCLASS_HIGH + MENUITEM "&Realtime", ID_PRIORITYCLASS_REALTIME + END + MENUITEM SEPARATOR + MENUITEM "A&ffinity...", ID_PROCESS_AFFINITY + MENUITEM SEPARATOR + MENUITEM "Create &Thread", ID_PROCESS_CREATETHREAD + MENUITEM "Create &4 Threads", ID_PROCESS_CREATE4THREADS + MENUITEM SEPARATOR + MENUITEM "&Refresh\tF5", ID_PROCESS_REFRESH + END + POPUP "&Thread" + BEGIN + MENUITEM "&Activate", ID_THREAD_ACTIVATE + MENUITEM "&Deactivate", ID_THREAD_DEACTIVATE + MENUITEM SEPARATOR + POPUP "Activity &Level" + BEGIN + MENUITEM "&Low (25%)", ID_ACTIVITYLEVEL_LOW + MENUITEM "&Medium (50%)", ID_ACTIVITYLEVEL_MEDIUM + MENUITEM "&Busy (75%)", ID_ACTIVITYLEVEL_BUSY + MENUITEM "&Maximum (100%)", ID_ACTIVITYLEVEL_MAXIMUM + END + POPUP "&Priority" + BEGIN + MENUITEM "&Idle (-Sat)", ID_PRIORITY_IDLE + MENUITEM "&Lowest (-2)", ID_PRIORITY_LOWEST + MENUITEM "&Below Normal (-1)", ID_PRIORITY_BELOWNORMAL + MENUITEM "&Normal (0)", ID_PRIORITY_NORMAL + MENUITEM "&Above Normal (+1)", ID_PRIORITY_ABOVENORMAL + MENUITEM "&Highest (+2)", ID_PRIORITY_HIGHEST + MENUITEM "&Time Critical (+Sat)", ID_PRIORITY_TIMECRITICAL + END + MENUITEM SEPARATOR + MENUITEM "A&ffinity...", ID_THREAD_AFFINITY + MENUITEM "&Ideal CPU...", ID_THREAD_IDEALCPU + MENUITEM SEPARATOR + MENUITEM "&Kill", ID_THREAD_KILL + END + POPUP "&Options" + BEGIN + MENUITEM "&Always on Top", ID_OPTIONS_ALWAYSONTOP + MENUITEM "Auto Refresh Thread Indices", ID_OPTIONS_AUTOREFRESHTHREADINDICES, CHECKED + END + POPUP "&Help" + BEGIN + MENUITEM "&About CPUSTRES 2.0...", ID_APP_ABOUT + END +END + +IDR_CONTEXTMENU MENU +BEGIN + POPUP "thread" + BEGIN + MENUITEM "&Activate", ID_THREAD_ACTIVATE + MENUITEM "&Deactivate", ID_THREAD_DEACTIVATE + MENUITEM SEPARATOR + POPUP "Activity &Level" + BEGIN + MENUITEM "&Low (25%)", ID_ACTIVITYLEVEL_LOW + MENUITEM "&Medium (50%)", ID_ACTIVITYLEVEL_MEDIUM + MENUITEM "&Busy (75%)", ID_ACTIVITYLEVEL_BUSY + MENUITEM "&Maximum (100%)", ID_ACTIVITYLEVEL_MAXIMUM + END + POPUP "&Priority" + BEGIN + MENUITEM "&Idle (-Sat)", ID_PRIORITY_IDLE + MENUITEM "&Lowest (-2)", ID_PRIORITY_LOWEST + MENUITEM "&Below Normal (-1)", ID_PRIORITY_BELOWNORMAL + MENUITEM "&Normal (0)", ID_PRIORITY_NORMAL + MENUITEM "&Above Normal (+1)", ID_PRIORITY_ABOVENORMAL + MENUITEM "&Highest (+2)", ID_PRIORITY_HIGHEST + MENUITEM "&Time Critical (+Sat)", ID_PRIORITY_TIMECRITICAL + END + MENUITEM SEPARATOR + MENUITEM "A&ffinity...", ID_THREAD_AFFINITY + MENUITEM "&Ideal CPU...", ID_THREAD_IDEALCPU + MENUITEM SEPARATOR + MENUITEM "&Kill", ID_THREAD_KILL + END + POPUP "process" + BEGIN + POPUP "Priority &Class" + BEGIN + MENUITEM "&Idle", ID_PRIORITYCLASS_IDLE + MENUITEM "&Below Normal", ID_PRIORITYCLASS_BELOWNORMAL + MENUITEM "&Normal", ID_PRIORITYCLASS_NORMAL + MENUITEM "&Above Normal", ID_PRIORITYCLASS_ABOVENORMAL + MENUITEM "&High", ID_PRIORITYCLASS_HIGH + MENUITEM "&Realtime", ID_PRIORITYCLASS_REALTIME + END + MENUITEM SEPARATOR + MENUITEM "Process A&ffinity...", ID_PROCESS_AFFINITY + MENUITEM SEPARATOR + MENUITEM "Create &Thread", ID_PROCESS_CREATETHREAD + MENUITEM "Create &4 Threads", ID_PROCESS_CREATE4THREADS + END + POPUP "activity" + BEGIN + MENUITEM "&Low (25%)", ID_ACTIVITYLEVEL_LOW + MENUITEM "&Medium (50%)", ID_ACTIVITYLEVEL_MEDIUM + MENUITEM "&Busy (75%)", ID_ACTIVITYLEVEL_BUSY + MENUITEM "&Maximum (100%)", ID_ACTIVITYLEVEL_MAXIMUM + END + POPUP "priority" + BEGIN + MENUITEM "&Idle (-Sat)", ID_PRIORITY_IDLE + MENUITEM "&Lowest (-2)", ID_PRIORITY_LOWEST + MENUITEM "&Below Normal (-1)", ID_PRIORITY_BELOWNORMAL + MENUITEM "&Normal (0)", ID_PRIORITY_NORMAL + MENUITEM "&Above Normal (+1)", ID_PRIORITY_ABOVENORMAL + MENUITEM "&Highest (+2)", ID_PRIORITY_HIGHEST + MENUITEM "&Time Critical (+Sat)", ID_PRIORITY_TIMECRITICAL + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Accelerator +// + +IDR_MAINFRAME ACCELERATORS +BEGIN + "C", ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT + VK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT + VK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT, NOINVERT + "X", ID_EDIT_CUT, VIRTKEY, CONTROL, NOINVERT + "V", ID_EDIT_PASTE, VIRTKEY, CONTROL, NOINVERT + VK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT, NOINVERT + VK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT, NOINVERT + "Z", ID_EDIT_UNDO, VIRTKEY, CONTROL, NOINVERT + VK_F6, ID_NEXT_PANE, VIRTKEY, NOINVERT + VK_F6, ID_PREV_PANE, VIRTKEY, SHIFT, NOINVERT + VK_F5, ID_PROCESS_REFRESH, VIRTKEY, NOINVERT +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_ABOUTBOX DIALOGEX 0, 0, 263, 84 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "About CPUStressEx" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + ICON IDR_MAINFRAME,IDC_STATIC,14,14,20,20 + LTEXT "CPUSTRES v2.0",IDC_STATIC,42,14,114,8,SS_NOPREFIX + LTEXT "Copyright (C) 2016 Pavel Yosifovich",IDC_STATIC,42,26,170,8 + DEFPUSHBUTTON "OK",IDOK,106,63,50,14,WS_GROUP + CONTROL "Sysinternals - www.sysinternals.com",IDC_LINK,"MfcLink",WS_TABSTOP,39,38,182,14 +END + +IDR_MAINFRAME DIALOGEX 0, 0, 438, 30 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "",ID_THREAD_ACTIVATE,"MfcButton",WS_TABSTOP,0,0,29,24 + CONTROL "",ID_THREAD_DEACTIVATE,"MfcButton",WS_TABSTOP,31,0,29,24 + CONTROL "",ID_PROCESS_CREATETHREAD,"MfcButton",WS_TABSTOP,77,0,29,24 + CONTROL "",ID_THREAD_KILL,"MfcButton",WS_TABSTOP,111,0,29,24 + LTEXT "Process Affinity:",IDC_PROCESS_AFFINITY,148,1,289,8 + LTEXT "Process Priority Class:",IDC_PRIORITYCLASS,148,16,167,8 +END + +IDD_AFFINITY DIALOGEX 0, 0, 239, 165 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Affinity" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,61,144,50,14 + PUSHBUTTON "Cancel",IDCANCEL,127,144,50,14 + CONTROL "CPU 0",IDC_DUMMY,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,7,7,35,10 + PUSHBUTTON "Select All",IDC_SELECTALL,182,7,50,14 + PUSHBUTTON "Unselect All",IDC_UNSELECTALL,182,28,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 2,0,0,0 + PRODUCTVERSION 2,0,0,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Windows Internals Book Tools" + VALUE "FileDescription", "CPU Stress" + VALUE "FileVersion", "2.0.0.0" + VALUE "InternalName", "CPUSTRES" + VALUE "LegalCopyright", "Copyright (C) 2016 by Pavel Yosifovich" + VALUE "OriginalFilename", "CPUSTRES" + VALUE "ProductName", "Sysinternals CPUSTRES" + VALUE "ProductVersion", "2.0.0.0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_ABOUTBOX, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 256 + TOPMARGIN, 7 + BOTTOMMARGIN, 77 + END + + IDR_MAINFRAME, DIALOG + BEGIN + RIGHTMARGIN, 332 + BOTTOMMARGIN, 24 + END + + IDD_AFFINITY, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 232 + TOPMARGIN, 7 + BOTTOMMARGIN, 158 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// AFX_DIALOG_LAYOUT +// + +IDR_MAINFRAME AFX_DIALOG_LAYOUT +BEGIN + 0 +END + +IDD_AFFINITY AFX_DIALOG_LAYOUT +BEGIN + 0 +END + +IDD_ABOUTBOX AFX_DIALOG_LAYOUT +BEGIN + 0 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog Info +// + +IDR_MAINFRAME DLGINIT +BEGIN + ID_THREAD_ACTIVATE, 0x37c, 471, 0 +0x4d3c, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x535f, 0x7974, 0x656c, 0x353e, +0x2f3c, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, 0x7453, 0x6c79, 0x3e65, +0x4d3c, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x415f, 0x7475, 0x736f, 0x7a69, +0x3e65, 0x4146, 0x534c, 0x3c45, 0x4d2f, 0x4346, 0x7542, 0x7474, 0x6e6f, +0x415f, 0x7475, 0x736f, 0x7a69, 0x3e65, 0x4d3c, 0x4346, 0x7542, 0x7474, +0x6e6f, 0x545f, 0x6f6f, 0x746c, 0x7069, 0x413e, 0x7463, 0x7669, 0x7461, +0x2065, 0x6854, 0x6572, 0x6461, 0x3c73, 0x4d2f, 0x4346, 0x7542, 0x7474, +0x6e6f, 0x545f, 0x6f6f, 0x746c, 0x7069, 0x3c3e, 0x464d, 0x4243, 0x7475, +0x6f74, 0x5f6e, 0x7546, 0x6c6c, 0x6554, 0x7478, 0x6f54, 0x6c6f, 0x463e, +0x4c41, 0x4553, 0x2f3c, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, 0x7546, +0x6c6c, 0x6554, 0x7478, 0x6f54, 0x6c6f, 0x3c3e, 0x464d, 0x4243, 0x7475, +0x6f74, 0x5f6e, 0x7543, 0x7372, 0x726f, 0x7954, 0x6570, 0x313e, 0x3c31, +0x4d2f, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x435f, 0x7275, 0x6f73, 0x5472, +0x7079, 0x3e65, 0x4d3c, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x495f, 0x616d, +0x6567, 0x7954, 0x6570, 0x393e, 0x2f3c, 0x464d, 0x4243, 0x7475, 0x6f74, +0x5f6e, 0x6d49, 0x6761, 0x5465, 0x7079, 0x3e65, 0x4d3c, 0x4346, 0x7542, +0x7474, 0x6e6f, 0x495f, 0x616d, 0x6567, 0x4449, 0x333e, 0x3231, 0x2f3c, +0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, 0x6d49, 0x6761, 0x4965, 0x3e44, +0x4d3c, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x495f, 0x616d, 0x6567, 0x493e, +0x4944, 0x505f, 0x414c, 0x3c59, 0x4d2f, 0x4346, 0x7542, 0x7474, 0x6e6f, +0x495f, 0x616d, 0x6567, 0x3c3e, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, +0x6d49, 0x6761, 0x4f65, 0x546e, 0x706f, 0x463e, 0x4c41, 0x4553, 0x2f3c, +0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, 0x6d49, 0x6761, 0x4f65, 0x546e, +0x706f, 0x3c3e, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, 0x6d49, 0x6761, +0x4f65, 0x526e, 0x6769, 0x7468, 0x463e, 0x4c41, 0x4553, 0x2f3c, 0x464d, +0x4243, 0x7475, 0x6f74, 0x5f6e, 0x6d49, 0x6761, 0x4f65, 0x526e, 0x6769, +0x7468, "\076" + ID_THREAD_DEACTIVATE, 0x37c, 474, 0 +0x4d3c, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x535f, 0x7974, 0x656c, 0x353e, +0x2f3c, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, 0x7453, 0x6c79, 0x3e65, +0x4d3c, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x415f, 0x7475, 0x736f, 0x7a69, +0x3e65, 0x4146, 0x534c, 0x3c45, 0x4d2f, 0x4346, 0x7542, 0x7474, 0x6e6f, +0x415f, 0x7475, 0x736f, 0x7a69, 0x3e65, 0x4d3c, 0x4346, 0x7542, 0x7474, +0x6e6f, 0x545f, 0x6f6f, 0x746c, 0x7069, 0x443e, 0x6165, 0x7463, 0x7669, +0x7461, 0x2065, 0x6854, 0x6572, 0x6461, 0x3c73, 0x4d2f, 0x4346, 0x7542, +0x7474, 0x6e6f, 0x545f, 0x6f6f, 0x746c, 0x7069, 0x3c3e, 0x464d, 0x4243, +0x7475, 0x6f74, 0x5f6e, 0x7546, 0x6c6c, 0x6554, 0x7478, 0x6f54, 0x6c6f, +0x463e, 0x4c41, 0x4553, 0x2f3c, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, +0x7546, 0x6c6c, 0x6554, 0x7478, 0x6f54, 0x6c6f, 0x3c3e, 0x464d, 0x4243, +0x7475, 0x6f74, 0x5f6e, 0x7543, 0x7372, 0x726f, 0x7954, 0x6570, 0x313e, +0x3c31, 0x4d2f, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x435f, 0x7275, 0x6f73, +0x5472, 0x7079, 0x3e65, 0x4d3c, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x495f, +0x616d, 0x6567, 0x7954, 0x6570, 0x393e, 0x2f3c, 0x464d, 0x4243, 0x7475, +0x6f74, 0x5f6e, 0x6d49, 0x6761, 0x5465, 0x7079, 0x3e65, 0x4d3c, 0x4346, +0x7542, 0x7474, 0x6e6f, 0x495f, 0x616d, 0x6567, 0x4449, 0x333e, 0x3431, +0x2f3c, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, 0x6d49, 0x6761, 0x4965, +0x3e44, 0x4d3c, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x495f, 0x616d, 0x6567, +0x493e, 0x4944, 0x505f, 0x5541, 0x4553, 0x2f3c, 0x464d, 0x4243, 0x7475, +0x6f74, 0x5f6e, 0x6d49, 0x6761, 0x3e65, 0x4d3c, 0x4346, 0x7542, 0x7474, +0x6e6f, 0x495f, 0x616d, 0x6567, 0x6e4f, 0x6f54, 0x3e70, 0x4146, 0x534c, +0x3c45, 0x4d2f, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x495f, 0x616d, 0x6567, +0x6e4f, 0x6f54, 0x3e70, 0x4d3c, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x495f, +0x616d, 0x6567, 0x6e4f, 0x6952, 0x6867, 0x3e74, 0x4146, 0x534c, 0x3c45, +0x4d2f, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x495f, 0x616d, 0x6567, 0x6e4f, +0x6952, 0x6867, 0x3e74, + ID_PROCESS_CREATETHREAD, 0x37c, 471, 0 +0x4d3c, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x535f, 0x7974, 0x656c, 0x353e, +0x2f3c, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, 0x7453, 0x6c79, 0x3e65, +0x4d3c, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x415f, 0x7475, 0x736f, 0x7a69, +0x3e65, 0x4146, 0x534c, 0x3c45, 0x4d2f, 0x4346, 0x7542, 0x7474, 0x6e6f, +0x415f, 0x7475, 0x736f, 0x7a69, 0x3e65, 0x4d3c, 0x4346, 0x7542, 0x7474, +0x6e6f, 0x545f, 0x6f6f, 0x746c, 0x7069, 0x433e, 0x6572, 0x7461, 0x2065, +0x6854, 0x6572, 0x6461, 0x3c73, 0x4d2f, 0x4346, 0x7542, 0x7474, 0x6e6f, +0x545f, 0x6f6f, 0x746c, 0x7069, 0x3c3e, 0x464d, 0x4243, 0x7475, 0x6f74, +0x5f6e, 0x7546, 0x6c6c, 0x6554, 0x7478, 0x6f54, 0x6c6f, 0x463e, 0x4c41, +0x4553, 0x2f3c, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, 0x7546, 0x6c6c, +0x6554, 0x7478, 0x6f54, 0x6c6f, 0x3c3e, 0x464d, 0x4243, 0x7475, 0x6f74, +0x5f6e, 0x7543, 0x7372, 0x726f, 0x7954, 0x6570, 0x313e, 0x3c31, 0x4d2f, +0x4346, 0x7542, 0x7474, 0x6e6f, 0x435f, 0x7275, 0x6f73, 0x5472, 0x7079, +0x3e65, 0x4d3c, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x495f, 0x616d, 0x6567, +0x7954, 0x6570, 0x393e, 0x2f3c, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, +0x6d49, 0x6761, 0x5465, 0x7079, 0x3e65, 0x4d3c, 0x4346, 0x7542, 0x7474, +0x6e6f, 0x495f, 0x616d, 0x6567, 0x4449, 0x333e, 0x3631, 0x2f3c, 0x464d, +0x4243, 0x7475, 0x6f74, 0x5f6e, 0x6d49, 0x6761, 0x4965, 0x3e44, 0x4d3c, +0x4346, 0x7542, 0x7474, 0x6e6f, 0x495f, 0x616d, 0x6567, 0x493e, 0x4944, +0x435f, 0x4552, 0x5441, 0x3c45, 0x4d2f, 0x4346, 0x7542, 0x7474, 0x6e6f, +0x495f, 0x616d, 0x6567, 0x3c3e, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, +0x6d49, 0x6761, 0x4f65, 0x546e, 0x706f, 0x463e, 0x4c41, 0x4553, 0x2f3c, +0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, 0x6d49, 0x6761, 0x4f65, 0x546e, +0x706f, 0x3c3e, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, 0x6d49, 0x6761, +0x4f65, 0x526e, 0x6769, 0x7468, 0x463e, 0x4c41, 0x4553, 0x2f3c, 0x464d, +0x4243, 0x7475, 0x6f74, 0x5f6e, 0x6d49, 0x6761, 0x4f65, 0x526e, 0x6769, +0x7468, "\076" + ID_THREAD_KILL, 0x37c, 467, 0 +0x4d3c, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x535f, 0x7974, 0x656c, 0x353e, +0x2f3c, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, 0x7453, 0x6c79, 0x3e65, +0x4d3c, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x415f, 0x7475, 0x736f, 0x7a69, +0x3e65, 0x4146, 0x534c, 0x3c45, 0x4d2f, 0x4346, 0x7542, 0x7474, 0x6e6f, +0x415f, 0x7475, 0x736f, 0x7a69, 0x3e65, 0x4d3c, 0x4346, 0x7542, 0x7474, +0x6e6f, 0x545f, 0x6f6f, 0x746c, 0x7069, 0x4b3e, 0x6c69, 0x206c, 0x6854, +0x6572, 0x6461, 0x3c73, 0x4d2f, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x545f, +0x6f6f, 0x746c, 0x7069, 0x3c3e, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, +0x7546, 0x6c6c, 0x6554, 0x7478, 0x6f54, 0x6c6f, 0x463e, 0x4c41, 0x4553, +0x2f3c, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, 0x7546, 0x6c6c, 0x6554, +0x7478, 0x6f54, 0x6c6f, 0x3c3e, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, +0x7543, 0x7372, 0x726f, 0x7954, 0x6570, 0x313e, 0x3c31, 0x4d2f, 0x4346, +0x7542, 0x7474, 0x6e6f, 0x435f, 0x7275, 0x6f73, 0x5472, 0x7079, 0x3e65, +0x4d3c, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x495f, 0x616d, 0x6567, 0x7954, +0x6570, 0x393e, 0x2f3c, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, 0x6d49, +0x6761, 0x5465, 0x7079, 0x3e65, 0x4d3c, 0x4346, 0x7542, 0x7474, 0x6e6f, +0x495f, 0x616d, 0x6567, 0x4449, 0x333e, 0x3331, 0x2f3c, 0x464d, 0x4243, +0x7475, 0x6f74, 0x5f6e, 0x6d49, 0x6761, 0x4965, 0x3e44, 0x4d3c, 0x4346, +0x7542, 0x7474, 0x6e6f, 0x495f, 0x616d, 0x6567, 0x493e, 0x4944, 0x4b5f, +0x4c49, 0x3c4c, 0x4d2f, 0x4346, 0x7542, 0x7474, 0x6e6f, 0x495f, 0x616d, +0x6567, 0x3c3e, 0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, 0x6d49, 0x6761, +0x4f65, 0x546e, 0x706f, 0x463e, 0x4c41, 0x4553, 0x2f3c, 0x464d, 0x4243, +0x7475, 0x6f74, 0x5f6e, 0x6d49, 0x6761, 0x4f65, 0x546e, 0x706f, 0x3c3e, +0x464d, 0x4243, 0x7475, 0x6f74, 0x5f6e, 0x6d49, 0x6761, 0x4f65, 0x526e, +0x6769, 0x7468, 0x463e, 0x4c41, 0x4553, 0x2f3c, 0x464d, 0x4243, 0x7475, +0x6f74, 0x5f6e, 0x6d49, 0x6761, 0x4f65, 0x526e, 0x6769, 0x7468, "\076" + 0 +END + +IDD_ABOUTBOX DLGINIT +BEGIN + IDC_LINK, 0x37c, 184, 0 +0x4d3c, 0x4346, 0x694c, 0x6b6e, 0x555f, 0x6c72, 0x683e, 0x7474, 0x3a70, +0x2f2f, 0x7777, 0x2e77, 0x7973, 0x6973, 0x746e, 0x7265, 0x616e, 0x736c, +0x632e, 0x6d6f, 0x2f3c, 0x464d, 0x4c43, 0x6e69, 0x5f6b, 0x7255, 0x3e6c, +0x4d3c, 0x4346, 0x694c, 0x6b6e, 0x555f, 0x6c72, 0x7250, 0x6665, 0x7869, +0x3c3e, 0x4d2f, 0x4346, 0x694c, 0x6b6e, 0x555f, 0x6c72, 0x7250, 0x6665, +0x7869, 0x3c3e, 0x464d, 0x4c43, 0x6e69, 0x5f6b, 0x6f54, 0x6c6f, 0x6974, +0x3e70, 0x2f3c, 0x464d, 0x4c43, 0x6e69, 0x5f6b, 0x6f54, 0x6c6f, 0x6974, +0x3e70, 0x4d3c, 0x4346, 0x694c, 0x6b6e, 0x465f, 0x6c75, 0x546c, 0x7865, +0x5474, 0x6f6f, 0x746c, 0x7069, 0x463e, 0x4c41, 0x4553, 0x2f3c, 0x464d, +0x4c43, 0x6e69, 0x5f6b, 0x7546, 0x6c6c, 0x6554, 0x7478, 0x6f54, 0x6c6f, +0x6974, 0x3e70, + 0 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDR_MAINFRAME "CPU Stress (PID: $)" +END + +STRINGTABLE +BEGIN + AFX_IDS_APP_TITLE "CPU Stress" + AFX_IDS_IDLEMESSAGE "Ready" +END + +STRINGTABLE +BEGIN + ID_APP_ABOUT "Display program information, version number and copyright\nAbout" + ID_APP_EXIT "Quit the application; prompts to save documents\nExit" +END + +STRINGTABLE +BEGIN + ID_NEXT_PANE "Switch to the next window pane\nNext Pane" + ID_PREV_PANE "Switch back to the previous window pane\nPrevious Pane" +END + +STRINGTABLE +BEGIN + ID_EDIT_CLEAR "Erase the selection\nErase" + ID_EDIT_CLEAR_ALL "Erase everything\nErase All" + ID_EDIT_SELECT_ALL "Select the entire document\nSelect All" + ID_EDIT_UNDO "Undo the last action\nUndo" + ID_EDIT_REDO "Redo the previously undone action\nRedo" +END + +STRINGTABLE +BEGIN + AFX_IDS_SCSIZE "Change the window size" + AFX_IDS_SCMOVE "Change the window position" + AFX_IDS_SCMINIMIZE "Reduce the window to an icon" + AFX_IDS_SCMAXIMIZE "Enlarge the window to full size" + AFX_IDS_SCNEXTWINDOW "Switch to the next document window" + AFX_IDS_SCPREVWINDOW "Switch to the previous document window" + AFX_IDS_SCCLOSE "Close the active window and prompts to save the documents" +END + +STRINGTABLE +BEGIN + AFX_IDS_SCRESTORE "Restore the window to normal size" + AFX_IDS_SCTASKLIST "Activate Task List" +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#define _AFX_NO_OLE_RESOURCES +#define _AFX_NO_TRACKER_RESOURCES +#define _AFX_NO_PROPERTY_RESOURCES + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE 9, 1 +#include "res\CPUStressEx.rc2" // non-Microsoft Visual C++ edited resources +#include "afxres.rc" // Standard components +#endif + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/CPUSTRES/CPUStressEx.vcxproj b/CPUSTRES/CPUStressEx.vcxproj new file mode 100644 index 0000000..a5ad904 --- /dev/null +++ b/CPUSTRES/CPUStressEx.vcxproj @@ -0,0 +1,240 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {DC1EF85A-8628-457A-A805-49CCC97DF5BF} + CPUStressEx + 8.1 + MFCProj + CPUSTRES + + + + Application + true + v140_xp + Unicode + Dynamic + + + Application + false + v140_xp + true + Unicode + Static + + + Application + true + v120_xp + Unicode + Dynamic + + + Application + false + v120_xp + true + Unicode + Static + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + true + + + false + true + + + + Use + Level3 + Disabled + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + true + + + Windows + true + + + false + true + _DEBUG;%(PreprocessorDefinitions) + + + 0x0409 + _DEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + Use + Level3 + Disabled + _WINDOWS;_DEBUG;%(PreprocessorDefinitions) + true + + + Windows + + + false + true + _DEBUG;%(PreprocessorDefinitions) + + + 0x0409 + _DEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + true + + + Windows + true + true + + + false + true + NDEBUG;%(PreprocessorDefinitions) + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + Level3 + Use + MaxSpeed + true + true + _WINDOWS;NDEBUG;%(PreprocessorDefinitions) + true + + + Windows + true + true + + + false + true + NDEBUG;%(PreprocessorDefinitions) + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + PreserveNewest + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CPUSTRES/CPUStressEx.vcxproj.filters b/CPUSTRES/CPUStressEx.vcxproj.filters new file mode 100644 index 0000000..fc4164b --- /dev/null +++ b/CPUSTRES/CPUStressEx.vcxproj.filters @@ -0,0 +1,103 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Resource Files + + + + + Resource Files + + + + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + \ No newline at end of file diff --git a/CPUSTRES/ChildView.cpp b/CPUSTRES/ChildView.cpp new file mode 100644 index 0000000..7f31a6f --- /dev/null +++ b/CPUSTRES/ChildView.cpp @@ -0,0 +1,358 @@ + +// ChildView.cpp : implementation of the CChildView class +// + +#include "stdafx.h" +#include "CPUStressEx.h" +#include "ChildView.h" +#include "AffinityDlg.h" +#include "Globals.h" + +using namespace std; + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + + +// CChildView + +CChildView::CChildView() : m_List(m_Threads) {} + +CChildView::~CChildView() {} + +BEGIN_MESSAGE_MAP(CChildView, CWnd) + ON_WM_PAINT() + ON_WM_CREATE() + ON_WM_SIZE() + ON_COMMAND(ID_THREAD_ACTIVATE, &CChildView::OnThreadActivate) + ON_UPDATE_COMMAND_UI(ID_THREAD_ACTIVATE, &CChildView::OnUpdateThreadActivate) + ON_WM_ERASEBKGND() + ON_COMMAND(ID_THREAD_DEACTIVATE, &CChildView::OnThreadDeactivate) + ON_UPDATE_COMMAND_UI(ID_THREAD_DEACTIVATE, &CChildView::OnUpdateThreadDeactivate) + + ON_COMMAND_RANGE(ID_ACTIVITYLEVEL_LOW, ID_ACTIVITYLEVEL_MAXIMUM, OnChangeThreadActivity) + ON_UPDATE_COMMAND_UI_RANGE(ID_ACTIVITYLEVEL_LOW, ID_ACTIVITYLEVEL_MAXIMUM, OnUpdateChangeThreadActivity) + + ON_COMMAND(ID_PROCESS_CREATETHREAD, &CChildView::OnProcessCreatethread) + ON_UPDATE_COMMAND_UI(ID_PROCESS_CREATETHREAD, &CChildView::OnUpdateProcessCreatethread) + ON_COMMAND(ID_PROCESS_CREATE4THREADS, &CChildView::OnProcessCreate4threads) + ON_UPDATE_COMMAND_UI(ID_PROCESS_CREATE4THREADS, &CChildView::OnUpdateProcessCreate4threads) + ON_COMMAND_RANGE(ID_PRIORITY_IDLE, ID_PRIORITY_TIMECRITICAL, OnChangeThreadPriority) + ON_UPDATE_COMMAND_UI_RANGE(ID_PRIORITY_IDLE, ID_PRIORITY_TIMECRITICAL, OnUpdateChangeThreadPriority) + + ON_NOTIFY(NM_RCLICK, IDC_LIST, OnRClickList) + ON_COMMAND(ID_THREAD_AFFINITY, &CChildView::OnThreadAffinity) + ON_UPDATE_COMMAND_UI(ID_THREAD_AFFINITY, OnUpdateChangeThreadPriority) + + ON_COMMAND(ID_THREAD_IDEALCPU, &CChildView::OnThreadIdealcpu) + ON_UPDATE_COMMAND_UI(ID_THREAD_IDEALCPU, OnUpdateChangeThreadPriority) + ON_COMMAND(ID_THREAD_KILL, &CChildView::OnThreadKill) + ON_UPDATE_COMMAND_UI(ID_THREAD_KILL, OnUpdateChangeThreadPriority) + ON_WM_TIMER() + ON_COMMAND(ID_PROCESS_REFRESH, &CChildView::OnProcessRefresh) + ON_COMMAND(ID_OPTIONS_AUTOREFRESHTHREADINDICES, &CChildView::OnOptionsAutorefreshthreadindices) + ON_UPDATE_COMMAND_UI(ID_OPTIONS_AUTOREFRESHTHREADINDICES, &CChildView::OnUpdateOptionsAutorefreshthreadindices) +END_MESSAGE_MAP() + +void CChildView::DoDataExchange(CDataExchange* pDX) { + CWnd::DoDataExchange(pDX); + + DDX_Control(pDX, IDC_LIST, m_List); +} + +// CChildView message handlers + +BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) { + if (!CWnd::PreCreateWindow(cs)) + return FALSE; + + cs.dwExStyle |= WS_EX_CLIENTEDGE; + cs.style &= ~WS_BORDER; + cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, + ::LoadCursor(NULL, IDC_ARROW), reinterpret_cast(COLOR_WINDOW + 1), NULL); + + return TRUE; +} + +void CChildView::OnRClickList(NMHDR*, LRESULT*) { + CPoint pt; + ::GetCursorPos(&pt); + CPoint screen(pt); + m_List.ScreenToClient(&pt); + int item = m_List.HitTest(pt); + CMenu menu; + menu.LoadMenu(IDR_CONTEXTMENU); + menu.GetSubMenu(item < 0 ? 1 : 0)->TrackPopupMenu(TPM_RIGHTBUTTON, screen.x, screen.y, AfxGetMainWnd()); +} + +void CChildView::OnPaint() { + CPaintDC dc(this); +} + +int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) { + if (CWnd::OnCreate(lpCreateStruct) == -1) + return -1; + + m_List.Create(WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER, + CRect(), this, IDC_LIST); + m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_AUTOSIZECOLUMNS | LVS_EX_FLATSB); + + m_List.InsertColumn(0, L"#", 0, 60); + m_List.InsertColumn(1, L"ID", LVCFMT_LEFT, 60); + m_List.InsertColumn(2, L"Active?", LVCFMT_CENTER, 80); + m_List.InsertColumn(3, L"Activity", LVCFMT_LEFT, 80); + m_List.InsertColumn(4, L"Priority", LVCFMT_LEFT, 100); + m_List.InsertColumn(5, L"Ideal CPU", LVCFMT_CENTER, 80); + m_List.InsertColumn(6, L"Affinity", LVCFMT_RIGHT, 120); + + CreateThreads(); + + SetTimer(1, 10000, nullptr); + + return 0; +} + +void CChildView::CreateThreads() { + for (int i = 0; i < 4; i++) { + auto thread = CreateThread(); + if (i == 0) + thread->Resume(); + AddThread(thread); + } + UpdateThreadProcessIndices(); +} + +void CChildView::AddThread(unique_ptr& thread) { + CString number; + number.Format(L"%d", m_List.GetItemCount() + 1); + int n = m_List.InsertItem(m_List.GetItemCount(), number); + number.Format(L"%d", thread->GetThreadId()); + m_List.SetItemText(n, 1, number); + UpdateThread(n, thread.get()); + + m_Threads.push_back(move(thread)); +} + +void CChildView::UpdateThread(int n, const CThread* thread) { + if (thread == nullptr) + thread = reinterpret_cast(m_List.GetItemData(n)); + CString str; + m_List.SetItemText(n, 2, thread->IsActive() ? L"Yes" : L""); + m_List.SetItemText(n, 3, ActivityLevelToString(thread->GetActivityLevel())); + m_List.SetItemText(n, 4, ThreadPriorityToString(thread->GetPriority())); + str.Format(L"%d", thread->GetIdealCPU()); + m_List.SetItemText(n, 5, str); + WCHAR buffer[65]; + _ui64tow_s(thread->GetAffinity(), buffer, 65, 2); + m_List.SetItemText(n, 6, buffer); + + m_List.SetItemData(n, reinterpret_cast(thread)); +} + +PCWSTR CChildView::ActivityLevelToString(ActivityLevel level) { + static const PCWSTR Levels[] = { L"Low", L"Medium", L"Busy", L"Maximum" }; + return Levels[(int)level - 1]; +} + +PCWSTR CChildView::ThreadPriorityToString(int priority) { + static const PCWSTR Levels[] = { + L"Idle", L"Lowest", L"Below Normal", L"Normal", L"Above Normal", L"Highest", L"Time Critical" + }; + return Levels[3 + (::abs(priority) == 15 ? priority - 12 * priority / 15 : priority)]; +} + +void CChildView::UpdateThreadProcessIndices() { + auto threads = CGlobals::EnumerateThreads(::GetCurrentProcessId()); + if (m_CurrentThreadIds == threads) + return; + + m_CurrentThreadIds = threads; + + int i = 0; + CString text; + for (auto tid : threads) { + int j = 0; + for (auto& thread : m_Threads) { + if (thread->GetThreadId() == tid) { + thread->SetProcessIndex(i); + text.Format(L"%d (%d)", j + 1, i); + m_List.SetItemText(j, 0, text); + break; + } + j++; + } + i++; + } +} + +unique_ptr CChildView::CreateThread() { + auto thread = make_unique(); + return thread; +} + +void CChildView::OnSize(UINT nType, int cx, int cy) { + CWnd::OnSize(nType, cx, cy); + + m_List.MoveWindow(0, 0, cx, cy); +} + + +vector> CChildView::GetSelectedThreads() const { + vector> selectedThreads; + for (auto pos = m_List.GetFirstSelectedItemPosition(); pos; ) { + int n = m_List.GetNextSelectedItem(pos); + auto data = m_List.GetItemData(n); + + selectedThreads.push_back(make_pair(reinterpret_cast(data), n)); + } + return selectedThreads; +} + +void CChildView::OnThreadActivate() { + for (auto& item : GetSelectedThreads()) { + item.first->Resume(); + UpdateThread(item.second, item.first); + } +} + + +void CChildView::OnUpdateThreadActivate(CCmdUI *pCmdUI) { + pCmdUI->Enable(m_List.GetSelectedCount() > 0); +} + + +BOOL CChildView::OnEraseBkgnd(CDC* pDC) { + return TRUE; +} + + +void CChildView::OnThreadDeactivate() { + for (auto& item : GetSelectedThreads()) { + item.first->Suspend(); + UpdateThread(item.second, item.first); + } +} + +void CChildView::OnUpdateThreadDeactivate(CCmdUI *pCmdUI) { + pCmdUI->Enable(m_List.GetSelectedCount() > 0); +} + +void CChildView::OnChangeThreadActivity(UINT id) { + auto level = (ActivityLevel)(id - ID_ACTIVITYLEVEL_LOW + 1); + + for (auto& item : GetSelectedThreads()) { + item.first->SetActivityLevel(level); + UpdateThread(item.second, item.first); + } +} + +void CChildView::OnUpdateChangeThreadActivity(CCmdUI* pCmdUI) { + pCmdUI->Enable(m_List.GetSelectedCount() > 0); +} + + +void CChildView::OnProcessCreatethread() { + AddThread(CreateThread()); + UpdateThreadProcessIndices(); +} + + +void CChildView::OnUpdateProcessCreatethread(CCmdUI *pCmdUI) { + pCmdUI->Enable(m_Threads.size() < 64); +} + + +void CChildView::OnProcessCreate4threads() { + for (int i = 0; i < 4; i++) { + AddThread(CreateThread()); + } + UpdateThreadProcessIndices(); +} + + +void CChildView::OnUpdateProcessCreate4threads(CCmdUI *pCmdUI) { + pCmdUI->Enable(m_Threads.size() < 60); +} + +void CChildView::OnChangeThreadPriority(UINT id) { + for (auto& item : GetSelectedThreads()) { + item.first->SetPriority(IndexToPriority(id - ID_PRIORITY_IDLE)); + UpdateThread(item.second, item.first); + } +} +void CChildView::OnUpdateChangeThreadPriority(CCmdUI* pCmdUI) { + pCmdUI->Enable(m_List.GetFirstSelectedItemPosition() != nullptr); +} + +int CChildView::IndexToPriority(int index) { + static int priorities[] = { + THREAD_PRIORITY_IDLE, THREAD_PRIORITY_LOWEST, THREAD_PRIORITY_BELOW_NORMAL, + THREAD_PRIORITY_NORMAL, + THREAD_PRIORITY_ABOVE_NORMAL, THREAD_PRIORITY_HIGHEST, THREAD_PRIORITY_TIME_CRITICAL + }; + return priorities[index]; +} + +void CChildView::OnThreadAffinity() { + auto threads = GetSelectedThreads(); + CAffinityDlg dlg(true, threads.size() == 1 ? threads[0].first : nullptr, L"Select CPU Affinity"); + if (dlg.DoModal() == IDOK) { + for (auto& item : GetSelectedThreads()) { + item.first->SetAfinity(dlg.GetSelectedAffinity()); + UpdateThread(item.second, item.first); + } + } +} + +void CChildView::OnThreadIdealcpu() { + auto threads = GetSelectedThreads(); + CAffinityDlg dlg(false, threads.size() == 1 ? threads[0].first : nullptr, L"Select Ideal CPU"); + if (dlg.DoModal() == IDOK) { + for (auto& item : GetSelectedThreads()) { + item.first->SetIdealCPU(dlg.GetSelectedCPU()); + UpdateThread(item.second, item.first); + } + } +} + +void CChildView::OnThreadKill() { + auto threads = GetSelectedThreads(); + CString text; + text.Format(L"Terminate %d thread(s)?", threads.size()); + if (AfxMessageBox(text, MB_YESNO | MB_ICONWARNING | MB_DEFBUTTON2) == IDNO) + return; + + int offset = 0; + for (size_t i = 0; i < threads.size(); i++) { + auto& item = threads[i]; + item.first->Terminate(); + int index = item.second; + m_List.DeleteItem(index - offset); + m_Threads.erase(m_Threads.begin() + (index - offset)); + offset++; + } + UpdateThreadProcessIndices(); +} + +void CChildView::OnTimer(UINT_PTR nIDEvent) { + UpdateThreadProcessIndices(); +} + +void CChildView::OnProcessRefresh() { + UpdateThreadProcessIndices(); +} + + +void CChildView::OnOptionsAutorefreshthreadindices() { + m_AutoRefreshThreadIndices = !m_AutoRefreshThreadIndices; + if (m_AutoRefreshThreadIndices) + SetTimer(1, 10000, nullptr); + else + KillTimer(1); +} + + +void CChildView::OnUpdateOptionsAutorefreshthreadindices(CCmdUI *pCmdUI) { + pCmdUI->SetCheck(m_AutoRefreshThreadIndices); +} diff --git a/CPUSTRES/ChildView.h b/CPUSTRES/ChildView.h new file mode 100644 index 0000000..376657a --- /dev/null +++ b/CPUSTRES/ChildView.h @@ -0,0 +1,79 @@ + +#pragma once + +#include "Thread.h" +#include "ThreadsListCtrl.h" + +// CChildView window + +class CChildView : public CWnd { + // Construction +public: + CChildView(); + + // Attributes +public: + + enum { IDC_LIST = 1234 }; + + // Operations +public: + + // Overrides +protected: + virtual BOOL PreCreateWindow(CREATESTRUCT& cs); + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + +// Implementation +public: + virtual ~CChildView(); + +private: + CThreadsListCtrl m_List; + std::vector < std::unique_ptr> m_Threads; + std::vector m_CurrentThreadIds; + bool m_AutoRefreshThreadIndices = true; + + void CreateThreads(); + std::unique_ptr CreateThread(); + void AddThread(std::unique_ptr& thread); + static PCWSTR ActivityLevelToString(ActivityLevel level); + static PCWSTR ThreadPriorityToString(int priority); + void UpdateThreadProcessIndices(); + + // Generated message map functions +protected: + afx_msg void OnPaint(); + DECLARE_MESSAGE_MAP() + afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); + afx_msg void OnSize(UINT nType, int cx, int cy); + std::vector> GetSelectedThreads() const; + void UpdateThread(int n, const CThread* thread = nullptr); + static int IndexToPriority(int index); + void OnThreadActivate(); + void OnUpdateThreadActivate(CCmdUI *pCmdUI); + BOOL OnEraseBkgnd(CDC* pDC); + void OnThreadDeactivate(); + void OnUpdateThreadDeactivate(CCmdUI *pCmdUI); + void OnRClickList(NMHDR*, LRESULT*); + + void OnChangeThreadActivity(UINT id); + void OnUpdateChangeThreadActivity(CCmdUI* pCmdUI); + void OnProcessCreatethread(); + void OnUpdateProcessCreatethread(CCmdUI *pCmdUI); + void OnProcessCreate4threads(); + void OnUpdateProcessCreate4threads(CCmdUI *pCmdUI); + void OnChangeThreadPriority(UINT id); + void OnUpdateChangeThreadPriority(CCmdUI* pCmdUI); + + afx_msg void OnThreadAffinity(); + afx_msg void OnThreadIdealcpu(); +// afx_msg void OnProcessAffinity(); +// afx_msg void OnUpdateProcessAffinity(CCmdUI *pCmdUI); + afx_msg void OnThreadKill(); + afx_msg void OnTimer(UINT_PTR nIDEvent); + afx_msg void OnProcessRefresh(); + afx_msg void OnOptionsAutorefreshthreadindices(); + afx_msg void OnUpdateOptionsAutorefreshthreadindices(CCmdUI *pCmdUI); +}; + diff --git a/CPUSTRES/Globals.cpp b/CPUSTRES/Globals.cpp new file mode 100644 index 0000000..c3dcc26 --- /dev/null +++ b/CPUSTRES/Globals.cpp @@ -0,0 +1,32 @@ +#include "stdafx.h" +#include "Globals.h" + +using namespace std; + +int CGlobals::s_Processors; + +int CGlobals::GetProcessorCount() { + if (s_Processors == 0) { + s_Processors = ::GetActiveProcessorCount(ALL_PROCESSOR_GROUPS); + } + return s_Processors; +} + +std::vector CGlobals::EnumerateThreads(DWORD pid) { + vector threads; + + auto hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); + ASSERT(hSnapshot != INVALID_HANDLE_VALUE); + + THREADENTRY32 te = { sizeof(te) }; + if (::Thread32First(hSnapshot, &te)) { + do { + if (te.th32OwnerProcessID == pid) + threads.push_back(te.th32ThreadID); + } while (::Thread32Next(hSnapshot, &te)); + } + + ::CloseHandle(hSnapshot); + return threads; +} + diff --git a/CPUSTRES/Globals.h b/CPUSTRES/Globals.h new file mode 100644 index 0000000..902304c --- /dev/null +++ b/CPUSTRES/Globals.h @@ -0,0 +1,11 @@ +#pragma once +class CGlobals { +public: + static int GetProcessorCount(); + + static std::vector EnumerateThreads(DWORD pid); + +private: + static int s_Processors; +}; + diff --git a/CPUSTRES/Icons/gear_add.ico b/CPUSTRES/Icons/gear_add.ico new file mode 100644 index 0000000000000000000000000000000000000000..7caa905883c253473264c7c1fcfed23a210ae3f4 GIT binary patch literal 26694 zcmeHv2Ut}{`u-T}W)n4QVv@~9-9)2Vv!-tnW5gCED5xm57)9&|Hc&*Qh%}KVh@#j~ zuwVge6afKyLsSGCf?{ug20?{8|M#7H54j+kWPh9d+n(nc4(Fb8X1@7m=KJ2S%n_o7 zs3#gW6gcXMF|~#8!GHSeW@1b&A@1R~H{Q_SKUhbIelKd*&4k~dglO`L5Y3wD@2{yR z#Hzn)*UiKl)NAps5FdSHxL;q0ho5TKxZgsErJaOmh1(>d84Bs)(V>PqJ@rRQDZ1o1 z2@eYkA;N?>933s@ySs~PCr*eVC3A(a7h?A4(PB$zs5rN4m$-lJn%Lm%ERG&HAeIFL zh(33G#E;9CiSS92gqSIW-}m2(lA2D*myc-1Pg5A}+PsB1dPEEHdqIViy>V0#hzeFyYBxO!FGK7Cqz zdvTh$b@HURk&z*;fLE8%R`j%KB6|9CvEI{Dq%K@23UYJBU9@xe!Ub_NGgDkkPZ#G= zE~KW4!!a?U5cC$J-rK16HfXs4+ODI%tDq?#bzTBrFQY$ez}r;t`@hHkj~u8|v!m!^ z4N;_yhT=uHw;S|$p}qccQj>4%cNuQ}>LnMv6pW3|ILx^wQ8Z_{SnH>g98Cmb6H=MEVKCU}!aO*Fd+0`0lVf&g8A559yIr?8h zba#Be>EHPJUt4q@+q_XXQ%^6KuX+9FuIq!M;Mg;L^SOR>%UGbNqPu^@|thK)y-n0txw8?fXH!d$*05KK(J| zxAd~Ix)e8k`V+`Z3E3qf7bWDsge;bjX%g~KPm2*5ftHqjkoOWYQbN8<=m-f}B_U5G zbd7`zm(VAw4#+zR`Co~SkO2eUUE|_X0=Xq2lO<%Jggldwm#PlPPgMuxsiKAb(VAa8 zVuV}tgb4+Z#S$`ELJmvFJ_#KlA*UteriAQObU?32=q{Oi@?^30{swpVo6t29dQn1F zO2~4#cj?lyz5f1Q`Kwn?D9FkxhW@Oe1u|RC>eVY(dq2+8^D*0i43?0$67pR}jv94b zyMHe$Yaisdguau|jq*fN(p?u*(~jEx*vXSkR@m7^K|f09Dha(HF%~)>bMs}3M~(8| z7a92z>xB%LkoD5HPoE-BbMue2_j%so?miE?O+pV!=oSh6C85(L^p=D^kkBg<@?Sz1 zOXzLs*|Vpe@%txMt-24rDxu#c^q+)&kaRzv29k9sOz(6q@IEz??xG){qWA>;~;wUiD;xS`HEbv<|=T>g~UXW08Fw8_%3q71aV@^ z7BL^~?Et2cxsWIoybBzHqV_aN(u`_(UmL0$=qCF%WLRE*0ycpAaI(Gjg7br ztd$F#c>z4kMEhI){Y46BfSeIWVq?V)U~2)DDLhg90Xe}(lQWY==L=Isx4h}X>Yks# z`VxK^lf_O>Vl8msVqn_jkPxvI*exFA!L3{3;@-XDEc&@8EKKZLyjWq*`{3;zV8j`i zBSpZLmx(9$?GyPaDIynGF&ED-#CXjE&sG4ppIf_DtU|w!gRUd!-#*l{4dd}6`o9ii zegn8P7IaTTeZ-&z;IG1%sQVT$=C$L;^%xVFH3NLe1jauG47?TdYHe_^SPgy=lZzQB z9w=TYz}Q#tULJUK4DIejTP64IiQ+qV#82S)ecx zx4p%HqB-K$nKKIW6X(tYpRQv*60ctZPr@-)3&6Jw%<~M)x!o8S;`Q5@+c!Zs@%2JF4GboqTXj*0`+0 zC8ZDVPqlh?%G!?KmiiTnOvLIS=<9KKbN*+AtqKEPb$VY4jpnA$tE1mGRk{M=LtBsfFhbXPrG} zO@z>DLfhh!H5vXU{Jm3f@S)&k9r&*hgS#i#?JjCo^XSFiv8&e{4vsu9PyIgY%bkZx z?k7d~4hvkGdHT$2+g{<^72=YaSAqSfpYHx?rEdShGp7$__v*)=|MJqCpL}xfg8A+t zCmtWP8@2uT>x=csz`<*4y7!Kyp>}8O4xh4c+c>B$AII^EpJ*R zx5T=gyS`ZO9`x7#|1|tyIDI#~KcvN^*B4a&S+x7nhQDm6^7B)d)E)9b10j7Hh$o&6 zL?N_Io}uu6mJ}2ZmcOC2tBFz<&(y3aDeC{a;=V8e7(#i;UC1V=7j+Xa|E$NFsrD-j zji;#j-}}SlFTQ9rp?&*vG|1m6fO=wsk=H1*~1^ohlbII(3==eIlVZrF)Ma zx>;SiC=&~O8U?v8p}QpX_){3VN;T@z{hM$8mo8nFLibC^Y6(3j zPo<`w=bc-ZFFQldO5$s_q55HXr@E8Zz=1EjfA`%!=m9xrzyRGW3ya;edh~Fe)~VA? z=rjpgD1k5Z_}>dWfeiq8C!s%88w$gdU$iMEpj0{L^z1nfx>rIsN?-{IoFIWmB=CoX z-j>k)lGu=#96C=zwoB+`3A`d9_a$_pgie&ujn&#MfqnXHgZ`7i5fVCALdQzr771M^ zA&>)K#XJ;MsoU%z2hDJNY;j~XK!%l%L zmm&!7q7C+g_L9~H7Lx>)k{lC`dlmKwulDV0&FSAi379}af608*34Nsc!ZUQ4gl+@jh5evl`VlXb@v63U%Bb+XdxUpjj9Cksc6$XqmfbP4dF1pZQ3ob}PZ zpe;cg2|7^qBM-j=8>n_@uhCXx8^B%?cuoS($q8S7T_IyafB0cJaG?aYk-#Jpx=LQ! zw@+RNpJ;ahGf3bpd3fQ%hqNa&Wke*FXTh_(;Mgmw_=psmJr;@F{s zQd;EE%1M(7fbAr0GTMingXBH*uLQo4;lqbN^laCzmc~z>bE2b{YG{H8tHm)7-p`_B`yl-P;2KbilF_I$n(->t|cQXVR;8Z(Z=ffnR9PZwd~smoj_y z3E(uvN7`xRCvcaX*`vq4DPMkBMN0^g@6TnguwuJ<~Q)3%2aA4W=zI`j2=#LQ)2@a+BIjFMZ(1^P1w3wW+6|S(& zkHVH_jL2TbiFvNB;xg>Bx3_-=TR%vI!lsQ04;NQAZ&tpA4-cA)t+4lZ!gf0j8#fy9 zp+xu=hCN;^F2RPH1wX+#*pfxCWdd+-IqdN*sQ+Kbhr$;zQyhc8VKr>pc-X-$Q@RLm z*z;#lcO>l6H2515VK380x((a)0Q?7mh&w%meHb)$tT>N2Qwr?4JlLBHQTI~VXkLix zoPjT69c;A-lz7;~^cjrQMJs!6;Qdgs2sUnJRFv2UTYm}cxKEGuQTFZ>Q&ZTLK4M1S zzT)POKZ?EZk6eN6cM|sAKlYd@o3Y*L5n?@fvIREnI>dwSfH&vShXll3cHnvy?DCHf z4;0H_cVhmDlkxE)3~{O$#BLrSE;GAdKamT+MmXsI>f{fIy+tVdlYRi`OmPnO=7JF; z#BA8)=Rm_;_(4{otsRIXL2iiEuw^@)w-?@h`UsyvgG4a+l?}dc01pqszpxiJ_K)ay zB*x?l-ropb_q^dRa$wsA!M~Afu**}x%O7FiN5L=i)9u^hgMB@PJA4?7A^8p;F4lQ? zhy?Uy6MQe`*Sv)*#_=ln9FE_2Vf+hVL-)NKD*6=!srb`XycY`FI|%(=jIs>=qWSPe zMZlM{7wv39|G&r>qoZoxjk zjQ%ZzUnC2>q+e(`>fDHazMs}j+3Jwh;w<_VP5%hSHWvPoMX=L%dJ9mt|2(X@GuyX|bD${-?_|Qil>y(? zTFkd%`q1(aLxk^OMEOdrDKBCDC{pQTy$_e|q}f?xEYX zkp5cx#RsR1?r(d1_Di_6UO$*I>eaufwqNwyXhg&GJ6jr!u)ooAYMV9}KC5kaWl{Ie zOG&!lE&XBVka^{T`De71GAEuP>5@$sl5^Xm?^ohQMP7oyz{H`d+`(ZyL?TjL4!KvC^F z_lMMe|JxCDg?MSwH~(nZ)yCGkJVa-m7JJJDHC$J1>sDAHF<_bLT$eVx)8il6lvy9i zAKQCnuf}mDB}I>H%0rru16$YaE-sFV(WSO6ee~fNMa_QHke${hV^nN-ox z=rH)r5ZsT8i$Bm~?R@nN-8S%@44EhTxT6eHnllCTHW6;V^Bi<`sML_ zz$~WpQCWy>92-bmdQ9E_`)Lo4goOHK88NMj%!*6W%j4s+H?7>4){!ne9AD&qP~c&f zSU)K~!&awDO-swxb-nn>$A1ou(%%>P6KA*%yF5HGv6W4BsbTw-f0f$ikPwrved*r-Od{dxLO3EU!q^YpYB-Trs~o!Y6>@U>1( z68KO;-%02}ImyIi-&6IWeP9Xrd;BHz^lxr|x~XYzXH(N1D9Yoj)$jc6w_(6w61q}C ze@p02d0^8foui4#M|=iOlA060`NogD2eyT;$xA|i|EBig%O8ta*c0e?Wy|AwE8;C5 zBBtAQhNaUEmH0Y^>@BhLpe=5|~T^)4~ttgZ|Hif6Z0` zhfCmH2~7Ch`GC2#3>aPcOMr7_yr-uG{+Gb)5}04YMv%bIG6(iA{d=SXwuEXQcpQGX z5DEMUU!R}B*XN;V0Nzw%VR7AG0J_FSi+uD*Qv3wD;!Kr#!PP4u19rk^EY7f z7efXQwgaZs`$XYKWFM7JiG9}ECr`)^0}a}k81n;|S;97xu*FpS7w`_{)=Ucv-T3zH zTWB=64;@+$cE-9eYwL^QHa3qzgItbveHH#7;91p2`ks_elRP)@L-7IggtX;>4;l@3 z4C7%ZH%j1V@c#$ZKI}~i8&F~$Nyv+dTKi!(HhtDRJ4@J)685N)ZS=Fy-^n>hzcBrn z8aZ6@TDELEY+*GYl#dc)N540Hg0QvZwmEa8|9}BcW_DFn&IiHBL??(gzrVd7p3M3 z`K9Coc)+%`xd@wIZg6##lr7*vaCNQ6PMg+zql-({s%sx@2h)!apOSoVQDn;o4w)L&*rtRn8eT?r5_@PjC)EHjtO_&oIAiaCPl(c5~Zu6>A*6Bjtmp zKV8uQ8W{KC8fJSH^MUIW<8c#flR8+@iFUZ=s0YqqEgVEX8~iTv0@^+T+2`NCf2Ng{ zRn6+!-!gONJo=yE3zYDIC_3oBhi^xc4;+8RN6^7F#yFQIqu4jDbB;ZKgP%_Vzug3O zS}||futU%-_fg6N2M(;p2Gdis+ugn14ll36@V&`Q%&D~S@bUy--^`SdkW%>Y6dk06 zV?cSVbfIC+^O`&$pBTr0ze+}qW`eB#h((`~1Npjk{jBqLKfk~2^7UPuPybU>zF@mf3uGd`Cp-9e`|YHp9kh&d*At=eKfvmJ^$|Yo{*45nb7y}0jgX_%#$<(d~0a+ zMU5NRDAvg-Dq2?>}+g9T?a=H89XS+222Dm!IFIA3Z%=SFIQAH(BlA zFe(uIsCw`J)a(Bf{1h}Ctx+oCDcILj-2qxvekSmPILbX1E=YI#X{Cy%oQ2<5i>HJk zpG(D4;L~NUW}5@%VheoijHety>>KsIA=2P0*WxKh;X9w)v7_jH%S**m z?!bqC5b>0&=+mhx@sxG&=QB@}@suLOKrSGjvNOgIPl2zU@s#E8pJPs|c*+9gXRcs8 z1vzw#r!e1>IgG~flmtUOptFQAX7Or45&$`s*MC7!Zgi>Dw4 zg7qsRkqdea{`-n}3i2o!Psu|LWhU}HQxOx{hB(J6v|DV5r??@WlEZik{P$}aBZGf` zEBLF$Q?3}|DT#Qu2zh_{c*<-QPq~Ko!od3g^eYnal%*K!FvK>hi>LS_2E=&EGK|?0 z@RISAXz=X>cz6(T0xh1xT+-Xd@f5@!7*C19I~zb-rFaVZwG6yLyjQHN8c#u7i}94= z8#lzSji+QFc5#L=LZf)f7VtG0@suAKPeGl~i52mb)yOklkGb~G{XN8tJCOpqLUhf493jTkTH$ZGKv<|#9t!aY{uSaXc0 zpT<+F6CPE6Q?7pesrtLowO6N3o}X&hwe8;F@x13dIW`(mQ$<|x zQtj95?Cf56-t&tO_uJBFZ6`wm>Uq28J^$s3mW^7psA+KC*Um)!)jqHH&LbJ~+gjUw zTC}dG?3B-*`Mjs60Tgw5zfGHX^R@L1oXKp`#LiA14Kn6Z%^nSJctZAyu-5Ol$!HUM zqiyXb4RD-lg2Qg(#wuK@8PKg!qj900uh$%Luv;56&ym~e9`&zUb@eLVsA%Em z=UWd#w8`K0)tr}K?$#I~BfL;pyH0R0-Y~qt27Z3tKFvBc^`lhl;d2og!SnGhX{~D4 z(I4uC%*@Q!UbCy170c$WW;jYkwQRF@m)o4Ssc+zC9kkHol;J{~RigFeGRC;@jtXNn zZfu*F;1P|;5PESnGO|JKN>-*2eOe=2g@~4|p%D@l7g8FZ#OFKX`M-3kjO~|vzFN22 zI*uVWJym$Y#Wse$Ud89%e7TV}W!={=T@o5_-qxMyV-oyAy4&tyOl}B z>L|Nu*0!{?#Ce4NaUu2%W|%831k*1gqfKLT!}Cq`^_y9znIWhb7_eS@UVOvAU3>^; zlS|`Q?d_xV^`GM~78NCB#}^?|Sh#0k#q+fqv(MIXX^jJ(ysj8*Htq56!7N8`^~*`3!HYZe9pBB(ANgZx?%&4(T}5A0brNI*WTe zDvk}~w$x87T!C;}(V(NPYwGWL53^z9&^9$L{?3gSkBwTud*eQfj&82Q3rWRit?WI2 z_;}ukh!1pzh-zGJs8yrZpHx(jf4n0SqHRpsk3#E)Egf1q^m;R)jL&Ct0omq`Yt-WB zejzB=aBf0$LNDvYR;`j+wYs_g<@euwlXJs5`=fZg(718q?K#}#YdAiCwdd-D==wvwr!(B))(!WlY=BbTklxXt6#foH|0; zc&Y)nh#D%SSwBHns}y~}^eQgFWU?twOS8_lwobKe95>l0)MLpAr+Op7?BFOfzF}5e zTvBS=JRW@r$dAa4dw8ZfTI9J*&d9ID~pLaot+jtN>^r+JFnfC%}c%y zHR`PpmfLI8@NhoV@@9cY{pk8OX|blJv7>BHU$-f{-pE~Jit#zW>xYi6V})zWSsu~R ziHV6A2eaa~r8Z?DR@Fx@$M#mQ_ipHc#|wG1GAl{9u_l~1ab0G( z*3O8T3qD`zY@&azDPGpq!fl)-@?O*#|5rZO$kSifEHvSBvSz7N=L0k|6`zgIjHmx> zr#55j!lNRBqAvgY=Rd^(?ss6Bgu;Cy-21@7z1emsf8gQNzWsXJFTQw$av9~I-B(}5 zPHWrtAI~MhQK&r?@D<1w$(>bsH?fms5##?j`aQdKGn?AEv+hT4?}|7!V(Aila@IYU ze(X7MzPUhlIP0ML(LQ^U+E3FwsdKgaP@Y@Y|KO%`$BwbEXC-_TYOfFD;EW$22cy)h zLkArGR@Ik13I$A$C9%@cidHnafoYt}9nG=ZRCnN3^&HXuuK`{mc|COBH zxwGpt+r?fMm)ncf_XM~3>?h*Kw>1)P*0@Vk^$7Nn-W@&j@nI0M&y@>B2tcPDt!oQ&QFmbPx)`ylU zU8TU9V;XWc3e)j;y^=_o({;00G&Z-~$wnM8_0c?A zg8KC7IIVN%0{G`toEv@jc?@tYFt2giYVFzf@zfpdxLfoodHrRRM2 zLgQ`NfB~PlcI);q2{Fjam=~PWT$8KuU5L5Z=irY-x~M%Df&4Mzi`a9 zuvh>en7j+#F@A+Ox?FI;e7=obg?!M=*coG6><8n^%zL_l zxER0N;dwtw!XH~vxc5!#%d`5Rtp~~_%2w)#>h|{;cPFfC*LrT>eRu0T=;rq(xW5R# zPML;S>@vjU;j5GIYs(zOS#yxfa0RiFdyLazoEV!^@j3j@yb0!M+(0~8_zDUCIr7AO zRpGum?h#~vv_5G2__T4*)&u*%J&+s&ML+fQbB?)#2AMN<{s3_^@}5QO1OHFLUMIxi zf(yep*p!9M}i0Y04$aR_X`pIO^$V?cc0A9H9dT&SxG1 zzJ(>P80GM&oCWkDpLq+0v0)5bjS-$>E{w`wVQdrcGRDa`Aons>6z9II_^hhoLuEqfzEv9P2jBfPx=k>ig_IBH$yIi%BRrg6y_6S{meOFeh_2xj7h6` zg}KD_pp607fubKeEVJ9n&4RA9c?~oeNg;2 z(9bnMSwtO2JVB2~Y+_K{D>H(L|jW|lLnNt zzyXL|sk{%aInt+cPe8xQKLO1=GY=8pgp|k?cycT(Y{!MDsOfoY){MIv7Z-dnHZ~_O zK3;d3W5@Y~GuJZnO1N*Dxj#Ht$R*4f?r&B(dZ3?pa2;|vnF}_hLkIV&{9j;Wvpfag zlTtaU%o9RkzqP`(MjUYlHL^Yu9^@78dYuRX!qy58r{j0sS|=$a_QKIFMdmQ_iq% zZI85;V|fqvb^>EZ+So)_uJ!3F@c*@}l`9`BU2Tv{q@6gMdO_hP;0^YJa`rNQ--Voc zALO&o=-Tz%97{{R2e?Yr5hF+LK`dB4z&>bg4r)1x%z2`op^VP~ANV`RN9BoP-thZu z%(t9BWQbptYM;8y@bRgY9vOL$dRfa^)YgL1Dfpe(H4keWF@1^Hu!IleoPXcG)(&5M zQLXLDMu3UaI6i0bp4!WeeyIFC=2C)o_KCT?o z7r&1@;Buw!47ysAtDOHF3+fh*1LlgH)w}mvpXSZ$RH^2vOMEA`#d;?v-$fHA<{%ea zhnT)RkNL@c1l( zyj6OEeK5=;euqPwOT?^{l|EKhWqyMOc|u^m@D$P2`~ah%2ENPn`6ef)IjhEx&xOv@ z@mmB1h8#NNQ>gDM@LK^|j%yJxzz+Buf-u(Dhf)H}=M?q*_b(e)zth$AgSC?;CG3K4 zh`K}JC-A#Mx1kSQ(~5q~0m|+9u(j!fL5=~x!MHJM@Zd^y8rNUl{|g)(>O!yOok!iA zQ_RIf9+3K`ftC-bFeK&{Wfb+xa^P)mOH0n#`+-(gY2iQourtIKD0~y!aguJ z{WNUGLi9!ZCIrWV{ke?wvB}L%BKJ`4L0%pGSoesI#2me_#YrpTDKE3|NY14LW^YqkR$9htEv7q@r`jG`p zK#aqA&)iUzAImjv_&=L@@8~1#$_KzbkD=oVi6ISmgL2Y%3^?yEq78okg8kqeqWn>| z1O8724`^=(SXt$2^gZvqKRo=Ujnk(eNy3~)E|x67x+VRbKm5i7T8ak7t( z={ERb%a9XX4Eks@asH5Y+JX1c7h=y7(C3t^h13~F<4_@+3_7AhSA!2)zU)=@!Jw~* z<0|B-(HQV|>a{Ca9}D1L!Z%(F5x?hgAF(DMpYhl)FU#@GOO;!VHK*lPQx>rgyyhH8 zN8U1VDaVFufOt}qOVry+&tdMc4+`@UH(^ZKf9ewIDrG-FH(te>VA1SqrQ@&`4gnMT z^z3;fbolU>o=>^{?p{B?c^QyjkBf`dw?mK%r|*Yh9MoE%EsJssG-hBNxHpdapwha= z{8IRXXxMcfW2e-hZ2&~=k!GnJl@7aUn zp`nAYUq;7yQ;P4OGPj&L<_`-B)HT0}%5TV2%qffsbk>OV-NMnMQ=`U?od?@5dG4@b*YORma(;go-^;myZ*Kf5-fQE7 zZ`IDjw-01lNr^0b^hm9Ni{RT~tXt%$%Phzke%GZKedM|*;<`W~J=C39$g9r;o;?NM z;%U;1=eb7N7upGYPVIHU|Fo-?+S_{t7_H4v{13hH#*z^uI;{CE>s^4N<-BuUYqE%I zL9GMKA+?Udf6krd(0kZNGD+jzf9iZ9EbNW+`Sa&w%%49nJv8*ys`VZU3+unl%}vKO z&h<;$Nw>mFhVLG!HEmeew1p~UDfy4WIRrnGTt9hoSk?M}@9WbcA#WyldzW(_Q7&-| z6#eK2aUF7EC31izWf@~JIha4}gOWp-NBkZz*EI3LdPm2K{bj#5-CF&pmn?ZR5%iP) zocn4F(1&8kR({89i>vE_q*=2fQoX%hcDlR!Z*X$bQD><=GzMLE7jtS8_AabC2E{vF67&Y@jCKIJFo&+o21r=0^KQ?Ms%CB7r0P)23DGtM<dBLJ;Q6KmH@A0xPa1!z?vp`5ucZV8SYRIcLNBE3^7hW&7aZL5dGGC*H0dRLhx_B_ gJ@emt|95cUzj<01C!>6=O8Hq>1?t-5_si4zUz}>`MF0Q* literal 0 HcmV?d00001 diff --git a/CPUSTRES/Icons/gear_delete.ico b/CPUSTRES/Icons/gear_delete.ico new file mode 100644 index 0000000000000000000000000000000000000000..8555a2e1db5df0090db1f64963b08e5231099109 GIT binary patch literal 26694 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 literal 0 HcmV?d00001 diff --git a/CPUSTRES/Icons/gear_pause.ico b/CPUSTRES/Icons/gear_pause.ico new file mode 100644 index 0000000000000000000000000000000000000000..01a7e710a2cc68d3715e071337a91f569e8bbb16 GIT binary patch literal 26694 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 PTU9)l#9#f{aa#Wma;0)@ literal 0 HcmV?d00001 diff --git a/CPUSTRES/Icons/gear_run.ico b/CPUSTRES/Icons/gear_run.ico new file mode 100644 index 0000000000000000000000000000000000000000..d9e8fd252d5283635b7b072c5b667da63bed68c6 GIT binary patch literal 26694 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 +} + +void CMainDialogBar::OnUpdateSetActivityLevel(CCmdUI* pCmdUI) { + m_pView->OnUpdateChangeThreadActivity(pCmdUI); +} + +void CMainDialogBar::InitControls(CChildView* pView) { + m_pView = pView; + + // menu button + + auto pButton = (CMFCMenuButton*)GetDlgItem(IDC_THREAD_ACTIVITY); + CMenu menu; + menu.LoadMenuW(IDR_CONTEXTMENU); + pButton->m_hMenu = menu.GetSubMenu(0)->m_hMenu; + menu.Detach(); +} + diff --git a/CPUSTRES/MainDialogBar.h b/CPUSTRES/MainDialogBar.h new file mode 100644 index 0000000..bb4dc7c --- /dev/null +++ b/CPUSTRES/MainDialogBar.h @@ -0,0 +1,27 @@ +#pragma once + +class CChildView; + +// CMainDialogBar + +class CMainDialogBar : public CDialogBar +{ + DECLARE_DYNAMIC(CMainDialogBar) + +public: + CMainDialogBar(); + virtual ~CMainDialogBar(); + + void InitControls(CChildView*); + +protected: + CChildView* m_pView; + + void OnSetActivityLevel(UINT id); + void OnUpdateSetActivityLevel(CCmdUI* pCmdUI); + + DECLARE_MESSAGE_MAP() + afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); +}; + + diff --git a/CPUSTRES/MainFrm.cpp b/CPUSTRES/MainFrm.cpp new file mode 100644 index 0000000..a55b6f9 --- /dev/null +++ b/CPUSTRES/MainFrm.cpp @@ -0,0 +1,192 @@ + +// MainFrm.cpp : implementation of the CMainFrame class +// + +#include "stdafx.h" +#include "CPUStressEx.h" + +#include "MainFrm.h" +#include "AffinityDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + +// CMainFrame + +IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd) + +BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) + ON_WM_CREATE() + ON_WM_SETFOCUS() + ON_COMMAND(ID_OPTIONS_ALWAYSONTOP, &CMainFrame::OnOptionsAlwaysontop) + ON_UPDATE_COMMAND_UI(ID_OPTIONS_ALWAYSONTOP, &CMainFrame::OnUpdateOptionsAlwaysontop) + ON_COMMAND(ID_PROCESS_AFFINITY, &CMainFrame::OnProcessAffinity) + ON_COMMAND_RANGE(ID_PRIORITYCLASS_IDLE, ID_PRIORITYCLASS_REALTIME, OnChangePriorityClass) + ON_UPDATE_COMMAND_UI_RANGE(ID_PRIORITYCLASS_IDLE, ID_PRIORITYCLASS_REALTIME, OnUpdateChangePriorityClass) +END_MESSAGE_MAP() + +// CMainFrame construction/destruction + +CMainFrame::CMainFrame() { + // TODO: add member initialization code here +} + +CMainFrame::~CMainFrame() {} + +int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { + if(CFrameWnd::OnCreate(lpCreateStruct) == -1) + return -1; + + // create a view to occupy the client area of the frame + if(!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(), this, AFX_IDW_PANE_FIRST)) { + TRACE0("Failed to create view window\n"); + return -1; + } + + if(!m_wndDlgBar.Create(this, IDR_MAINFRAME, CBRS_ALIGN_TOP, AFX_IDW_DIALOGBAR)) { + TRACE0("Failed to create dialogbar\n"); + return -1; + } + + SetProcessAffinityText(); + SetProcessPriorityClassText(); + + // main icon window + + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), TRUE); + SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), FALSE); + + CString title; + title.LoadStringW(IDR_MAINFRAME); + CString pid; + pid.Format(L"%u", ::GetCurrentProcessId()); + title.Replace(L"$", pid); + SetWindowText(title); + + return 0; +} + +BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { + if(!CFrameWnd::PreCreateWindow(cs)) + return FALSE; + + cs.dwExStyle &= ~WS_EX_CLIENTEDGE; + cs.lpszClass = AfxRegisterWndClass(0); + return TRUE; +} + +// CMainFrame diagnostics + +#ifdef _DEBUG +void CMainFrame::AssertValid() const { + CFrameWnd::AssertValid(); +} + +void CMainFrame::Dump(CDumpContext& dc) const { + CFrameWnd::Dump(dc); +} +#endif //_DEBUG + + +// CMainFrame message handlers + +void CMainFrame::OnSetFocus(CWnd* /*pOldWnd*/) { + // forward focus to the view window + m_wndView.SetFocus(); +} + +BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) { + // let the view have first crack at the command + + if(m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) + return TRUE; + + // otherwise, do default handling + + return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); +} + +void CMainFrame::OnOptionsAlwaysontop() { + bool onTop = (GetExStyle() & WS_EX_TOPMOST) > 0; + ::SetWindowPos(GetSafeHwnd(), onTop ? HWND_NOTOPMOST : HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); +} + + +void CMainFrame::OnUpdateOptionsAlwaysontop(CCmdUI *pCmdUI) { + pCmdUI->SetCheck((GetExStyle() & WS_EX_TOPMOST) > 0); +} + + +void CMainFrame::OnProcessAffinity() { + CAffinityDlg dlg(L"Set Process Affinity"); + if(dlg.DoModal() == IDOK) { + if(!::SetProcessAffinityMask(::GetCurrentProcess(), dlg.GetSelectedAffinity())) { + AfxMessageBox(L"Failed to set process affinity mask"); + return; + } + SetProcessAffinityText(); + } +} + +void CMainFrame::SetProcessAffinityText() { + DWORD_PTR processAffinity, systemAffinity; + ::GetProcessAffinityMask(::GetCurrentProcess(), &processAffinity, &systemAffinity); + WCHAR buffer[65]; + _ui64tow_s(processAffinity, buffer, 65, 2); + m_wndDlgBar.GetDlgItem(IDC_PROCESS_AFFINITY)->SetWindowText(CString(L"Process Affinity: ") + buffer); +} + +void CMainFrame::SetProcessPriorityClassText() { + int priority = ::GetPriorityClass(::GetCurrentProcess()); + m_wndDlgBar.GetDlgItem(IDC_PRIORITYCLASS)->SetWindowText(CString(L"Process Priority Class: ") + PriorityClassToString(priority)); +} + +PCWSTR CMainFrame::PriorityClassToString(int priority) { + switch(priority) { + case NORMAL_PRIORITY_CLASS: + return L"Normal"; + case IDLE_PRIORITY_CLASS: + return L"Idle"; + case BELOW_NORMAL_PRIORITY_CLASS: + return L"Below Normal"; + case ABOVE_NORMAL_PRIORITY_CLASS: + return L"Above Normal"; + case HIGH_PRIORITY_CLASS: + return L"High"; + case REALTIME_PRIORITY_CLASS: + return L"Realtime"; + } + return nullptr; +} + +void CMainFrame::OnChangePriorityClass(UINT id) { + static int priorities[] = { + IDLE_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, + ABOVE_NORMAL_PRIORITY_CLASS, HIGH_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS + }; + ::SetPriorityClass(::GetCurrentProcess(), priorities[id - ID_PRIORITYCLASS_IDLE]); + SetProcessPriorityClassText(); +} + +void CMainFrame::OnUpdateChangePriorityClass(CCmdUI* pCmdUI) { + pCmdUI->SetRadio(pCmdUI->m_nID == PriorityClassToID(::GetPriorityClass(::GetCurrentProcess()))); +} + +int CMainFrame::PriorityClassToID(int priority) { + switch(priority) { + case NORMAL_PRIORITY_CLASS: + return ID_PRIORITYCLASS_NORMAL; + case IDLE_PRIORITY_CLASS: + return ID_PRIORITYCLASS_IDLE; + case BELOW_NORMAL_PRIORITY_CLASS: + return ID_PRIORITYCLASS_BELOWNORMAL; + case ABOVE_NORMAL_PRIORITY_CLASS: + return ID_PRIORITYCLASS_ABOVENORMAL; + case HIGH_PRIORITY_CLASS: + return ID_PRIORITYCLASS_HIGH; + case REALTIME_PRIORITY_CLASS: + return ID_PRIORITYCLASS_REALTIME; + } + return 0; +} diff --git a/CPUSTRES/MainFrm.h b/CPUSTRES/MainFrm.h new file mode 100644 index 0000000..1cae3d1 --- /dev/null +++ b/CPUSTRES/MainFrm.h @@ -0,0 +1,57 @@ + +// MainFrm.h : interface of the CMainFrame class +// + +#pragma once +#include "ChildView.h" + +class CMainFrame : public CFrameWnd { + +public: + CMainFrame(); +protected: + DECLARE_DYNAMIC(CMainFrame) + + // Attributes +public: + + // Operations +public: + + // Overrides +public: + virtual BOOL PreCreateWindow(CREATESTRUCT& cs); + virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo); + + // Implementation +public: + virtual ~CMainFrame(); +#ifdef _DEBUG + virtual void AssertValid() const; + virtual void Dump(CDumpContext& dc) const; +#endif + + static PCWSTR PriorityClassToString(int priority); + static int PriorityClassToID(int priority); + +protected: // control bar embedded members + CDialogBar m_wndDlgBar; + CChildView m_wndView; + + // Generated message map functions +protected: + afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); + afx_msg void OnSetFocus(CWnd *pOldWnd); + DECLARE_MESSAGE_MAP() + + void SetProcessAffinityText(); + + afx_msg void OnOptionsAlwaysontop(); + afx_msg void OnUpdateOptionsAlwaysontop(CCmdUI *pCmdUI); + afx_msg void OnProcessAffinity(); + void OnChangePriorityClass(UINT id); + void OnUpdateChangePriorityClass(CCmdUI* pCmdUI); + void SetProcessPriorityClassText(); +}; + + diff --git a/CPUSTRES/README.md b/CPUSTRES/README.md new file mode 100644 index 0000000..13e34d1 --- /dev/null +++ b/CPUSTRES/README.md @@ -0,0 +1,3 @@ +# CPUStressEx + +An enhanced version of the old CPUSTRES tool. diff --git a/CPUSTRES/Thread.cpp b/CPUSTRES/Thread.cpp new file mode 100644 index 0000000..64a87be --- /dev/null +++ b/CPUSTRES/Thread.cpp @@ -0,0 +1,88 @@ +// Thread.cpp : implementation file +// + +#include "stdafx.h" +#include "CPUStressEx.h" +#include "Thread.h" +#include "Globals.h" + +// CThread + +CThread::CThread() { + int cpus = CGlobals::GetProcessorCount(); + if(cpus == sizeof(DWORD_PTR) * 8) + m_Affinity = (DWORD_PTR)-1; + else + m_Affinity = (((DWORD_PTR)1) << cpus) - 1; + m_hTerminate = ::CreateEvent(nullptr, FALSE, FALSE, nullptr); + m_hThread = ::CreateThread(nullptr, 0, ThreadFunction, this, CREATE_SUSPENDED, &m_ID); +} + +CThread::~CThread() { + ::CloseHandle(m_hThread); + ::CloseHandle(m_hTerminate); +} + +void CThread::Suspend() { + if (!IsActive()) return; + + ::SuspendThread(m_hThread); + m_Active = false; +} + +void CThread::Resume() { + if (IsActive()) return; + + ::ResumeThread(m_hThread); + m_Active = true; +} + +DWORD CThread::ThreadFunction(PVOID p) { + return reinterpret_cast(p)->ThreadFunction(); +} + +DWORD CThread::ThreadFunction() { + auto hTerminate = m_hTerminate; + for (;;) { + if (::WaitForSingleObject(hTerminate, 0) == WAIT_OBJECT_0) + break; + + auto level = m_ActivityLevel; + if (level != ActivityLevel::Maximum) { + auto time = ::GetTickCount(); + while (::GetTickCount() - time < (unsigned)level * 25) + ; + ::Sleep(100 - (int)level * 25); + } + } + + return 0; +} + +void CThread::SetAfinity(DWORD_PTR affinity) { + ::SetThreadAffinityMask(m_hThread, m_Affinity = affinity); +} + +DWORD_PTR CThread::GetAffinity() const { + return m_Affinity; +} + +DWORD CThread::SetIdealCPU(int n) { + return ::SetThreadIdealProcessor(m_hThread, n); +} + +int CThread::GetIdealCPU() const { + PROCESSOR_NUMBER n; + ::GetThreadIdealProcessorEx(m_hThread, &n); + return n.Number; +} + +void CThread::Terminate() { + m_ActivityLevel = ActivityLevel::None; + ::SetEvent(m_hTerminate); + Resume(); + if(::WaitForSingleObject(m_hThread, 500) == WAIT_TIMEOUT) + ::TerminateThread(m_hThread, 1); +} + + diff --git a/CPUSTRES/Thread.h b/CPUSTRES/Thread.h new file mode 100644 index 0000000..02785d7 --- /dev/null +++ b/CPUSTRES/Thread.h @@ -0,0 +1,72 @@ + +#pragma once + +enum class ActivityLevel { + None = 0, + Low = 1, + Medium = 2, + Busy = 3, + Maximum = 4 +}; + +// CThread command target + +class CThread { +public: + CThread(); + virtual ~CThread(); + + DWORD GetThreadId() const { + return m_ID; + } + + int GetPriority() const { + return ::GetThreadPriority(m_hThread); + } + + void SetProcessIndex(int index) { + m_IndexInProcess = index; + } + + int GetProcessIndex() const { + return m_IndexInProcess; + } + + ActivityLevel GetActivityLevel() const { + return m_ActivityLevel; + } + + bool IsActive() const { + return m_Active; + } + + void SetPriority(int priority) { + ::SetThreadPriority(m_hThread, priority); + } + + void SetAfinity(DWORD_PTR affinity); + DWORD_PTR GetAffinity() const; + + DWORD SetIdealCPU(int n); + int GetIdealCPU() const; + + void Terminate(); + void Suspend(); + void Resume(); + void SetActivityLevel(ActivityLevel level) { + m_ActivityLevel = level; + } + + static DWORD CALLBACK ThreadFunction(PVOID); + DWORD CALLBACK ThreadFunction(); + +private: + HANDLE m_hThread, m_hTerminate; + DWORD m_ID; + int m_IndexInProcess; + ActivityLevel m_ActivityLevel = ActivityLevel::Low; + bool m_Active = false; + DWORD_PTR m_Affinity; +}; + + diff --git a/CPUSTRES/ThreadsListCtrl.cpp b/CPUSTRES/ThreadsListCtrl.cpp new file mode 100644 index 0000000..f095acd --- /dev/null +++ b/CPUSTRES/ThreadsListCtrl.cpp @@ -0,0 +1,59 @@ +// ThreadsListCtrl.cpp : implementation file +// + +#include "stdafx.h" +#include "CPUStressEx.h" +#include "ThreadsListCtrl.h" + + +// CThreadsListCtrl + +IMPLEMENT_DYNAMIC(CThreadsListCtrl, CMFCListCtrl) + +CThreadsListCtrl::CThreadsListCtrl(const std::vector>& threads) : m_Threads(threads) +{ +} + +CThreadsListCtrl::~CThreadsListCtrl() +{ +} + + +COLORREF CThreadsListCtrl::OnGetCellBkColor(int nRow, int nColumn) { + auto thread = GetThread(nRow); + if (!thread->IsActive()) + return (COLORREF)Color::White; + + switch (thread->GetActivityLevel()) { + case ActivityLevel::Low: + return (COLORREF)Color::Yellow; + case ActivityLevel::Medium: + return (COLORREF)Color::Orange; + case ActivityLevel::Busy: + return (COLORREF)Color::Red; + case ActivityLevel::Maximum: + return (COLORREF)Color::DarkRed; + default: + ASSERT(0); + return 0; + } +} + +COLORREF CThreadsListCtrl::OnGetCellTextColor(int nRow, int nColumn) { + auto thread = GetThread(nRow); + auto color = Color::Black; + if (thread->IsActive() && thread->GetActivityLevel() >= ActivityLevel::Busy) + color = Color::White; + return (COLORREF)color; +} + +CThread * CThreadsListCtrl::GetThread(int row) const { + return reinterpret_cast(GetItemData(row)); +} + +BEGIN_MESSAGE_MAP(CThreadsListCtrl, CMFCListCtrl) +END_MESSAGE_MAP() + +// CThreadsListCtrl message handlers + + diff --git a/CPUSTRES/ThreadsListCtrl.h b/CPUSTRES/ThreadsListCtrl.h new file mode 100644 index 0000000..9381b00 --- /dev/null +++ b/CPUSTRES/ThreadsListCtrl.h @@ -0,0 +1,36 @@ +#pragma once + + +// CThreadsListCtrl + +enum class Color : unsigned { + White = RGB(255, 255, 255), + Black = 0, + DarkRed = RGB(128, 0, 0), + Red = RGB(255, 0, 0), + Orange = RGB(255, 128, 0), + Yellow = RGB(255, 255, 0) +}; + +#include "Thread.h" + +class CThreadsListCtrl : public CMFCListCtrl { + DECLARE_DYNAMIC(CThreadsListCtrl) + +public: + CThreadsListCtrl(const std::vector>& threads); + virtual ~CThreadsListCtrl(); + + COLORREF OnGetCellBkColor(int nRow, int nColumn); + COLORREF OnGetCellTextColor(int nRow, int nColumn); + +private: + CThread* GetThread(int row) const; + +protected: + const std::vector>& m_Threads; + + DECLARE_MESSAGE_MAP() +}; + + diff --git a/CPUSTRES/publish_config.json b/CPUSTRES/publish_config.json new file mode 100644 index 0000000..ada80e6 --- /dev/null +++ b/CPUSTRES/publish_config.json @@ -0,0 +1,15 @@ +{ + "packageName": "CPUSTRES.zip", + "files": [ + { + "name": "CPUSTRES.EXE", + "platform": "Win32", + "configuration": "Release" + }, + { + "name": "CPUSTRES64.EXE", + "platform": "x64", + "configuration": "Release" + } + ] +} \ No newline at end of file diff --git a/CPUSTRES/res/CPUStressEx.ico b/CPUSTRES/res/CPUStressEx.ico new file mode 100644 index 0000000000000000000000000000000000000000..a6e753b85efb783baec7cf850c2bb82998de540d GIT binary patch literal 26694 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 v2f%(5G*7{7x%F=z;4T2WD9}ZLn??aucNB z)iu9AnKIS%gw7Q7qJcg%(oUtKwn$e8wKT-@jK9e`c?#{Z<|!)ZO*wX{f{a2-@`FA( z+Y&X^I#q6{!M?!n%0U|}$3@QaWO;Y>IbUmi|8bemtB!w3bVLWWVI64QY4`vD literal 0 HcmV?d00001 diff --git a/CPUSTRES/resource.h b/CPUSTRES/resource.h new file mode 100644 index 0000000..2ec9abe --- /dev/null +++ b/CPUSTRES/resource.h @@ -0,0 +1,65 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by CPUStressEx.rc +// +#define IDD_ABOUTBOX 100 +#define IDR_MAINFRAME 128 +#define IDR_CPUStressExTYPE 130 +#define IDI_PLAY 312 +#define IDI_KILL 313 +#define IDI_PAUSE 314 +#define IDR_CONTEXTMENU 315 +#define IDI_CREATE 316 +#define IDD_AFFINITY 317 +#define IDC_THREAD_ACTIVITY 1002 +#define IDC_DUMMY 1003 +#define IDC_SELECTALL 1004 +#define IDC_UNSELECTALL 1005 +#define IDC_PROCESS_AFFINITY 1006 +#define IDC_PRIORITYCLASS 1007 +#define IDC_MFCLINK1 1008 +#define IDC_LINK 1008 +#define ID_THREAD_ACTIVE 32771 +#define ID_THREAD_ACTIVITYLEVEL 32772 +#define ID_ACTIVITYLEVEL_LOW 32773 +#define ID_ACTIVITYLEVEL_MEDIUM 32774 +#define ID_ACTIVITYLEVEL_BUSY 32775 +#define ID_ACTIVITYLEVEL_MAXIMUM 32776 +#define ID_THREAD_AFFINITY 32778 +#define ID_THREAD_IDEALCPU 32779 +#define ID_THREAD_KILL 32780 +#define ID_PROCESS_AFFINITY 32781 +#define ID_PROCESS_PRIORITYCLASS 32782 +#define ID_PRIORITYCLASS_IDLE 32783 +#define ID_PRIORITYCLASS_BELOWNORMAL 32784 +#define ID_PRIORITYCLASS_NORMAL 32785 +#define ID_PRIORITYCLASS_ABOVENORMAL 32786 +#define ID_PRIORITYCLASS_HIGH 32787 +#define ID_PRIORITYCLASS_REALTIME 32788 +#define ID_THREAD_PRIORITY 32789 +#define ID_PRIORITY_IDLE 32790 +#define ID_PRIORITY_LOWEST 32791 +#define ID_PRIORITY_BELOWNORMAL 32792 +#define ID_PRIORITY_NORMAL 32793 +#define ID_PRIORITY_ABOVENORMAL 32794 +#define ID_PRIORITY_HIGHEST 32795 +#define ID_PRIORITY_TIMECRITICAL 32796 +#define ID_OPTIONS_ALWAYSONTOP 32797 +#define ID_THREAD_ACTIVATE 32798 +#define ID_THREAD_DEACTIVATE 32799 +#define ID_THREAD_ACTIVE32800 32800 +#define ID_PROCESS_CREATETHREAD 32801 +#define ID_PROCESS_CREATE4THREADS 32802 +#define ID_PROCESS_REFRESH 32803 +#define ID_OPTIONS_AUTOREFRESHTHREADINDICES 32806 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 321 +#define _APS_NEXT_COMMAND_VALUE 32807 +#define _APS_NEXT_CONTROL_VALUE 1009 +#define _APS_NEXT_SYMED_VALUE 310 +#endif +#endif diff --git a/CPUSTRES/stdafx.cpp b/CPUSTRES/stdafx.cpp new file mode 100644 index 0000000..f529dd1 --- /dev/null +++ b/CPUSTRES/stdafx.cpp @@ -0,0 +1,8 @@ + +// stdafx.cpp : source file that includes just the standard includes +// CPUStressEx.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + + diff --git a/CPUSTRES/stdafx.h b/CPUSTRES/stdafx.h new file mode 100644 index 0000000..d30a405 --- /dev/null +++ b/CPUSTRES/stdafx.h @@ -0,0 +1,54 @@ + +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, +// but are changed infrequently + +#pragma once + +#ifndef VC_EXTRALEAN +#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers +#endif + +#include "targetver.h" + +#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit + +// turns off MFC's hiding of some common and often safely ignored warning messages +#define _AFX_ALL_WARNINGS + +#include // MFC core and standard components +#include // MFC extensions + +#include + + + +#ifndef _AFX_NO_OLE_SUPPORT +#include // MFC support for Internet Explorer 4 Common Controls +#endif +#ifndef _AFX_NO_AFXCMN_SUPPORT +#include // MFC support for Windows Common Controls +#endif // _AFX_NO_AFXCMN_SUPPORT + +#include // MFC support for ribbons and control bars + +#include +#include + + + + + + + +#ifdef _UNICODE +#if defined _M_IX86 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") +#elif defined _M_X64 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") +#else +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") +#endif +#endif + + diff --git a/CPUSTRES/targetver.h b/CPUSTRES/targetver.h new file mode 100644 index 0000000..87c0086 --- /dev/null +++ b/CPUSTRES/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/Tools.sln b/Tools.sln index d4a099e..464ddb6 100644 --- a/Tools.sln +++ b/Tools.sln @@ -32,6 +32,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Chapter05", "Chapter05", "{ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MemCombine", "MemCombine\MemCombine.vcxproj", "{6502E3AD-8D8E-4F1A-923C-0F4F89FF02E7}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CPUSTRES", "CPUSTRES\CPUStressEx.vcxproj", "{DC1EF85A-8628-457A-A805-49CCC97DF5BF}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -96,6 +98,14 @@ Global {6502E3AD-8D8E-4F1A-923C-0F4F89FF02E7}.Release|x64.Build.0 = Release|x64 {6502E3AD-8D8E-4F1A-923C-0F4F89FF02E7}.Release|x86.ActiveCfg = Release|Win32 {6502E3AD-8D8E-4F1A-923C-0F4F89FF02E7}.Release|x86.Build.0 = Release|Win32 + {DC1EF85A-8628-457A-A805-49CCC97DF5BF}.Debug|x64.ActiveCfg = Debug|x64 + {DC1EF85A-8628-457A-A805-49CCC97DF5BF}.Debug|x64.Build.0 = Debug|x64 + {DC1EF85A-8628-457A-A805-49CCC97DF5BF}.Debug|x86.ActiveCfg = Debug|Win32 + {DC1EF85A-8628-457A-A805-49CCC97DF5BF}.Debug|x86.Build.0 = Debug|Win32 + {DC1EF85A-8628-457A-A805-49CCC97DF5BF}.Release|x64.ActiveCfg = Release|x64 + {DC1EF85A-8628-457A-A805-49CCC97DF5BF}.Release|x64.Build.0 = Release|x64 + {DC1EF85A-8628-457A-A805-49CCC97DF5BF}.Release|x86.ActiveCfg = Release|Win32 + {DC1EF85A-8628-457A-A805-49CCC97DF5BF}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -108,5 +118,6 @@ Global {BA4AD343-6096-45A8-868E-3D56316F62FF} = {8832CADD-82A2-4129-9595-3A4B6EEB1D7F} {616F6D2F-29E2-40B0-BB28-00BED735FB03} = {8832CADD-82A2-4129-9595-3A4B6EEB1D7F} {6502E3AD-8D8E-4F1A-923C-0F4F89FF02E7} = {C3EFEE31-DD3B-4A28-B916-3B957FBC0ED4} + {DC1EF85A-8628-457A-A805-49CCC97DF5BF} = {83E4C2CE-DD24-45E9-983D-58B01228443A} EndGlobalSection EndGlobal