я использовал Функция CreateThread написать класс как C # BackgroundWorker в C ++. Мой код:
BackgroundWorker.h:
class BackgroundWorker
{
private :
HANDLE _threadHandle;
unsigned int _threadCallcounter;
DWORD _threadID;
public:
BackgroundWorker();
~BackgroundWorker();
virtual DWORD WINAPI Function(LPVOID vpPram);
}
BackgroundWorker.cpp:
#include "BackgroundWorker.h"void BackgroundWorker::DoWork()
{
this->_threadHandle = CreateThread(NULL,
0,this->Function,&this->_threadCallcounter,
0, &this->_threadID); // !!!***This part throws an error***!!!
}
Затем я создал еще один класс, производный от BackgroundWorker:
ListenThread.cpp:
class ListenThread :public BackgroundWorker
{
DWORD WINAPI Function(LPVOID vpPram)
{
//DO somthing...
return 0;
}
};
Но эта строка дает мне следующую ошибку:
нестандартный синтаксис; использовать&создать указатель на член
Ваше сообщение об ошибке означает, что вам нужно передать указатель на функцию как &Function
не Function
в DoWork
,
К сожалению, это не поможет. CreateThread
не работает с (нестатическими) функциями-членами. Решением является создание статического метода для использования в качестве фактической функции запуска потока.
Проверьте этот пример:
#include <Windows.h>
#include <iostream>
class BackgroundWorker
{
private :
HANDLE _threadHandle;
DWORD _threadID;
public:
static DWORD WINAPI StaticThreadStart(void * Param) {
BackgroundWorker * This = static_cast<BackgroundWorker *>(Param);
return This->Function();
}
virtual DWORD Function() {
return 0;
}
void DoWork() {
_threadHandle = CreateThread(NULL, 0, StaticThreadStart, this, 0, &_threadID);
}
};
class ListenThread : public BackgroundWorker {
DWORD Function() override {
std::cout << "Working...\n";
return 0;
}
};
int main()
{
ListenThread cl;
cl.DoWork();
// Call pause to wait for new thread in this example
system("pause");
return 0;
}
Указатель функции, которого ожидает CreateThread, должен иметь эту подпись:
DWORD WINAPI ThreadProc(LPVOID lpParameter);
Когда вы создаете функцию-член, она получает невидимый параметр «this» в качестве первого аргумента, поэтому вы неявно объявляете что-то вроде этого:
DWORD WINAPI ThreadProc(BackgroundWorker *this, LPVOID lpParameter);
Создайте статическую функцию-член, чтобы опустить указатель this, и если вам нужен этот указатель внутри подпрограммы потока, передайте ее как параметр void *