2

C++のスレッドを使用してバックグラウンドでタスクを実行する必要があります。実際、コードでは、curlを使用して複数のHTTPリクエストを送信する必要があり、タスクが完了するまでメインスレッドがブロックされるため、メインスレッドを使用して実行したくありません。したがって、httpリクエストごとに次のようにする必要があります。

a)新しいスレッドが作成されますb)この新しいスレッドでcurl reqを送信しますc)req / responseが完了したら、応答/データをメインスレッドに送り返します

このプロセスの間、メインスレッドを解放して、他の独自のタスクを実行する必要があります。私はC++とスレッド化に不慣れですが、これを実現する方法を教えてください。

4

3 に答える 3

1

ワーカースレッドが完了したらすぐにメインスレッドに通知する場合は、メインスレッドにメッセージ処理ループが必要なようです。

これは、WinAPIのウィンドウプロシージャと同じ方法で実装できると思っています。これらの線に沿った何か。

cEvent event;
while( true )
{
  event = GetNextEvent();
  if( event.GetType() == APPQUIT )
  {
    break;
  }
  if( event.GetType() == SENDHHPTREQUEST )
  {
    // Create worker thread etc.
  }
  else if( event.GetType() == HTTPREQUESTCOMPLETED )
  {
    // Process HTTP request resuts.
  }
  ...
}

ワーカースレッドには、メインスレッドにイベントを送信する方法が必要です。そしてもちろん、メッセージキューからのイベントの削除はスレッドセーフである必要があります。つまり、ミューテックスで保護されている必要があります。そして、リクエストを作成したり、リクエストの結果を処理したりするために必要なすべてのデータは、何らかの方法でcEventにパッケージ化する必要があると思います。

于 2012-12-21T08:51:45.890 に答える
0

メインスレッドに通知するには、条件変数または自動または手動のリセットイベントを使用する必要があります。セカンダリスレッドを開始すると、メインスレッドはこの条件変数を待機します。セカンダリスレッドが完了すると、メインスレッドにフラグが通知され、メインスレッドに完了を知らせ、実行を継続できます。

于 2012-12-21T09:13:01.160 に答える
0

c ++ 11標準を使用している場合は、コードのラムダを取得し、次に画面が更新されたときにメインスレッド(常にメインスレッド上にある)を呼び出すようにスケジュールする「メインスレッド呼び出し元」を作成する必要がありました。内部的にはラムダのベクトルを使用し、updateが呼び出されるたびにそれを排出します。ラムダがない場合、更新はスケジュールされません。iOS/Droidのプロダクションコードで広く使用しています。ここで入手できます: https ://github.com/radif/emjCCMainThreadCaller

于 2013-03-02T08:00:00.913 に答える