// The code behind the constructor. void DebugHelper::Initialize() { // Create a heap to contain our memory allocations. heapHandle = HeapCreate( 0, 1, 0 ); if ( heapHandle == NULL ) { OutputDebugStringW(L"DebugHelper::Initialize(): Failed to create heap! Unable to create data buffers for formatted output strings.\n"); goto Cleanup; } // // Allocate space for the two buffers. // // Buffer #1: final output string. debugOutputBuffer = static_cast<PWCHAR>(HeapAlloc(heapHandle, HEAP_ZERO_MEMORY, debugOutputBufferLen)); // Buffer #2: intermediate output string; contains data prepended to every // debug output string, such as a timestamp. debugOutputBufferTemp = static_cast<PWCHAR>(HeapAlloc(heapHandle, HEAP_ZERO_MEMORY, debugOutputBufferLen)); // Make sure we either have both buffers, or neither buffer. if (debugOutputBuffer == NULL || debugOutputBufferTemp == NULL) { OutputDebugStringW(L"\n" L"DebugHelper::Initialize(): Failed to create formatted output string buffers!\n" L" Debug output strings will be displayed _without_ expanding format fields (i.e., \"%d\").\n\n"); // Free any partial memory already allocated. CleanupMem(); goto Cleanup; } // Report that the class is completely initialized. OutputDebugStringW(L"DebugHelper::Initialize(): Initialization completed successfully.\n"); Cleanup: return; }
// The code behind the destructor. void DebugHelper::Finalize() { OutputDebugStringW(L"DebugHelper::Finalize(): Finalize called, cleaning up object.\n"); CleanupMem(); }
//************************************************ //*测试任务执行过程 //************************************************ VOID t1::UpdateState() { switch (m_TestState) { //呈现指导语 case STATE_DISPLAYINSTURCTION: break; //呈现目标 case STATE_DISPLAYOBJ: if (abs(JoyX)>20 || abs(JoyY)>20) { if (QueryPerformanceFrequency(&litmp)) { dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率 m_SampleInt = m_MoveInt * dfFreq; } QueryPerformanceCounter(&litmp); QPart1 = litmp.QuadPart; // 获得初始值 dfTotalMove = 0; dfTotalPause = 0; m_PointTime[m_PointNum] = QPart1 / dfFreq * 1000; m_PostSpeedX[m_PointNum] = 0; m_PostSpeedY[m_PointNum] = 0; m_TestState = STATE_MOVINGOBJ; } break; //测试任务执行 case STATE_MOVINGOBJ: if (dfTotalMove<m_TrialTime)//m_Setting.m_ExperTime) { //间隔40ms采样一次 do { Sleep(1); QueryPerformanceCounter(&litmp); QPart2 = litmp.QuadPart; //获得中止值 dfMinus = (double)(QPart2 - QPart1); //dfTim = dfMinus / dfFreq; // 获得对应的时间值,单位为秒 } while (dfMinus<m_SampleInt); dfTim = dfMinus / dfFreq; // 获得对应的时间值,单位为秒 QPart1 = QPart2; // 获得初始值 dfTotalMove = dfTotalMove + dfTim; //暂停点 if (m_Setting.m_Pause == 1) { dfTotalPause = dfTotalPause + dfTim; if (dfTotalPause>60) { dfTotalPause = 0; m_PauseNo = 0; RandPausePoint(60, m_Setting.m_PauseNum, m_PauseTimeStart, m_PauseTimeEnd); } } //计算当前运动状态 MoveTrace(); } else { //保存数据 SaveData(); if (m_TrialNo >= m_TrialTimes - 1) { if ((m_TrialType == TRIAL_PRACTICE) && (m_Setting.m_ExperMode == 1)) { //呈现正式测试选项 m_TrialNo = -1; m_TrialType = TRIAL_EXPERMENT; m_TestState = STATE_DISPLAYOPTION; CleanupMem(); } else { //测试结束 QueryPerformanceCounter(&litmp); QPart1 = litmp.QuadPart; // 获得初始值 TimeInt = 2; m_TestState = STATE_OVER; } } else { //进行下一次测试 CleanupMem(); m_TestState = STATE_DISPLAYNEXT; } } break; //出现选项框 case STATE_DISPLAYOPTION: break; //测试结束 case STATE_OVER: /* QueryPerformanceCounter(&litmp); QPart2 = litmp.QuadPart; //获得中止值 dfMinus = (double)(QPart2-QPart1); dfTim = dfMinus / dfFreq; // 获得对应的时间值,单位为秒 //2000ms if (dfTim >= TimeInt) { PostThreadMessage(dwInputThreadID, WM_THREADSTOP,0,0); m_TestState = STATE_EXIT; }*/ break; //程序退出 case STATE_EXIT: if (g_nThreadExitCount == 1) { SendMessage(hWnd, WM_CLOSE, 0, 0); // 关闭窗口 SendMessage(hWnd, WM_DESTROY, 0, 0); } break; case STATE_NEXT: break; default: break; } }
//************************************************ //*外部消息处理 //************************************************ LRESULT WINAPI t1::MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_KEYUP: switch (wParam) { //退出键 case VK_ESCAPE: // User wants to leave fullscreen mode //ShowCursor(TRUE); ShowCursor(TRUE); rtn = DialogBox(gHinstance, MAKEINTRESOURCE(IDD_PAUSE), hWnd, PauseMsgProc); ShowCursor(FALSE); //AllocConsole(); //freopen("CONOUT$", "w", stdout); //printf("rtn的值为%d\n", rtn); //FreeConsole(); switch (rtn) { case ID_CONTINUE: //TRACE("\n???\n"); //重新设定时间间隔QPart1 QueryPerformanceCounter(&litmp); QPart1 = litmp.QuadPart; QPart2 = QPart1; //激活父窗口 SetForegroundWindow(hWnd); //ShowCursor(FALSE); rtn = 0; break; case ID_NEXT: //若在任务中途退出 则保存当前所有实验数据 if (m_TestState == STATE_MOVINGOBJ) SaveData(); EndDialog(hWnd, rtn); PostThreadMessage(dwInputThreadID, WM_THREADSTOP, 0, 0); //退出线程 m_TestState = STATE_NEXT; break; case ID_CANCEL: //若在任务中途退出 则保存当前所有实验数据 if (m_TestState == STATE_MOVINGOBJ) SaveData(); EndDialog(hWnd, rtn); PostThreadMessage(dwInputThreadID, WM_THREADSTOP, 0, 0); //退出线程 m_TestState = STATE_EXIT; //exit(0); break; } } return 0; case WM_KEYDOWN: switch (wParam) { } return 0; //程序结束消息 case WM_DESTROY: CleanupMem(); Cleanup(); //PostQuitMessage( 0 ); PostQuitMessage(rtn); m_bDisplayReady = FALSE; return 0; } return DefWindowProc(hWnd, msg, wParam, lParam); }