|
VC++ATL中线程执行函数
在VC++ ATL中实现类似MFC的AfxBeginThread功能,可通过以下方式创建线程执行函数:
1. 使用ATL线程模型基类
ATL提供CComObjectRootEx作为线程安全基类,支持三种线程模型(通过模板参数指定):
class CMyWorker : public CComObjectRootEx<CComMultiThreadModel> {
public:
DECLARE_NO_REGISTRY()
HRESULT Run() {
// 线程执行逻辑
return S_OK;
}
};
通过CComMultiThreadModel自动处理线程同步问题。
2. 封装线程启动函数(类似AfxBeginThread)
创建全局函数封装线程启动过程:
HRESULT AtlBeginThread(
LPTHREAD_START_ROUTINE pfnThreadProc,
LPVOID pParam,
DWORD dwFlags = 0
) {
HANDLE hThread = _beginthreadex(
NULL, 0, pfnThreadProc, pParam, dwFlags, NULL
);
if (!hThread) return E_FAIL;
CloseHandle(hThread);
return S_OK;
}
此函数模拟AfxBeginThread的简化调用方式。
3. 完整示例:ATL工作者线程
// 线程执行函数(需声明为__stdcall)
DWORD __stdcall WorkerProc(LPVOID pParam) {
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
CComPtr<IWorker> pWorker = (IWorker*)pParam;
pWorker->Run();
CoUninitialize();
return 0;
}
// 封装启动接口
HRESULT StartWorkerThread(IWorker* pWorker) {
return AtlBeginThread(WorkerProc, pWorker);
}
注意:参数传递需通过COM接口指针保证线程安全。
4. 关键区别与注意事项
线程初始化:ATL线程需手动调用CoInitializeEx,而MFC的AfxBeginThread自动处理
资源管理:ATL中建议使用CComPtr管理接口指针,避免跨线程引用计数问题
消息循环:若需创建带消息泵的线程(类似MFC界面线程),需自行实现消息循环
5. 扩展方案:CComAutoThreadModule
对于需要线程池的场景,可使用ATL的自动线程模块:
CComAutoThreadModule<CComSimpleThreadAllocator> _Module;
_Module.Init(NULL, 4); // 初始化4个线程
// 对象声明时指定线程模型
class CMyObj : public CComObjectRootEx<CComAutoThreadModule> {...};
此方式适合COM组件的多线程调度。
|
|