c ++这个参数通过System :: Threading:ThreadStart到类成员函数

时间:2013-09-09 13:36:12

标签: multithreading winforms oop c++-cli

我正在用c ++编写一个图形用户界面程序,我需要在程序中创建一个线程。 所以我正在使用System::Threading命名空间来实现我的目标。

我想用作线程的函数是一个类成员函数,所以这就是我所做的:

Server::Server() // constructor
{
    System::Threading::Thread^ T = gcnew System::Threading::Thread(gcnew System::Threading::ThreadStart(this, this->RunServer)); // Server::RunServer
    T->Start();
}

因为它给了我这些错误:

  

错误2错误C3350:'System :: Threading :: ThreadStart':委托   构造函数需要2个参数

     

错误1错误C3867:'Server :: RunServer':函数调用缺失   参数列表;使用'& Server :: RunServer'创建指针   构件

我试过这个电话:

Server::Server() // constructor
{
    System::Threading::Thread^ T = gcnew System::Threading::Thread(gcnew System::Threading::ThreadStart(&Server::RunServer));
    T->Start();
}

并收到此错误:

  

错误1错误C3364:'System :: Threading :: ThreadStart':无效   委托构造函数的参数;委托目标需要是一个   指向成员的指针   功能

     

2 IntelliSense:无效的委托初始化程序 - 功能不是a   管理员   类

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

顺便说一句,我尝试使用ThreadStart来创建无类memeber函数的线程,并且它运行正常。

我正在使用win7 - visual studio 2012.如何使它工作?

编辑: 服务器声明:

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);

};

1 个答案:

答案 0 :(得分:4)

你几乎得到了正确的语法。

假设声明是:

public ref class Server
{
    void RunServer();
};

然后你应该结合你的两种方法,通过指定调用方法的对象和方法的地址,以及声明类的名称。

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