0

私の現在のアプローチは次のようになります。

// Somewhere in a UI class
// Called when a button called "Start" clicked
MyWindow::OnStartClicked(Event &sender)
{
  _thread = new boost::thread(boost::bind(&MyWindow::WorkToDo, this));
}

MyWindow::WorkToDo()
{
  for(int i = 1; i < 10000000; i++)
  {
    int percentage = (int)((float)i / 100000000.f);
    _progressBar->SetValue(percentage);
    _statusText->SetText("Working... %d%%", percentage);
    printf("Pretend to do something useful...\n");
  }
}

// Called on every frame
MyWindow::OnUpdate()
{
  if(_thread != 0 && _thread->timed_join(boost::posix_time::seconds(0))
  {
    _progressBar->SetValue(100);
    _statusText->SetText("Completed!");
    delete _thread;
    _thread = 0;
  }
}

しかし、プログラムの実行の最後に未処理の例外が発生し続けるため、これは安全とは言えません。

基本的にGUI部分をブロックせずに、重いタスクを別のスレッドに分けたいと思っています。

4

2 に答える 2

1

これを行うには非常に多くの方法があるため、特定するのは困難です。Windows では、多くの場合、GUI アクションに基づいてスレッドを開始し、結果や進行状況がメッセージ ポンプ ループを介して GUI にポストされます。カスタム ウィンドウ メッセージを宣言または登録し、ワーカー スレッドのさまざまなレポート位置にそれらをメイン ウィンドウ ハンドルまたは子ウィンドウ ハンドルのセットアップにポストして、非同期の進行状況を監視します。

これを行う方法はたくさんあります。上記は1つの説明にすぎませんが、中程度のタスクの場合、一般的に問題を解決するものです. その場合、ここに示したコードは正しいです。直接設定してメッセージループをバイパスしているので(実際にはそうではありませんが、必要な限り)、これは機能するはずです。

于 2012-09-05T20:13:24.643 に答える
0

Boost または C++11 のいずれかを使用できる場合は、boost/std::future と async を試してみてください

于 2012-09-05T21:02:42.903 に答える