#include "stdafx.h" #include "CStep.h" namespace SERVO { #define TIMEOUT 15 unsigned __stdcall StepWorkThreadFunction(LPVOID lpParam) { CStep* pScale = (CStep*)lpParam; return pScale->WorkingProc(); } CStep::CStep() { m_nWordThreadAddr = 0; m_hWorkStop = nullptr; m_hWorkThreadHandle = nullptr; m_hSignalOn = ::CreateEvent(NULL, TRUE, FALSE, NULL); m_hSignalOff = ::CreateEvent(NULL, TRUE, FALSE, NULL); m_nCurStep = 0; InitializeCriticalSection(&m_criticalSection); } CStep::~CStep() { ASSERT(m_hSignalOn); CloseHandle(m_hSignalOn); m_hSignalOn = nullptr; ASSERT(m_hSignalOff); CloseHandle(m_hSignalOff); m_hSignalOff = nullptr; DeleteCriticalSection(&m_criticalSection); } void CStep::init() { if (m_hWorkStop != nullptr) return; m_hWorkStop = ::CreateEvent(NULL, TRUE, FALSE, NULL); m_hWorkThreadHandle = (HANDLE)_beginthreadex(NULL, 0, SERVO::StepWorkThreadFunction, this, 0, &m_nWordThreadAddr); } void CStep::term() { ASSERT(m_hWorkStop); SetEvent(m_hWorkStop); if (m_hWorkThreadHandle != NULL) { WaitForSingleObject(m_hWorkThreadHandle, INFINITE); CloseHandle(m_hWorkThreadHandle); m_hWorkThreadHandle = NULL; } CloseHandle(m_hWorkStop); m_hWorkStop = NULL; } unsigned CStep::WorkingProc() { HANDLE hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); BOOL bReadOk = FALSE; int nBeginAddr = 0x0; while (1) { RESET: resetStep(); // ´ýÍ˳öÐźŻòʱ¼äµ½ HANDLE hEvents[] = { m_hWorkStop, m_hSignalOn }; int nRet = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE); if (nRet == WAIT_OBJECT_0) { ResetEvent(m_hWorkStop); break; } else if (nRet == WAIT_OBJECT_0 + 1) { ResetEvent(m_hSignalOn); // 1.¶ÁÈ¡Êý¾Ý nextStep(); TRACE("m_nCurStep:%d\n", m_nCurStep); // 2.¸ø¶Ô·½Ð´ON nextStep(); TRACE("m_nCurStep:%d\n", m_nCurStep); // 3.µÈ´ý¶Ô·½OFF nextStep(); TRACE("m_nCurStep:%d\n", m_nCurStep); int nStep3Ret = ::WaitForSingleObject(m_hSignalOff, TIMEOUT * 1000); if (nStep3Ret == WAIT_TIMEOUT) { timeout(); goto RESET; } ResetEvent(m_hSignalOff); // 4.¸ø¶Ô·½Ð´OFF nextStep(); TRACE("m_nCurStep:%d\n", m_nCurStep); // 5.¶Ô½ÓCIMµÈ nextStep(); TRACE("m_nCurStep:%d\n", m_nCurStep); // 6.Íê³É nextStep(); TRACE("m_nCurStep:%d\n", m_nCurStep); } } if (hEvent != nullptr) { CloseHandle(hEvent); } // _endthreadex(0); TRACE("CStep::WorkingProc Ïß³ÌÍ˳ö\n"); return 0; } void CStep::onSignal(BOOL bSignal) { TRACE(">>>>>>>>>>>>>>>>>>>> setSignal:%s\n", bSignal ? "ON" : "OFF"); Lock(); if (m_nCurStep == 0 && bSignal) { SetEvent(m_hSignalOn); } else if (m_nCurStep == 3 && !bSignal) { SetEvent(m_hSignalOff); } Unlock(); } void CStep::resetStep() { Lock(); m_nCurStep = 0; Unlock(); } void CStep::nextStep() { Lock(); m_nCurStep++; Unlock(); } void CStep::timeout() { TRACE(">>>>>>>>>>>>>>>> timeout:%d\n", m_nCurStep); } }