📄 apartmentthread.h
字号:
/*
Copyright (c) 1999, kSet Lab
Author: Konstantin Bukreev
E-mail: konstantin@mail.primorye.ru
Created: 16.10.99 15:37:58
Version: 1.0.0
simple thread class for apartment model
*/
#ifndef _ApartmentThread_97195666_83d1_11d3_9285_0080adb811c5
#define _ApartmentThread_97195666_83d1_11d3_9285_0080adb811c5
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
template <class Derived, class T, const IID* piid>
class _ApartmentThread
{
typedef _ApartmentThread<Derived, T, piid> _ApartmentClass;
HANDLE m_hThread;
IStream* m_pStream;
CComPtr<T> m_pT;
HANDLE m_hEvent;
int m_nTimeOut;
public:
_ApartmentThread() : m_hThread(0), m_pStream(0), m_hEvent(0), m_nTimeOut(0)
{
}
~_ApartmentThread()
{
_StopThread();
if (m_hEvent)
CloseHandle(m_hEvent);
}
HRESULT _StartThread(int nTimeOut)
{
m_nTimeOut = nTimeOut;
DWORD dw = 0;
if (m_hThread)
{
if (!GetExitCodeThread(m_hThread, &dw) || (dw == STILL_ACTIVE))
return S_FALSE;
CloseHandle(m_hThread);
m_hThread = 0;
}
if (!m_hEvent)
{
m_hEvent = CreateEvent(0, true, false, 0);
if (!m_hEvent)
return E_FAIL;
}
else
{
ResetEvent(m_hEvent);
}
Derived* pDerived = static_cast<Derived*>(this);
if (SUCCEEDED(CoMarshalInterThreadInterfaceInStream(*piid, (T*)pDerived, &m_pStream)))
m_hThread = CreateThread(0, 0, &Apartment, (void*)this, 0, &dw);
return m_hThread != 0 ? S_OK : E_FAIL;
}
void _StopThread()
{
if (m_hThread)
{
DWORD dw = 0;
if (GetExitCodeThread(m_hThread, &dw) && (dw == STILL_ACTIVE))
{
SetEvent(m_hEvent);
AtlWaitWithMessageLoop(m_hThread);
}
CloseHandle(m_hThread);
m_hThread = 0;
}
}
void SignalExit() {SetEvent(m_hEvent);}
private:
static DWORD WINAPI Apartment(void* pv)
{
_ApartmentClass* pT = static_cast< _ApartmentClass* >(pv);
pT->_Apartment();
return 0;
}
void _Apartment()
{
CoInitialize(0);
m_pT.Release();
if (!m_pStream ||
FAILED(CoGetInterfaceAndReleaseStream(m_pStream, *piid, (void**)&m_pT)))
return;
while(WaitForSingleObject(m_hEvent, m_nTimeOut) == WAIT_TIMEOUT)
if (m_pT->_ThreadProc() != S_OK)
break;
m_pT.Release();
CoUninitialize();
}
};
#endif //_ApartmentThread_97195666_83d1_11d3_9285_0080adb811c5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -