2013-04-23 22 views
5

Pracuję nad profilera .NET, który piszę w C++ (biblioteka dll, która używa ATL). Chcę utworzyć wątek, który zapisuje do pliku co 30 sekund. Chcę funkcja gwint być metoda jednego z moich klasUtwórz wątek wewnątrz DLL

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

gdy próbuję uruchomić wątku

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

mam ten błąd:

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

Jak prawidłowo utworzyć wątek w bibliotece DLL? Każda pomoc będzie dostępna.

+1

Wskaźniki funkcji i wskaźniki funkcji elementów są bardzo różne. Musisz zadeklarować funkcję członka jako statyczną. –

+0

możliwy duplikat [Jak używać CreateThread dla funkcji, które są członkami klasy?] (Http://stackoverflow.com/questions/1372967/how-do-you-use-createthread-for-functions-which-are-class -members) –

Odpowiedz

7

Nie można przekazać wskaźnika do funkcji składowej tak, jakby był zwykłym wskaźnikiem funkcji. Musisz zadeklarować swoją funkcję członka jako statyczną. Jeśli chcesz wywołać funkcję członka na obiekcie, możesz użyć funkcji proxy.

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