c # — указатели на функции в переполнении стека

я использовал Функция 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;
}
};

Но эта строка дает мне следующую ошибку:

нестандартный синтаксис; использовать&создать указатель на член

5

Решение

Ваше сообщение об ошибке означает, что вам нужно передать указатель на функцию как &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;
}
1

Другие решения

Указатель функции, которого ожидает CreateThread, должен иметь эту подпись:

DWORD WINAPI ThreadProc(LPVOID lpParameter);

Когда вы создаете функцию-член, она получает невидимый параметр «this» в качестве первого аргумента, поэтому вы неявно объявляете что-то вроде этого:

DWORD WINAPI ThreadProc(BackgroundWorker *this, LPVOID lpParameter);

Создайте статическую функцию-член, чтобы опустить указатель this, и если вам нужен этот указатель внутри подпрограммы потока, передайте ее как параметр void *

3