0

次のコードをご覧ください

Server.h

#pragma once
class Server
{
public:
    Server(void);
    ~Server(void);

    DWORD WINAPI serverThread(LPVOID param);

private:
    SOCKADDR_STORAGE from;
    int retval, fromlen, socket_type;
    char servstr[NI_MAXSERV],hoststr[NI_MAXHOST];
    SOCKET serverSocket, acceptSocket;
};

Server.cpp

ここに小さなパーツが表示されます。

Server:Server()
{
//Code

//Passing data to thread
        DWORD threadId;
        HANDLE hdl;

        hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE) serverThread,(LPVOID)acceptSocket,0,&threadId);

//Code
}


DWORD WINAPI Server::serverThread(LPVOID param)
{
//code
}

このコードはエラーを生成しています

 error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'LPTHREAD_START_ROUTINE'

それはラインからです

hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE) serverThread,(LPVOID)acceptSocket,0,&threadId);

どうしてこれなの?助けてください!

4

1 に答える 1

6

非静的メソッドには、静的メソッドまたはグローバルメソッドとは異なるタイプがあります。非静的メンバー関数にはポインターである非表示のパラメーターがあるため、本質的に関数には次のようなシグネチャがあることthisに注意してください。serverThread

DWORD WINAPI serverThread(Server *this, LPVOID param);

したがって、これが機能しない理由がわかります(キャストを使用しても機能しません-奇妙な恐ろしさが発生します)。

LPTHREAD_START_ROUTINEと互換性を持たせるには、静的メンバー関数がクラスの特定のインスタンスで動作しないため、thisポインターを必要としないため、静的にする必要があります。

static DWORD WINAPI serverThread(LPVOID param);

そして、acceptSocketをlpParameterとしてCreateThreadに渡す代わりに、次のように渡します

hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)serverThread, this,0,&threadId);

serverThread内では、Serverオブジェクトを介してacceptSocketメンバーにアクセスできます。

于 2013-03-21T20:38:41.413 に答える