Windows线程 - 如何在Windows中使方法成为线程函数?

KOL*_*ICH 5 c++ windows winapi multithreading pointers

当然,我无法将指向方法的指针传递给CreateThread函数.我该怎么办?

Dan*_*Dan 7

如果使用类,这样的一些模式通常很有效:

.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)


Jör*_*son 5

我经常这样做:

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等)


Fab*_*llo 4

最常见的方法是创建一个具有 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。