0

私の英語でごめんなさい

私は周りを検索しましたが、この質問に対する答えが得られませんでした.ブーストスレッドライブラリを使用するWindowsアプリケーションプロジェクトがあります. ワーカーのスレッドからメインの UI スレッドにメッセージを送信 (またはコールバックを呼び出し) したいと考えています。私はboost::asioでサンプルを調べましたが、それらはすべてブロックされたメインスレッドで使用されていましたが、私のUIスレッドは非同期で動作しています.

助けてくれませんか?どうもありがとう!

4

2 に答える 2

1

UI スレッドには独自のメッセージ ループがあるため、そのコンテキストでブロッキングio_service::run()関数を呼び出すことはできません。できることは、ポーリング UI 関連のメソッドをio_service::poll_one()次のようにインターリーブすることです。

  // WARINING: untested code
  MSG msg;
  while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    if (io_service_.stopped())
      io_service_.reset();
    error_code ec;
    io_service_.poll_one(ec);
  }

ファンクターをio_service_に投稿すると、実際にはメインの GUI スレッドに投稿されます。

(確かに、何らかの GUI フレームワークを使用している場合は、代わりに適切なフレームワーク メソッドを使用する必要がありますPeekMessage。)

于 2013-06-26T08:52:36.033 に答える
0

UI スレッドは、Webkit を使用している場合は別の方法で処理できるため、Webkit に似た種類の UI またはプレーンな Windows フォームです。またはデリゲートを使用してみてください。または、最終的に何もうまくいかない場合は、while ループを実行して、新しい入力がないかベクターをチェックし、スレッド コールバック関数からベクターに追加できます。

デリゲートを使用できれば幸いです。(ポインター機能)

ポインター関数のサンプル コードを次に示します。

次のような関数を定義します。

typedef boost::function<void(std::string)> fnLog;

または、特にWindowsに行きたい場合は、

typedef void (__stdcall *fnLog)(char* val);

fnLog は std::string パラメータを持つ関数です。次に、UIスレッドにある関数をポインター関数にバインドします

fnLog myPointerFunc = boost::bind( &UI::f1, _1);

それから合格

myPointerFunc

コールバックとして。

詳細については、http://www.radmangames.com/programming/how-to-use-boost-function を参照して ください。

于 2013-06-26T05:46:28.590 に答える