3

私は WINAPI に慣れていません。また、Qt のみを使用して Qt に移植している 1 つの例で使用されている WaitForMultipleObjects を置き換える方法を探しています。出来ますか?

編集:(コメントで要求された詳細情報を提供する)

サード パーティの API は、一連のイベントを提供します。

HANDLE  m_hEv[MAX_EV];

スレッドのエンドル ループでは、プログラムは次のようなイベントを待ちます。

WaitForMultipleObjects(m_EvMax, m_hEv, FALSE ,INFINITE )

HANDLE型はvoid*のようです。Qt クラスが m_hEv の変更を監視し、スレッド実行のロックを解除できるかどうか疑問に思います。

4

2 に答える 2

6

WaitForMultipleObjectsWinAPI の外に移植する簡単な方法はありません。WinAPI には、すべてのロック可能なリソース (ソケット、ファイル、プロセス) が同じ一般的なタイプセーフHANDLEではない を提供するという「利点」がありますvoid*。リソースのタイプごとに異なる方法でロックおよびシグナルを送信する他のプラットフォームとは異なり、WinAPI でのイベント処理はリソースに大きく依存しません。WaitForMultipleObjects次に、誰が HANDLE を作成したかを気にする必要のない汎用関数が存在できます。そのため、コードが何をしようとしているのかを理解し、シナリオごとに異なる方法で模倣する必要があります。

最大の違いはWaitForMultipleObjects3 番目のパラメーターにあります。この場合、これはFALSEです。つまり、待機配列の単一のイベントが発生するとすぐに待機を終了します。これはより簡単なシナリオであり、QWaitCondition.

  1. の代わりにm_hEv、イベントを通知するコードに a を渡しますQWaitCondition*(ほとんどの場合 WinAPI 経由SetEvent(m_hEv[x])) 。
  2. WaitForMultipleObjects の代わりに、 を実行しますQWaitCondition::wait()
  3. の代わりにSetEvent()、してくださいQWaitCondition::wakeOne()

3 番目のパラメーターがTRUEの場合、WinAPI コードはすべての m_hEv イベントが通知されるまで待機します。このような機能の確立された名前は同期バリアであり、これもシミュレートできますQEventConditionが、Qt ボックスからは出てきません。私は自分で何もする必要はありませんでしたが、SOにはそれを行う方法がいくつかあります:

Qt同期バリア?

于 2012-09-17T09:24:15.027 に答える
2

WaitForMultipleObjects は、スレッド、プロセス、ミューテックスなど、多くのもので動作する一種の汎用関数です。Qt は、すべてのクラスがサポートする操作を公開する OOP ライブラリです。したがって、Qt での同等の操作は、使用しているクラスによって異なります。たとえば、スレッドでは、QThread::wait を使用します。ミューテックスでは、QMutex::lock を使用します。

于 2012-09-16T20:28:51.630 に答える