Самый простой способ справиться с этим - создать функцию-заглушку, которая вызывает ваш класс.
UINT tid
HANDLE hThread = CreateThread(NULL, 0, myThreadStub, this, 0, &tid);
....
unsigned long WINAPI myThreadStub(void *ptr)
{
if (!ptr) return -1;
return ((MyClass*)ptr)->ThreadMain();
}
CreateThread () позволяет передавать аргумент функции потока (параметр 4 вызова CreateThread ()).Вы можете использовать это, чтобы передать указатель на ваш класс.Затем вы можете заставить потоковую заглушку привести этот указатель обратно к нужному типу и затем вызвать функцию-член.Вы даже можете иметь myThreadStub в качестве статического члена «MyClass», что позволяет ему получать доступ к закрытым членам и данным.
Если у вас установлен boost, вы можете использовать boost:: связать, чтобы сделать это без создания функции-заглушки.Я никогда не пробовал это на Windows, поэтому я не могу сказать наверняка, что это будет работать (потому что функция обратного вызова должна быть вызовом WINAPI), но если она работает, это будет выглядеть примерно так:
HANDLE hThread = CreateThread(NULL, 0, boost::bind(&MyClass::ThreadFunction, this), NULL, 0, &tid);
Где функция потока - это нестатическая функция-член, которая принимает один аргумент void *.