Я работаю над профилировщиком .NET, который я пишу на c ++ (DLL, которая использует ATL). Я хочу создать поток, который пишет в файл каждые 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?
Любая помощь будет оценена.
Вы не можете передать указатель на функцию-член, как если бы это был обычный указатель на функцию. Вы должны объявить вашу функцию-член как статическую. Если вам нужно вызвать функцию-член для объекта, вы можете использовать прокси-функцию.
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 );
Других решений пока нет …