Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

716 lines
18 KiB

4 years ago
  1. // StresDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "CpuStres.h"
  5. #include "StresDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAboutDlg dialog used for App About
  13. class CAboutDlg : public CDialog
  14. {
  15. public:
  16. CAboutDlg();
  17. // Dialog Data
  18. //{{AFX_DATA(CAboutDlg)
  19. enum { IDD = IDD_ABOUTBOX };
  20. //}}AFX_DATA
  21. // ClassWizard generated virtual function overrides
  22. //{{AFX_VIRTUAL(CAboutDlg)
  23. protected:
  24. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
  25. //}}AFX_VIRTUAL
  26. // Implementation
  27. protected:
  28. //{{AFX_MSG(CAboutDlg)
  29. //}}AFX_MSG
  30. DECLARE_MESSAGE_MAP()
  31. };
  32. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  33. {
  34. //{{AFX_DATA_INIT(CAboutDlg)
  35. //}}AFX_DATA_INIT
  36. }
  37. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  38. {
  39. CDialog::DoDataExchange(pDX);
  40. //{{AFX_DATA_MAP(CAboutDlg)
  41. //}}AFX_DATA_MAP
  42. }
  43. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  44. //{{AFX_MSG_MAP(CAboutDlg)
  45. // No message handlers
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CStressDlg dialog
  50. CStressDlg::CStressDlg(CWnd* pParent /*=NULL*/)
  51. : CDialog(CStressDlg::IDD, pParent)
  52. {
  53. //{{AFX_DATA_INIT(CStressDlg)
  54. // NOTE: the ClassWizard will add member initialization here
  55. //}}AFX_DATA_INIT
  56. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  57. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  58. m_dwProcessPriority = NORMAL_PRIORITY_CLASS;
  59. m_ActivityValue[0] = SLOW_ACTIVITY;
  60. m_ActivityValue[1] = SLOW_ACTIVITY;
  61. m_ActivityValue[2] = SLOW_ACTIVITY;
  62. m_ActivityValue[3] = SLOW_ACTIVITY;
  63. m_PriorityValue[0] = THREAD_PRIORITY_NORMAL;
  64. m_PriorityValue[1] = THREAD_PRIORITY_NORMAL;
  65. m_PriorityValue[2] = THREAD_PRIORITY_NORMAL;
  66. m_PriorityValue[3] = THREAD_PRIORITY_NORMAL;
  67. m_Active[0] = TRUE;
  68. m_Active[1] = FALSE;
  69. m_Active[2] = FALSE;
  70. m_Active[3] = FALSE;
  71. m_ThreadHandle[0] = NULL;
  72. m_ThreadHandle[1] = NULL;
  73. m_ThreadHandle[2] = NULL;
  74. m_ThreadHandle[3] = NULL;
  75. m_dwLoopValue = 0x00010000;
  76. m_pMemory = NULL;
  77. m_dwVASize = 0;
  78. m_dwRandomScale = 1;
  79. }
  80. void CStressDlg::DoDataExchange(CDataExchange* pDX)
  81. {
  82. CDialog::DoDataExchange(pDX);
  83. //{{AFX_DATA_MAP(CStressDlg)
  84. // NOTE: the ClassWizard will add DDX and DDV calls here
  85. //}}AFX_DATA_MAP
  86. }
  87. BEGIN_MESSAGE_MAP(CStressDlg, CDialog)
  88. //{{AFX_MSG_MAP(CStressDlg)
  89. ON_WM_SYSCOMMAND()
  90. ON_WM_PAINT()
  91. ON_WM_QUERYDRAGICON()
  92. ON_BN_CLICKED(IDC_1_ACTIVE, On1Active)
  93. ON_CBN_SELCHANGE(IDC_1_ACTIVITY, OnSelchange1Activity)
  94. ON_CBN_SELCHANGE(IDC_1_PRIORITY, OnSelchange1Priority)
  95. ON_BN_CLICKED(IDC_2_ACTIVE, On2Active)
  96. ON_CBN_SELCHANGE(IDC_2_ACTIVITY, OnSelchange2Activity)
  97. ON_CBN_SELCHANGE(IDC_2_PRIORITY, OnSelchange2Priority)
  98. ON_BN_CLICKED(IDC_3_ACTIVE, On3Active)
  99. ON_CBN_SELCHANGE(IDC_3_ACTIVITY, OnSelchange3Activity)
  100. ON_CBN_SELCHANGE(IDC_3_PRIORITY, OnSelchange3Priority)
  101. ON_BN_CLICKED(IDC_4_ACTIVE, On4Active)
  102. ON_CBN_SELCHANGE(IDC_4_ACTIVITY, OnSelchange4Activity)
  103. ON_CBN_SELCHANGE(IDC_4_PRIORITY, OnSelchange4Priority)
  104. ON_CBN_SELCHANGE(IDC_PROCESS_PRIORITY, OnSelchangeProcessPriority)
  105. ON_EN_KILLFOCUS(IDC_SHARED_MEM_SIZE, OnKillfocusSharedMemSize)
  106. ON_EN_CHANGE(IDC_SHARED_MEM_SIZE, OnChangeSharedMemSize)
  107. ON_BN_CLICKED(IDC_USE_MEMORY, OnUseMemory)
  108. ON_WM_CLOSE()
  109. ON_WM_DESTROY()
  110. //}}AFX_MSG_MAP
  111. END_MESSAGE_MAP()
  112. // disable optimization since it will remove the "do-nothing" loops
  113. #pragma optimize ("", off)
  114. DWORD CStressDlg::OnePercentCalibration(DWORD dwLoopValue)
  115. {
  116. // find how many loops consume 10% of this processor
  117. LARGE_INTEGER liPerfFreq;
  118. LONGLONG llOnePercent;
  119. LARGE_INTEGER liStartTime;
  120. LARGE_INTEGER liEndTime;
  121. LONGLONG llDiff;
  122. LONGLONG llMinDiff;
  123. DWORD dwPriorityClass;
  124. DWORD dwThreadPriority;
  125. HANDLE hProcess;
  126. HANDLE hThread;
  127. DWORD dwLoopCounter;
  128. DWORD dwReturn;
  129. LONGLONG llResult;
  130. BOOL bGoodSample = FALSE;
  131. DWORD dwAttemptCount = 5;
  132. dwReturn = dwLoopValue;
  133. QueryPerformanceFrequency (&liPerfFreq);
  134. llOnePercent = liPerfFreq.QuadPart / 100;
  135. // the calibration run must take at least 50 ms
  136. llMinDiff = liPerfFreq.QuadPart / 20;
  137. hProcess = GetCurrentProcess();
  138. hThread = GetCurrentThread();
  139. dwPriorityClass = GetPriorityClass (hProcess);
  140. dwThreadPriority = GetThreadPriority (hThread);
  141. SetPriorityClass (hProcess, HIGH_PRIORITY_CLASS);
  142. SetThreadPriority (hThread, THREAD_PRIORITY_HIGHEST);
  143. while (!bGoodSample && dwAttemptCount) {
  144. // start timing
  145. QueryPerformanceCounter (&liStartTime);
  146. // do a trial loop
  147. for (dwLoopCounter = dwLoopValue; dwLoopCounter; dwLoopCounter--);
  148. // end timing
  149. QueryPerformanceCounter (&liEndTime);
  150. llDiff = liEndTime.QuadPart - liStartTime.QuadPart;
  151. if (llDiff > llMinDiff) {
  152. bGoodSample = TRUE;
  153. } else {
  154. // increase the loop counter value by a factor of 10
  155. dwLoopValue *= 10;
  156. dwAttemptCount--;
  157. }
  158. }
  159. // restore the priority since we're done with the critical part
  160. SetPriorityClass (hProcess, dwPriorityClass);
  161. SetThreadPriority (hThread, dwThreadPriority);
  162. if (!bGoodSample) {
  163. MessageBox("Unable to calibrate delay loop");
  164. } else {
  165. // findout what the 1% count is
  166. if (llDiff != llOnePercent) {
  167. // then adjust the initial loop value was too big so reduce
  168. llResult = llOnePercent * dwLoopValue / llDiff;
  169. if (llResult & 0xFFFFFFFF00000000) {
  170. // this processor is TOO FAST! so don't change.
  171. } else {
  172. dwReturn = (DWORD)(llResult & 0x00000000FFFFFFFF);
  173. }
  174. }
  175. }
  176. return dwReturn;
  177. }
  178. DWORD WorkerProc (LPDWORD dwArg)
  179. {
  180. DWORD dwLoopCounter;
  181. LPTHREAD_INFO_BLOCK pInfo;
  182. DWORD dwStartingValue;
  183. DWORD dwLocalValue;
  184. DWORD dwLocalIndex;
  185. pInfo = (LPTHREAD_INFO_BLOCK)dwArg;
  186. dwStartingValue = pInfo->Dlg->m_dwLoopValue;
  187. srand( (unsigned)time( NULL ) );
  188. while (pInfo->Dlg->m_Active[pInfo->dwId]) {
  189. for (dwLoopCounter = dwStartingValue; dwLoopCounter; dwLoopCounter--) {
  190. if (pInfo->Dlg->m_pMemory != NULL) {
  191. do {
  192. dwLocalIndex = rand();
  193. dwLocalIndex *= pInfo->Dlg->m_dwRandomScale;
  194. } while (dwLocalIndex >= pInfo->Dlg->m_dwVASize);
  195. pInfo->Dlg->m_pMemory[dwLocalIndex] = dwLocalIndex;
  196. dwLocalValue = pInfo->Dlg->m_pMemory[dwLocalIndex];
  197. // reduce loop iterations to account for
  198. // accessing memory
  199. if (pInfo->Dlg->m_Active[pInfo->dwId]) {
  200. if (dwLoopCounter > 20) {
  201. dwLoopCounter -= 20;
  202. } else {
  203. dwLoopCounter = 1;
  204. }
  205. } else {
  206. break; // out of loop
  207. }
  208. }
  209. }
  210. if (pInfo->Dlg->m_ActivityValue[pInfo->dwId] > 0) {
  211. Sleep (pInfo->Dlg->m_ActivityValue[pInfo->dwId]);
  212. }
  213. }
  214. pInfo->Dlg->m_ThreadHandle[pInfo->dwId] = NULL;
  215. delete pInfo;
  216. return 0;
  217. }
  218. #pragma optimize ("", on)
  219. void CStressDlg::CreateWorkerThread (DWORD dwId)
  220. {
  221. DWORD dwThreadId;
  222. LPTHREAD_INFO_BLOCK pInfo;
  223. // then start a new thread
  224. pInfo = new THREAD_INFO_BLOCK;
  225. pInfo->Dlg = this;
  226. pInfo->dwId = dwId;
  227. m_Active[dwId] = TRUE;
  228. m_ThreadHandle[dwId] = CreateThread (
  229. NULL, 0,
  230. (LPTHREAD_START_ROUTINE)WorkerProc,
  231. (LPVOID)pInfo, 0, &dwThreadId);
  232. if (m_ThreadHandle[dwId] == NULL) {
  233. m_Active[dwId] = FALSE;
  234. } else {
  235. // establish thread priority
  236. SetThreadPriority (
  237. m_ThreadHandle[dwId],
  238. m_PriorityValue[dwId]);
  239. }
  240. }
  241. void CStressDlg::SetThreadActivity (CComboBox * cActivityCombo, DWORD dwId)
  242. {
  243. switch (cActivityCombo->GetCurSel()) {
  244. case 0:
  245. m_ActivityValue[dwId] = SLOW_ACTIVITY;
  246. break;
  247. case 1:
  248. m_ActivityValue[dwId] = MEDIUM_ACTIVITY;
  249. break;
  250. case 2:
  251. m_ActivityValue[dwId] = HIGH_ACTIVITY;
  252. break;
  253. case 3:
  254. m_ActivityValue[dwId] = HOG_ACTIVITY;
  255. break;
  256. }
  257. }
  258. void CStressDlg::SetThreadPriorityLevel (CComboBox * cPriorityCombo, DWORD dwId)
  259. {
  260. LONG lLastError = ERROR_SUCCESS;
  261. switch (cPriorityCombo->GetCurSel()) {
  262. case 0:
  263. m_PriorityValue[dwId] = (DWORD)THREAD_PRIORITY_IDLE;
  264. break;
  265. case 1:
  266. m_PriorityValue[dwId] = (DWORD)THREAD_PRIORITY_LOWEST;
  267. break;
  268. case 2:
  269. m_PriorityValue[dwId] = (DWORD)THREAD_PRIORITY_BELOW_NORMAL;
  270. break;
  271. case 3:
  272. m_PriorityValue[dwId] = (DWORD)THREAD_PRIORITY_NORMAL;
  273. break;
  274. case 4:
  275. m_PriorityValue[dwId] = (DWORD)THREAD_PRIORITY_ABOVE_NORMAL;
  276. break;
  277. case 5:
  278. m_PriorityValue[dwId] = (DWORD)THREAD_PRIORITY_HIGHEST;
  279. break;
  280. case 6:
  281. m_PriorityValue[dwId] = (DWORD)THREAD_PRIORITY_TIME_CRITICAL;
  282. break;
  283. }
  284. if (m_ThreadHandle[dwId] != NULL) {
  285. if (!SetThreadPriority (m_ThreadHandle[dwId], m_PriorityValue[dwId])) {
  286. lLastError = GetLastError ();
  287. }
  288. } // else no thread open
  289. }
  290. /////////////////////////////////////////////////////////////////////////////
  291. // CStressDlg message handlers
  292. BOOL CStressDlg::OnInitDialog()
  293. {
  294. CDialog::OnInitDialog();
  295. // Add "About..." menu item to system menu.
  296. // IDM_ABOUTBOX must be in the system command range.
  297. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  298. ASSERT(IDM_ABOUTBOX < 0xF000);
  299. CMenu* pSysMenu = GetSystemMenu(FALSE);
  300. CString strAboutMenu;
  301. strAboutMenu.LoadString(IDS_ABOUTBOX);
  302. if (!strAboutMenu.IsEmpty())
  303. {
  304. pSysMenu->AppendMenu(MF_SEPARATOR);
  305. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  306. }
  307. // calibrate loop counter
  308. m_dwLoopValue = OnePercentCalibration (m_dwLoopValue) * 10;
  309. // Set the icon for this dialog. The framework does this automatically
  310. // when the application's main window is not a dialog
  311. SetIcon(m_hIcon, TRUE); // Set big icon
  312. SetIcon(m_hIcon, FALSE); // Set small icon
  313. // set the priority of this thread to "highest" so the UI will be
  314. // responsive
  315. SetThreadPriority (GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
  316. // enable thread 1 & disable all others
  317. ((CComboBox *)GetDlgItem(IDC_PROCESS_PRIORITY))->SetCurSel(1);
  318. CheckDlgButton (IDC_1_ACTIVE, 1);
  319. ((CComboBox *)GetDlgItem(IDC_1_PRIORITY))->SetCurSel(3);
  320. ((CComboBox *)GetDlgItem(IDC_1_ACTIVITY))->SetCurSel(0);
  321. CheckDlgButton (IDC_2_ACTIVE, 0);
  322. ((CComboBox *)GetDlgItem(IDC_2_PRIORITY))->SetCurSel(3);
  323. ((CComboBox *)GetDlgItem(IDC_2_ACTIVITY))->SetCurSel(0);
  324. CheckDlgButton (IDC_3_ACTIVE, 0);
  325. ((CComboBox *)GetDlgItem(IDC_3_PRIORITY))->SetCurSel(3);
  326. ((CComboBox *)GetDlgItem(IDC_3_ACTIVITY))->SetCurSel(0);
  327. CheckDlgButton (IDC_4_ACTIVE, 0);
  328. ((CComboBox *)GetDlgItem(IDC_4_PRIORITY))->SetCurSel(3);
  329. ((CComboBox *)GetDlgItem(IDC_4_ACTIVITY))->SetCurSel(0);
  330. // set the process priority
  331. OnSelchangeProcessPriority();
  332. // start the first thread
  333. On1Active();
  334. // don't access memory by default
  335. CheckDlgButton (IDC_USE_MEMORY, 0);
  336. (GetDlgItem (IDC_SHARED_MEM_SIZE))->EnableWindow (FALSE);
  337. return TRUE; // return TRUE unless you set the focus to a control
  338. }
  339. void CStressDlg::OnSysCommand(UINT nID, LPARAM lParam)
  340. {
  341. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  342. {
  343. CAboutDlg dlgAbout;
  344. dlgAbout.DoModal();
  345. }
  346. else
  347. {
  348. CDialog::OnSysCommand(nID, lParam);
  349. }
  350. }
  351. // If you add a minimize button to your dialog, you will need the code below
  352. // to draw the icon. For MFC applications using the document/view model,
  353. // this is automatically done for you by the framework.
  354. void CStressDlg::OnPaint()
  355. {
  356. if (IsIconic())
  357. {
  358. CPaintDC dc(this); // device context for painting
  359. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  360. // Center icon in client rectangle
  361. int cxIcon = GetSystemMetrics(SM_CXICON);
  362. int cyIcon = GetSystemMetrics(SM_CYICON);
  363. CRect rect;
  364. GetClientRect(&rect);
  365. int x = (rect.Width() - cxIcon + 1) / 2;
  366. int y = (rect.Height() - cyIcon + 1) / 2;
  367. // Draw the icon
  368. dc.DrawIcon(x, y, m_hIcon);
  369. }
  370. else
  371. {
  372. CDialog::OnPaint();
  373. }
  374. }
  375. // The system calls this to obtain the cursor to display while the user drags
  376. // the minimized window.
  377. HCURSOR CStressDlg::OnQueryDragIcon()
  378. {
  379. return (HCURSOR) m_hIcon;
  380. }
  381. void CStressDlg::On1Active()
  382. {
  383. DWORD dwId = 0;
  384. if (IsDlgButtonChecked(IDC_1_ACTIVE)) {
  385. if (m_ThreadHandle[dwId] == NULL) {
  386. CreateWorkerThread (dwId);
  387. } else {
  388. // thread is already running
  389. }
  390. } else {
  391. m_Active[dwId] = FALSE;
  392. m_ThreadHandle[dwId] = NULL;
  393. }
  394. }
  395. void CStressDlg::OnSelchange1Activity()
  396. {
  397. CComboBox * cActivityCombo;
  398. DWORD dwId = 0;
  399. cActivityCombo = (CComboBox *)GetDlgItem (IDC_1_ACTIVITY);
  400. SetThreadActivity (cActivityCombo, dwId);
  401. }
  402. void CStressDlg::OnSelchange1Priority()
  403. {
  404. CComboBox * cPriorityCombo;
  405. DWORD dwId = 0;
  406. cPriorityCombo = (CComboBox *)GetDlgItem (IDC_1_PRIORITY);
  407. SetThreadPriorityLevel (cPriorityCombo, dwId);
  408. }
  409. void CStressDlg::On2Active()
  410. {
  411. DWORD dwId = 1;
  412. if (IsDlgButtonChecked(IDC_2_ACTIVE)) {
  413. if (m_ThreadHandle[dwId] == NULL) {
  414. CreateWorkerThread (dwId);
  415. } else {
  416. // thread is already running
  417. }
  418. } else {
  419. m_Active[dwId] = FALSE;
  420. m_ThreadHandle[dwId] = NULL;
  421. }
  422. }
  423. void CStressDlg::OnSelchange2Activity()
  424. {
  425. CComboBox * cActivityCombo;
  426. DWORD dwId = 1;
  427. cActivityCombo = (CComboBox *)GetDlgItem (IDC_2_ACTIVITY);
  428. SetThreadActivity (cActivityCombo, dwId);
  429. }
  430. void CStressDlg::OnSelchange2Priority()
  431. {
  432. CComboBox * cPriorityCombo;
  433. DWORD dwId = 1;
  434. cPriorityCombo = (CComboBox *)GetDlgItem (IDC_2_PRIORITY);
  435. SetThreadPriorityLevel (cPriorityCombo, dwId);
  436. }
  437. void CStressDlg::On3Active()
  438. {
  439. DWORD dwId = 2;
  440. if (IsDlgButtonChecked(IDC_3_ACTIVE)) {
  441. if (m_ThreadHandle[dwId] == NULL) {
  442. CreateWorkerThread (dwId);
  443. } else {
  444. // thread is already running
  445. }
  446. } else {
  447. m_Active[dwId] = FALSE;
  448. m_ThreadHandle[dwId] = NULL;
  449. }
  450. }
  451. void CStressDlg::OnSelchange3Activity()
  452. {
  453. CComboBox * cActivityCombo;
  454. DWORD dwId = 2;
  455. cActivityCombo = (CComboBox *)GetDlgItem (IDC_3_ACTIVITY);
  456. SetThreadActivity (cActivityCombo, dwId);
  457. }
  458. void CStressDlg::OnSelchange3Priority()
  459. {
  460. CComboBox * cPriorityCombo;
  461. DWORD dwId = 2;
  462. cPriorityCombo = (CComboBox *)GetDlgItem (IDC_3_PRIORITY);
  463. SetThreadPriorityLevel (cPriorityCombo, dwId);
  464. }
  465. void CStressDlg::On4Active()
  466. {
  467. DWORD dwId = 3;
  468. if (IsDlgButtonChecked(IDC_4_ACTIVE)) {
  469. if (m_ThreadHandle[dwId] == NULL) {
  470. CreateWorkerThread (dwId);
  471. } else {
  472. // thread is already running
  473. }
  474. } else {
  475. m_Active[dwId] = FALSE;
  476. CloseHandle (m_ThreadHandle[dwId]);
  477. m_ThreadHandle[dwId] = NULL;
  478. }
  479. }
  480. void CStressDlg::OnSelchange4Activity()
  481. {
  482. CComboBox * cActivityCombo;
  483. DWORD dwId = 3;
  484. cActivityCombo = (CComboBox *)GetDlgItem (IDC_4_ACTIVITY);
  485. SetThreadActivity (cActivityCombo, dwId);
  486. }
  487. void CStressDlg::OnSelchange4Priority()
  488. {
  489. CComboBox * cPriorityCombo;
  490. DWORD dwId = 3;
  491. cPriorityCombo = (CComboBox *)GetDlgItem (IDC_4_PRIORITY);
  492. SetThreadPriorityLevel (cPriorityCombo, dwId);
  493. }
  494. void CStressDlg::OnOK()
  495. {
  496. CDialog::OnOK();
  497. }
  498. void CStressDlg::OnSelchangeProcessPriority()
  499. {
  500. CComboBox * cPriorityCombo;
  501. DWORD dwPriorityClass;
  502. cPriorityCombo = (CComboBox *)GetDlgItem (IDC_PROCESS_PRIORITY);
  503. switch (cPriorityCombo->GetCurSel()) {
  504. case 0:
  505. dwPriorityClass = IDLE_PRIORITY_CLASS;
  506. break;
  507. case 1:
  508. dwPriorityClass = NORMAL_PRIORITY_CLASS;
  509. break;
  510. case 2:
  511. dwPriorityClass = HIGH_PRIORITY_CLASS;
  512. break;
  513. }
  514. SetPriorityClass (GetCurrentProcess(), dwPriorityClass);
  515. }
  516. void CStressDlg::OnKillfocusSharedMemSize()
  517. {
  518. return;
  519. }
  520. void CStressDlg::OnChangeSharedMemSize()
  521. {
  522. CString csMemSize;
  523. TCHAR szOldValue[MAX_PATH];
  524. DWORD dwMemSize;
  525. csMemSize.Empty();
  526. GetDlgItemText (IDC_SHARED_MEM_SIZE, csMemSize);
  527. dwMemSize = _tcstoul ((LPCTSTR)csMemSize, NULL, 10);
  528. dwMemSize *= 1024 / sizeof(DWORD);
  529. if (dwMemSize != m_dwVASize) {
  530. // threads must be stopped to change memory size
  531. if (m_Active[0] || m_Active[1] || m_Active[2] || m_Active[3]) {
  532. MessageBox (
  533. TEXT("All threads must be stopped before this value can be changed"));
  534. _stprintf (szOldValue, TEXT("%d"), ((m_dwVASize * sizeof(DWORD))/1024));
  535. (GetDlgItem(IDC_SHARED_MEM_SIZE))->SetWindowText(szOldValue);
  536. return;
  537. } else {
  538. if (m_pMemory != NULL) {
  539. delete (m_pMemory);
  540. m_pMemory = NULL;
  541. m_dwVASize = 0;
  542. }
  543. m_dwVASize = dwMemSize;
  544. m_pMemory = new DWORD[m_dwVASize];
  545. if (m_pMemory == NULL) {
  546. m_dwVASize = 0;
  547. }
  548. }
  549. }
  550. }
  551. void CStressDlg::OnUseMemory()
  552. {
  553. CString csMemSize;
  554. DWORD dwMemSize;
  555. BOOL bState;
  556. if (m_Active[0] || m_Active[1] || m_Active[2] || m_Active[3]) {
  557. MessageBox (TEXT("All threads must be stopped before this value can be changed"));
  558. bState = !IsDlgButtonChecked(IDC_USE_MEMORY); //revert state
  559. } else {
  560. if (IsDlgButtonChecked(IDC_USE_MEMORY)) {
  561. // if no memory is allocated, then allocate it
  562. if (m_pMemory != NULL) {
  563. delete (m_pMemory);
  564. m_pMemory = NULL;
  565. m_dwVASize = 0;
  566. }
  567. //get va size
  568. csMemSize.Empty();
  569. GetDlgItemText (IDC_SHARED_MEM_SIZE, csMemSize);
  570. dwMemSize = _tcstoul ((LPCTSTR)csMemSize, NULL, 10);
  571. m_dwVASize = dwMemSize * 1024 / sizeof(DWORD);
  572. m_pMemory = new DWORD[m_dwVASize];
  573. if (m_pMemory == NULL) {
  574. m_dwVASize = 0;
  575. } else {
  576. m_dwRandomScale = (m_dwVASize / RAND_MAX) + 1;
  577. }
  578. bState = TRUE;
  579. } else {
  580. // button is unchecked so free memory
  581. if (m_pMemory != NULL) {
  582. delete (m_pMemory);
  583. m_pMemory = NULL;
  584. m_dwVASize = 0;
  585. }
  586. bState = FALSE;
  587. }
  588. }
  589. CheckDlgButton (IDC_USE_MEMORY, bState);
  590. (GetDlgItem (IDC_SHARED_MEM_SIZE))->EnableWindow (bState);
  591. }
  592. void CStressDlg::OnClose()
  593. {
  594. // stop threads first
  595. m_Active[0] = FALSE;
  596. m_Active[1] = FALSE;
  597. m_Active[2] = FALSE;
  598. m_Active[3] = FALSE;
  599. // wait for the threads to finish
  600. while (m_ThreadHandle[0] || m_ThreadHandle[1] ||
  601. m_ThreadHandle[2] || m_ThreadHandle[3]) {
  602. Sleep(100);
  603. }
  604. // free memory block
  605. if (m_pMemory != NULL) {
  606. delete (m_pMemory);
  607. m_pMemory = NULL;
  608. m_dwVASize = 0;
  609. }
  610. CDialog::OnClose();
  611. }
  612. void CStressDlg::OnDestroy()
  613. {
  614. CDialog::OnDestroy();
  615. }