2017-07-08 7 views
0

メインスレッドでparrallelを実行しているスレッドを作成しました。両方のスレッドは何かを無限にやっています(どちらもwhile文を持っています)。メインスレッド(真)はフレーム内にゲームロジックを作成し、2番目のスレッドはソケットからメッセージを受け取ります。無限スレッドからのキャプチャ値C++

2番目のスレッドから返されることなく、2番目のスレッドから受け取ったメッセージの文字列値を各フレームのメインスレッドに取り込むことはできますか? C#では、メソッド呼び出し側で処理しますが、C++に役立つものは見つかりませんでした。 C++で実行することは可能ですか?スレッドを作成

機能:

void ReceiveMessage() { 
    //std::promise<int> p; 
    //auto f = p.get_future(); 
    char buf[1024]; 
    string usernput; 
    int bytesReceived = 0; 
    std::thread receiveMessage(&FactoredThread::ThreadFunction, *this); 
    receiveMessage.detach(); 
    //pokusajporuke = f.get(); 
} 

がThreadFunction:

void ThreadFunction() { 
    bytesReceived = 0; 
    while (true) { 
     bytesReceived = recv(sock, buf, 1024, 0); 
     if (bytesReceived > 0) { 
      string primljeniString = ""; 
      for (int i = 0; i < sizeof(buf); i++) { 
       if (buf[i] != 0) 
       { 
        primljeniString += buf[i]; 
       } 
      } 
      ZeroMemory(buf, 1024); 
      pokusajporuke = primljeniString; 

     } 
    } 
} 

メインスレッドの文字列を "pokusajporuke" を取得するには、どのように?

+0

これを達成する方法はたくさんありますが、それぞれ独自の利点と欠点があります。あなたは今まで何を試しましたか?どのように失敗したのですか? – Frank

+0

コードについては、私のペーストビンのリンクを確認してください。 https://pastebin.com/dvKXHDJf したがって、メソッドReceiveMessageでは、別のスレッド関数 "ThreadFunction"を作成しています。スレッド関数では、メインスレッドに「ポクサポロン」を得たいと思っています。 – user3147336

+0

私たちにいくつかのコードを表示するとよいでしょう。つまり、[質問する](https://stackoverflow.com/help/how-to-ask)の良い質問をし、[最小限の、完全で証明可能な例](https://stackoverflow.com/help/mcve)を作る)。あなたの質問は広すぎます。 – Akira

答えて

0

はい、確かです。この問題を解決する方法はたくさんあります。 1つの方法は、Qtのように信号とスロットを使用することです。純粋なC++の場合、スレッドセーフであるBoost.Signals2を使うことができます。 パターンプロデューサー - コンシューマーを実現できます。 1つのスレッド(プロデューサ)は値をバッファに入れます(スレッドセーフなバッファでなければなりません)。 私は、あなたの問題は第2の方法が良いと思います。

-1

私が必要としていたのは、グローバルな静的変数でした。そして、メインスレッドの別のメソッドを使って、そのグローバル変数をクラスプロパティに入れます。

+3

これはそれを行うにはひどい方法のように聞こえる。 –

+0

壊れていないものを修正しないでください:D – user3147336

+0

スレッドセーフキューを使用しないのはなぜですか? – devalone