📄 rangerasyncresult.h
字号:
#pragma once
#include <afxmt.h>
template <class T>
class CRangerAsyncResult
{
public:
// check result(call in host).
// initialize
void Initialize(const T& init_val)
{
m_eResult.ResetEvent();
m_Result = init_val;
}
// check
BOOL CheckResult(T& result,DWORD dwTimeout = 8000)
{
BOOL bQuitLoop = FALSE;
do
{
DWORD rs_wait =::MsgWaitForMultipleObjects(1, &m_eResult.m_hObject, FALSE, dwTimeout, QS_ALLINPUT);
if (rs_wait == WAIT_OBJECT_0)
{
bQuitLoop = TRUE;;
}
else if( rs_wait == (WAIT_OBJECT_0+1) )
{
MSG msg;
while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
if (msg.message == WM_QUIT){
bQuitLoop = TRUE;
break;
}
::TranslateMessage(&msg);
::DispatchMessage(&msg);
DWORD ret = ::WaitForSingleObject(m_eResult.m_hObject, 0);
if ( ret == WAIT_OBJECT_0)
{
bQuitLoop = TRUE;
break;
}
}
}
else
{
return FALSE;
}
}while(!bQuitLoop);
CSingleLock lck(&m_csResult);
if (!lck.Lock())
return FALSE; // Time Out
result = m_Result;
return TRUE;
}
// set result (call in client).
BOOL SetResult(const T& result)
{
CSingleLock lck(&m_csResult);
if (!lck.Lock())
return FALSE; // Time Out
m_Result = result;
lck.Unlock();
// notify result has been changed
m_eResult.SetEvent();
return TRUE;
}
protected:
T m_Result;
CEvent m_eResult;
CCriticalSection m_csResult;
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -