Multithreading c++;此参数通过System::Threading:ThreadStart到类成员函数 我用C++编写了一个图形用户界面程序,我需要在程序中创建一个线程。 所以我使用System::Threading名称空间来实现我的目标

Multithreading c++;此参数通过System::Threading:ThreadStart到类成员函数 我用C++编写了一个图形用户界面程序,我需要在程序中创建一个线程。 所以我使用System::Threading名称空间来实现我的目标,multithreading,winforms,oop,c++-cli,Multithreading,Winforms,Oop,C++ Cli,我想用作线程的函数是一个类成员函数,下面是我所做的: Server::Server() // constructor { System::Threading::Thread^ T = gcnew System::Threading::Thread(gcnew System::Threading::ThreadStart(this, this->RunServer)); // Server::RunServer T->Start(); } 因为它给了我这些错误: 错误

我想用作线程的函数是一个类成员函数,下面是我所做的:

Server::Server() // constructor
{
    System::Threading::Thread^ T = gcnew System::Threading::Thread(gcnew System::Threading::ThreadStart(this, this->RunServer)); // Server::RunServer
    T->Start();
}
因为它给了我这些错误:

错误2错误C3350:“系统::线程::线程启动”:委托 构造函数需要2个参数

错误1错误C3867:“服务器::运行服务器”:缺少函数调用 参数表;使用“&Server::RunServer”创建指向的指针 成员

我试过这个电话:

Server::Server() // constructor
{
    System::Threading::Thread^ T = gcnew System::Threading::Thread(gcnew System::Threading::ThreadStart(&Server::RunServer));
    T->Start();
}
并收到以下错误:

错误1错误C3364:“系统::线程::线程开始”:无效 委托构造函数的参数;委托目标必须是一个 指向成员的指针 作用

2 IntelliSense:委托初始值设定项无效--函数不是 管理团队成员 阶级

据我所知,第二次尝试没有成功,因为
Server::RunServer
没有地址,所以就像执行
&1
一样

顺便说一句,我尝试使用
ThreadStart
创建非类memeber函数的线程,效果很好

我正在使用win7-VisualStudio2012。如何让它工作

编辑: 服务器声明:

class Server
{
public:

    /* Fields */
    std::string Port;
    std::string Host;
    WSADATA wsaData;
    int ListenResult;
    SOCKET ListenSocket;
    SOCKET* ClientSocket;
    SOCKADDR_IN* ADDR;
    int ADDRSize;
    struct addrinfo *result;
    struct addrinfo hints;
    std::vector<Client> Clients;

    /* Methods */
    Server();
    std::wstring StringW(char* String);
    void Print(std::wstring String);
    std::wstring CurrentTime();
    void ParseServerIni();
    void RunServer();
    void PartToString(Part* _Part);
    void InsertListItem(std::string String);
    void ClientHandler(SOCKET* _Sock, SOCKADDR_IN* _ADDR);
    int ParsePacket(Packet &_Packet, int _Bytes, Byte** _PacketBlock);

};
类服务器
{
公众:
/*田地*/
std::字符串端口;
std::字符串主机;
WSADATA WSADATA;
int ListenResult;
SOCKET-ListenSocket;
SOCKET*ClientSocket;
SOCKADDR_IN*ADDR;
int ADDRSize;
结构addrinfo*结果;
结构addrinfo提示;
向量客户端;
/*方法*/
服务器();
std::wstring StringW(字符*字符串);
无效打印(标准::wstring字符串);
std::wstring CurrentTime();
void ParseServerIni();
void RunServer();
无效零件串(零件*\u零件);
void InsertListItem(std::string);
void ClientHandler(SOCKET*\u Sock,SOCKADDR\u IN*\u ADDR);
int ParsePacket(数据包和数据包,int字节,字节**PacketBlock);
};

您的语法几乎正确了

假设声明是:

public ref class Server
{
    void RunServer();
};
然后,您应该结合两种方法,通过使用声明类的名称指定调用方法的对象和方法的地址

gcnew System::Threading::ThreadStart(this, &Server::RunServer)

你几乎把语法弄对了

假设声明是:

public ref class Server
{
    void RunServer();
};
然后,您应该结合两种方法,通过使用声明类的名称指定调用方法的对象和方法的地址

gcnew System::Threading::ThreadStart(this, &Server::RunServer)

ref属性对我来说是新的,现在我看到必须将所有类变量都更改为指针。我会努力的。我花了一些时间将整个变量和对象更改为指针。ref属性对我来说是新的,现在我看到我必须将所有类变量更改为指针。我会努力的。我花了一些时间将整个变量和对象更改为指针。