C++中的函数指针
Function pointers in C++
我在C++中使用了CreateThread function to write a class like C# BackgroundWorker。我的代码:
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 的 class:
ListenThread.cpp:
class ListenThread :public BackgroundWorker
{
DWORD WINAPI Function(LPVOID vpPram)
{
//DO somthing...
return 0;
}
};
但是那一行给我以下错误:
non - standard syntax; use '&' to create a pointer to member
CreateThread 期望的函数指针必须具有此签名:
DWORD WINAPI ThreadProc(LPVOID lpParameter);
当你创建一个成员函数时,它会得到一个不可见的 "this" 参数作为第一个参数,所以你可以隐式地声明这样的东西:
DWORD WINAPI ThreadProc(BackgroundWorker *this, LPVOID lpParameter);
创建一个静态成员函数以省略 this 指针,如果您在线程例程中需要该指针,则将其作为 void * 参数传递
您的错误消息意味着您需要将指针传递给 &Function
函数,而不是 DoWork
中的 Function
。
不幸的是,修复此问题无济于事。 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;
}
我在C++中使用了CreateThread function to write a class like C# BackgroundWorker。我的代码:
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 的 class:
ListenThread.cpp:
class ListenThread :public BackgroundWorker
{
DWORD WINAPI Function(LPVOID vpPram)
{
//DO somthing...
return 0;
}
};
但是那一行给我以下错误:
non - standard syntax; use '&' to create a pointer to member
CreateThread 期望的函数指针必须具有此签名:
DWORD WINAPI ThreadProc(LPVOID lpParameter);
当你创建一个成员函数时,它会得到一个不可见的 "this" 参数作为第一个参数,所以你可以隐式地声明这样的东西:
DWORD WINAPI ThreadProc(BackgroundWorker *this, LPVOID lpParameter);
创建一个静态成员函数以省略 this 指针,如果您在线程例程中需要该指针,则将其作为 void * 参数传递
您的错误消息意味着您需要将指针传递给 &Function
函数,而不是 DoWork
中的 Function
。
不幸的是,修复此问题无济于事。 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;
}