5

我正在开发一个 .NET 分析器,它是用 c++(一个使用 ATL 的 dll)编写的。我想创建一个每 30 秒写入文件的线程。我希望线程函数成为我的一个类的方法

DWORD WINAPI CProfiler::MyThreadFunction( void* pContext )
{
   //Instructions that manipulate attributes from my class;
}

当我尝试启动线程时

HANDLE l_handle = CreateThread( NULL, 0, MyThreadFunction, NULL, 0L, NULL );

我收到了这个错误:

argument of type "DWORD (__stdcall CProfiler::*)(void *pContext)" 
is incompatible with parameter of type "LPTHREAD_START_ROUTINE"

如何在 DLL 中正确创建线程?任何帮助将不胜感激。

4

1 回答 1

8

您不能将指针传递给成员函数,就好像它是常规函数指针一样。您需要将您的成员函数声明为静态的。如果需要调用对象的成员函数,可以使用代理函数。

struct Foo
{
    virtual int Function();

    static DWORD WINAPI MyThreadFunction( void* pContext )
    {
        Foo *foo = static_cast<Foo*>(pContext);

        return foo->Function();
     }
};


Foo *foo = new Foo();

// call Foo::MyThreadFunction to start the thread
// Pass `foo` as the startup parameter of the thread function
CreateThread( NULL, 0, Foo::MyThreadFunction, foo, 0L, NULL );
于 2013-04-23T11:04:37.180 回答