⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 apartmentthread.h

📁 vc编写的
💻 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 + -