2013-04-23 3 views
5

Я работаю над профилировщиком .NET, который я пишу на C++ (DLL, использующая ATL). Я хочу создать поток, который записывается в файл каждые 30 секунд. Я хочу, чтобы функция потока как метод одного из моих классовСоздать тему в DLL

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? Любая помощь будет оценена.

+1

Функции указателей и указателей на функции-члены очень разные. Вам нужно объявить функцию-член как статическую. –

+0

Возможный дубликат [Как вы используете CreateThread для функций, являющихся членами класса?] (Http://stackoverflow.com/questions/1372967/how-do-you-use-createthread-for-functions-which-are-class -members) –

ответ

7

Вы не можете передать указатель на функцию-член, как если бы это был обычный указатель на функцию. Вы должны объявить свою функцию-член как статическую. Если вам нужно вызвать функцию-член на объекте, вы можете использовать прокси-функцию.

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); 
Смежные вопросы