|
VC++ATL封装后的线程启动工具类和调用示例
该封装提供了两种线程启动方式:支持全局函数和类成员函数调用,线程安全且符合ATL编程规范。
AtlThreadUtils.h
- // AtlThreadUtils.h
- #pragma once
- #include <Windows.h>
- #include <process.h>
- class CAtlThreadUtils {
- public:
- static HRESULT BeginThread(
- LPTHREAD_START_ROUTINE pfnThreadProc,
- LPVOID pParam,
- DWORD dwFlags = 0,
- LPDWORD pdwThreadId = nullptr)
- {
- unsigned threadId = 0;
- HANDLE hThread = (HANDLE)_beginthreadex(
- NULL, 0,
- (unsigned(__stdcall*)(void*))pfnThreadProc,
- pParam, dwFlags, &threadId);
-
- if (!hThread) return E_FAIL;
-
- if (pdwThreadId) *pdwThreadId = threadId;
- CloseHandle(hThread);
- return S_OK;
- }
- template<typename T>
- static HRESULT BeginThreadEx(
- DWORD (T::*pfnMember)(),
- T* pInstance,
- DWORD dwFlags = 0)
- {
- struct ThreadData {
- T* pObj;
- DWORD (T::*pfn)();
- };
-
- ThreadData* pData = new ThreadData{pInstance, pfnMember};
- return BeginThread(
- [](LPVOID p) -> DWORD {
- ThreadData* pData = (ThreadData*)p;
- (pData->pObj->*(pData->pfn))();
- delete pData;
- return 0;
- },
- pData,
- dwFlags);
- }
- };
复制代码 Main.cpp
- // Main.cpp
- #include "AtlThreadUtils.h"
- #include <iostream>
- class CMyTask {
- public:
- DWORD WorkerProc() {
- std::cout << "Thread ID: " << GetCurrentThreadId()
- << " is running\n";
- return 0;
- }
- };
- DWORD __stdcall GlobalThreadProc(LPVOID) {
- std::cout << "Global thread function executed\n";
- return 0;
- }
- int main() {
- // 方式1:调用全局函数
- CAtlThreadUtils::BeginThread(GlobalThreadProc, nullptr);
- // 方式2:调用成员函数
- CMyTask task;
- CAtlThreadUtils::BeginThreadEx(&CMyTask::WorkerProc, &task);
- Sleep(1000); // 等待线程执行
- return 0;
- }
复制代码
|
|