protected:
HANDLE m_hEndingEvent;
HANDLE m_hEndedEvent;
HANDLE m_UpdateThreadHandle;
m_UpdateThreadHandle = NULL;
m_hEndingEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
m_hEndedEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
ResetEvent(m_hEndingEvent); //置为没有信号状态
ResetEvent(m_hEndedEvent); //置为没有信号状态
m_UpdateThreadHandle = (HANDLE)_beginthread(fnFunc, 0, this);
void CMainFrame::fnFunc(void *para)
{
CMainFrame * pThis = (CMainFrame*)para;
if (!pThis)
return;
while (1)
{
DWORD start_count = GetTickCount();
if(pThis->m_bRuning)
{
pThis->m_pLeftView->UpdateTag();
CDBProject::UpdateDB();
}
DWORD end_count = GetTickCount();
DWORD sleep_time = 1000 - (end_count - start_count);
sleep_time = (sleep_time > 0 ) ? sleep_time : 0;
if (WaitForSingleObject(pThis->m_hEndingEvent, sleep_time) == WAIT_OBJECT_0)
break;
}
SetEvent(pThis->m_hEndedEvent);
// _endthread(); // 可能会造成资源泄漏,比如智能指针没有机会执行析构
}
void CMainFrame::OnSysStop()
{
m_bRuning = FALSE;
SetEvent(m_hEndingEvent); //置为有信号状态,通知线程终止
CDBProject::Stop();
if (m_UpdateThreadHandle != NULL)
{
DWORD dwRet = 0;
do
{
dwRet = WaitForSingleObject(m_hEndedEvent, 1000);
} while (dwRet != WAIT_OBJECT_0);
m_UpdateThreadHandle = NULL;
}
}
void CMainFrame::OnSysPause()
{
m_Pausing = TRUE;
CDBProject::Pause();
if (m_UpdateThreadHandle != NULL)
SuspendThread(m_UpdateThreadHandle);
}
void CMainFrame::OnSysContinue()
{
m_Pausing = FALSE;
CDBProject::Continue();
if (m_UpdateThreadHandle != NULL)
ResumeThread(m_UpdateThreadHandle);
}