KOL*_*ICH 5 c++ windows winapi multithreading pointers
当然,我无法将指向方法的指针传递给CreateThread函数.我该怎么办?
如果使用类,这样的一些模式通常很有效:
.H
static UINT __cdecl StaticThreadFunc(LPVOID pParam);
UINT ThreadFunc();
Run Code Online (Sandbox Code Playgroud)
的.cpp
// Somewhere you launch the thread
AfxBeginThread(
StaticThreadFunc,
this);
UINT __cdecl CYourClass::StaticThreadFunc(LPVOID pParam)
{
CYourClass *pYourClass = reinterpret_cast<CYourClass*>(pParam);
UINT retCode = pYourClass->ThreadFunc();
return retCode;
}
UINT CYourClass::ThreadFunc()
{
// Do your thing, this thread now has access to all the classes member variables
}
Run Code Online (Sandbox Code Playgroud)
我经常这样做:
class X {
private:
static unsigned __stdcall ThreadEntry(void* pUserData) {
return ((X*)pUserData)->ThreadMain();
}
unsigned ThreadMain() {
...
}
};
Run Code Online (Sandbox Code Playgroud)
然后我将this用户数据传递给线程创建者函数(_beginthread [ex],CreateThread等)
最常见的方法是创建一个具有 run() 方法和 start() 方法的 Thread 类(这些名称借用自 Java Thread 类)。run() 是一个纯虚函数,您可以在从 Thread 派生的类中重载它来执行实际工作。方法start()在内部调用CreateThread,通过reinterpret_cast将this指针传递给void*。Thread 类还有一个 threadEntryPoint() 静态函数,您可以将其传递给 CreateThread。在 threadEntryPoint() 中,您执行reinterpret_cast 返回 Thread*,然后对其调用 run()。
如果在一种情况下,您只想在单独的线程上执行另一个类的方法(无需从 Thread 类继承),您可以创建一个 Thread 派生类,该类在构造函数中接收一对对象+方法指针,并在 run() 中调用它们。为了简化事情,请将此派生类设为模板。另请查看函子适配器的 boost。