9

次の特性を持つ Delphi でスレッドを作成する必要があります。

  • メイン スレッドが共有キューにデータを追加するまで待機します。
  • キュー内のすべてのデータを処理し、結果をメイン スレッドに返します (この最後の部分では、メイン ウィンドウにメッセージを送信するだけです)。処理には時間がかかるため、ワーカー スレッドが前のエントリを処理している間に、新しいデータがキューに追加されることがあります。
  • 可能な限り少ない CPU サイクルを使用して、待機を再開します。

ウィンドウハンドルがないため、スレッドにメッセージを送信できません。

WaitForObject のバリアントを使用する必要がありますか? もしそうなら、何を待つのでしょうか?そうでない場合、どうすればスレッドを待機させ、新しいデータがキューを下ったときにスレッドを起こすことができますか?

Multithreading - The Delphi Wayを読みましたが、私の質問には答えていないようです。おそらく 、OmniThreadLibraryは私が必要とすることを行うことができます。資料が少ないのでなんとも言えません。ここでライブラリが役立つかどうか、およびその使用方法 (または、単に TThread の子孫を操作する代わりに使用する理由さえ) を理解するために、一般的にスレッドについて十分に知りません。

4

4 に答える 4

13

OmniThreadLibrary は間違いなくここで役立ちます。OTL ディストリビューションのテスト 5 は、開始するのに役立ちます。

このデモでは、「開始」ボタンがスレッドを作成し、いくつかのパラメーターとタイマーを設定します (不要な場合はコードで削除できます)。「変更メッセージ」はスレッドにメッセージを送信し、このメッセージはスレッドの OMChangeMes​​sage メソッドで処理されます。その後、スレッドはクライアントに何らかの情報を送り返し (このデモでは OMSendMessage ですが、作業を行う同じメッセージでこれを行うことができます)、メイン スレッドは OmniEventMonitor コンポーネントを介してこのメ​​ッセージを受信します。「停止」ボタンはワーカースレッドを停止します。

スレッドがビジー状態である間にさらにメッセージが到着すると、ワーカー メソッドが作業を完了するとすぐにキューに入れられて処理されます。何もすることがない場合、スレッドはプロセスでゼロ CPU サイクルを使用して次のメッセージを待ちます。

編集

Delphi 2009 以降では、バックグラウンド ワーカーパターンがよりシンプルなソリューションを提供します。

于 2009-11-14T21:09:54.323 に答える
2

WaitForSingleObject()は、いくつかのタイプの同期オブジェクトを待機できます。Windowsの「イベント」同期オブジェクト(Delphiイベントとは関係ありません)を使用できます。イベントを作成し(SyncObjs、IIRCにはDelphi TEventラッパーがあります)、WaitForSingleObjectを呼び出して、そのイベントが通知されるのを待ちます。スレッドをスリープ解除する必要がある場合は、SetEventを呼び出してイベントをシグナル状態にし、WaitForSingleObjectが戻ります。WaitForMultipleObjects()を使用して、スレッドに複数のオブジェクトの1つ(またはすべて)を待機させることができます。これにより、どのオブジェクトがシグナリングされたかがわかります。

于 2009-11-14T22:02:57.750 に答える
1

スレッドにウィンドウ ハンドルがなくても、確実にメッセージを送信できます。またはPostThreadMessage()の代わりに使用してください。[delphi] タグで検索すると、StackOverflow に関する詳細情報がここにあります。ここにすべてを複製することはお勧めできません。SendMessage()PostMessage()PostThreadMessage()

しかし、スレッド プログラミングの知識がない場合は、低レベルのものではなく OTL から始めるのが良いことかもしれません。

于 2009-11-14T21:23:45.920 に答える