1

Windows MFCの同時実行性で、特定の状態が達成されるまで待機するように現在のスレッドに指示するにはどうすればよいですか?現時点で私が考えることができる唯一の方法は、定期的なスリープを実行して状態を確認することです。意図した状態になったら、続行します。これを行うためのより良い方法はありますか?

BOOL achieved = FALSE;

int main (int argc, char** argv) {

  // This function creates a new thread and modifies the 'achieved' global variable at some point in the future
  doSomethingOnAnotherThread();

  // Wait maximum 4 seconds for 'achieved' to be TRUE, otherwise give up
  for(int i=0; i<5; i++) {
    EnterCriticalSection(&CS);
    int localAchieved = achieved;
    LeaveCriticalSection(&CS);

    if (!localAchieved) { 
      if(i==4) { 
        cout << "waited too long .. giving up" << endl; 
        break; 
      }
      Sleep(1000); // let's wait 1 more second and see what happen
    } else {
      cout << "achieved is TRUE, resuming main thread" << endl;
      break;
    }
  }
}
4

3 に答える 3

4

CEventクラス

イベントを表します。これは、あるスレッドが別のスレッドにイベントが発生したことを通知できるようにする同期オブジェクトです。

したがって、これは問題を解決するための適切なツールです。

それを説明しましょう:

void DoSomethingOnAnotherThread(CEvent* event)
{
    // Long-running operation.
    ...

    // Sets the state of the event to signaled, releasing any waiting threads.
    event->SetEvent();

    // TODO: maybe add try/catch and SetEvent() always after the long-running operation???
}

int main (int argc, char** argv)
{
    // Manual-reset event.
    CEvent achieved_event(FALSE, TRUE);

    // This function creates a new thread and modifies the 'achieved' global variable at some point in the future
    DoSomethingOnAnotherThread(&achieved_event);

    // Wait the event to be signalled for 4 seconds!
    DWORD wait_result = WaitForSingleObject(achieved_event, 4000);

    switch (wait_result) {
    case WAIT_OBJECT_0:
        std::cout << "Achieved!" << std::endl;
        break;
    case WAIT_TIMEOUT:
        std::cout << "Timeout!" << std::endl;
        break;
    default: // WAIT_FAILED
        std::cout << "Failed to wait!" << std::endl;
        break;
    }
}
于 2013-01-29T11:05:14.637 に答える
2

使用したいのはイベントオブジェクトです。

于 2013-01-29T06:20:25.797 に答える
2

ポーリングの代わりに、WinAPIを使用できます。CreateEventおよびWaitForSingleObjectを参照してください。

于 2013-01-29T06:20:52.380 に答える