1

よくわからない行動について質問があります。

私はc++コードの2つのバリエーションがあります:

CreateThread( NULL, 0, ( LPTHREAD_START_ROUTINE ) clientThread, ( LPVOID ) connectionSocket, 0, NULL ); 

スレッド:

Client a;
a.clientsocket = connectionSocket;
a.testText()
a.sendSocket();

正常に動作します(sendSocketはいくつかのテストデータをソケットに送信します)。

しかし、私がそうするなら

Client a;
a.clientsocket = connectionSocket;
CreateThread( NULL, 0, ( LPTHREAD_START_ROUTINE ) clientThread, ( LPVOID ) &a, 0, NULL );

スレッドを使用します:

a.testText();
a.sendSocket();

testText()のみが機能します。

それがなぜなのか、私は少し混乱しています。私はC++の趣味ですが:-)

編集:

Clientクラスを追加しました:

class Client
{
public:
    SOCKET clientsocket;

    Client()
{
}
~Client(){}
void displayMessage()
{
        std::cout << "test message client class" << std::endl;
}
int sendSocket()
{
    char *sendbuf = "CLIENT TEST";
    send(clientsocket, sendbuf, (int)strlen(sendbuf),0);
    closesocket(clientsocket);
    return 0;

}
};
4

5 に答える 5

2

メインスレッドでCreateThreadが成功した後、Client変数aがスコープ外になり、破棄されたと推測しています。

于 2012-04-16T18:21:03.763 に答える
0

アノン何かが範囲外になるという正しい方向に進んでいるかもしれませんが、それはそうだと思いますconnectionSocketa.sendSocket()ただし、それが機能しないと言った場合は、意味する内容の詳細を提供する必要があります。アプリケーションはクラッシュしますか?例外をキャッチしますか?アプリケーションは引き続き機能しますが、sendSocket()呼び出しによって実際に何かが送信されませんでしたか?実際の問題は何ですか?

于 2012-04-16T18:28:07.703 に答える
0

前者の場合はconnectionSocketを渡し、後者の場合はClient型のへのポインタを渡します。多分あなたは意味しました:

CreateThread( NULL, 0, ( LPTHREAD_START_ROUTINE ) clientThread, ( LPVOID ) a.clientsocket, 0, NULL );
于 2012-04-16T18:31:11.383 に答える
0

スコープ外のオブジェクトのように見えます。SOCKETは単なるintHANDLE値であり、のメンバーに格納されます。'a'は、作成中のスレッドが実行されると、スレッド作成関数のスコープ外になります(または、次のaccept()が戻ると破損します)。

試す:

クライアントa=new Client();

マルチスレッドコードでスタックにオブジェクトを割り当てる前に15回考えてから、動的に割り当てることを決定します。

PS-@Anonが最初にそこに着きました-私は気づいていませんでした。

于 2012-04-16T19:06:16.580 に答える
0

クライアントクラスから

SOCKET clientsocket;

それをスレッドに渡すときはいつでも、SOCKETはコピーコンストラクターを呼び出します。このコピーコンストラクターが未定義であるか、同じポートで新しい接続を開こうとして失敗した可能性があります。

これに変更します:

SOCKET* clientsocket;

それからあなたがしたいときはいつでもそれを持っている...

a.clientsocket = connectionSocket;

変数「connectionSocket」はポインターであり、ブームはダイナマイトになります。変数として宣言されていない場合、コピーコンストラクターが呼び出され、以前使用していたものよりもまったく新しいソケットが取得されます。私はそれが役立つと思いますか?

于 2013-06-18T20:17:33.287 に答える