Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C+中的函数指针+; 我以前写过一个C++类,我的代码是:_C#_C++_Multithreading_Backgroundworker_Createthread - Fatal编程技术网

C# C+中的函数指针+; 我以前写过一个C++类,我的代码是:

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

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;
    }
};
但这一行给了我以下错误:

非标准语法;使用“&”创建指向成员的指针


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:If
std::thread
提供了与
CreateThread
相同的功能(或
\u beginthreadex
)举例来说,尝试用一个代码来创建一个挂起状态的线程:例如,使用代码< > STD::线程< /C> >,首先,CreateThread不应该在C++代码中使用。请参阅OP使用后者的任何额外功能。显然,本机线程的某些功能不是通过
std::thread
公开的,但除非使用它们,否则应首选
std::thread
。对于使用CRT的线程(您就是这样),不应使用
CreateThread
。这是:调用C运行时库(CRT)的可执行文件中的线程应使用_beginthreadex和_endthreadex函数进行线程管理,而不是CreateThread和ExitThread;[…]。如果使用CreateThread创建的线程调用CRT,CRT可能会在内存不足的情况下终止进程