Delphi でのクロス スレッド通信に関するドキュメントはありますか? ウィンドウのないスレッドにメッセージを送信するにはどうすればよいですか?
3 に答える
(Windows) メッセージは、ウィンドウ ハンドルが認識されると自動的に作成される標準メッセージ ループを実装するスレッドにのみ送信できます。
ただし、スレッドとの通信にメッセージを使用する必要はありません。イベント オブジェクト (VCL では TEvent) を待機させ、スレッドに関数を実行させたいときにこのイベントを通知します。
ただし、マルチスレッドに慣れていない場合は、学習効果が必要でない限り、これらすべての詳細を自分で調べないでください。OmniThreadLibraryを使用するだけで完了です。使い方を理解すれば、その内部を掘り下げることで学ぶべきことがたくさんあります。
編集:
非常によく似たこの質問への回答も参照してください。
編集2:
「[OmniThreadLibrary] を使用すると、何が簡単になり、どのくらいのコストがかかりますか?」というコメントについて 少なくとも Delphi 2007 を使用している場合は、自分で確認することをお勧めします。概念を説明するサンプルがいくつかありますが、「実際の」例を簡単に確認するには、このブログを参照してください。 post - そのためのライブラリをインストールする必要さえありません。
また、マルチスレッドにライブラリを使用するには、一定の信頼が必要であることに同意します。OTOH が VCL が提供するものを処理することは、ほとんど代替手段ではありません。サンプル コードでは、依然として不適切な Synchronize() 呼び出しが使用されています。マルチスレッド プログラミングにより適した、スレッド セーフなプロデューサー/コンシューマー キューなどはサポートされていません。また、マルチスレッド プログラムには VCL が提供するものよりも強固な基盤が必要であることに同意する場合、その特定の車輪を再発明する必要はありません。
ライブラリを使用するコストについては、十分に高速かどうかを自分で判断する必要があります。スレッド間の通信を良い方法で抽象化しますが、すべての抽象化は明らかにパフォーマンスを犠牲にします。
結局、自分には向いていないと判断した場合は、自分でコードを記述してください。Delphi 4 でも同じことを行い、そのコードを 10 年近く使用しています。その間に私が見つけたバグの量と経験したまれなケースから判断すると、マルチスレッドに慣れていない人には、独自のライブラリ コードを作成しないように強くお勧めします。そして、あなたが本当にそうしたいのであれば、この投稿のルールを心に留めておいてください.
Delphi Multi-Threading Message Loopの質問には、スレッド間の通信の例もいくつか含まれています
スレッド オブジェクトへの参照がある場合は、それを直接呼び出すだけで、プロシージャに情報を格納したり、それに応じて更新したりできます。明らかに、スレッドセーフな方法で物事を行うように注意する必要があります。
または、スレッドがビジーでないときに通信するための中央制御オブジェクトを使用することもできます。スレッドに特定の目的があり、スレッド ID が割り当てられているアプリがあります。どのスレッドも、メッセージ ID とパラメータの文字列を含むメッセージを別のスレッド ID に「ポスト」してから、その作業を続行できます。もう一方のスレッドは、暇なときにそれを取得し、それに応じて動作します。