C# C+中的函数指针+; 我以前写过一个C++类,我的代码是:
BackgroundWorker.h:C# C+中的函数指针+; 我以前写过一个C++类,我的代码是:,c#,c++,multithreading,backgroundworker,createthread,C#,C++,Multithreading,Backgroundworker,Createthread,BackgroundWorker.h: class BackgroundWorker { private : HANDLE _threadHandle; unsigned int _threadCallcounter; DWORD _threadID; public: BackgroundWorker(); ~BackgroundWorker(); virtual DWORD WINA
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;
}
};
但这一行给了我以下错误:
非标准语法;使用“&”创建指向成员的指针
CreateThread期望的函数指针必须具有以下签名:
DWORD WINAPI ThreadProc(LPVOID lpParameter);
创建成员函数时,它会获取一个不可见的“this”参数作为第一个参数,因此隐式声明如下:
DWORD WINAPI ThreadProc(BackgroundWorker *this, LPVOID lpParameter);
创建一个静态成员函数以省略此指针,如果需要在线程例程中使用该指针作为void*参数传递,则错误消息意味着您需要将指针作为
函数传递,而不是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;
}
#包括
#包括
类后台工作程序
{
私人:
手柄(螺纹手柄),;
德沃德(DWORD)threadID ;;
公众:
静态DWORD WINAPI StaticThreadStart(void*Param){
BackgroundWorker*此=静态施法(参数);
返回此->函数();
}
虚DWORD函数(){
返回0;
}
无效销钉(){
_threadHandle=CreateThread(NULL,0,StaticThreadStart,this,0,&_threadID);
}
};
类ListenThread:公共后台工作程序{
DWORD函数()重写{
STD::你对代码< > ->函数< /C> >什么意思?调用它?传递函数的地址?但是你知道代码< > STD::线程< /C> >,右?CeReType(哪一个应该用C++代码,它在15年前到处提到),并切换到std::thread。@SergeyA:Ifstd::thread
提供了与CreateThread
相同的功能(或\u beginthreadex
)举例来说,尝试用一个代码来创建一个挂起状态的线程:例如,使用代码< > STD::线程< /C> >,首先,CreateThread不应该在C++代码中使用。请参阅OP使用后者的任何额外功能。显然,本机线程的某些功能不是通过std::thread
公开的,但除非使用它们,否则应首选std::thread
。对于使用CRT的线程(您就是这样),不应使用CreateThread
。这是:调用C运行时库(CRT)的可执行文件中的线程应使用_beginthreadex和_endthreadex函数进行线程管理,而不是CreateThread和ExitThread;[…]。如果使用CreateThread创建的线程调用CRT,CRT可能会在内存不足的情况下终止进程