TIdHttpServerを使用していくつかのコマンドを処理していますが、いくつかのコマンドが失われているというのは、私がOnConnect内のvclを更新しているからです。TIdHttpServerがVCLと同期する
Synchronizeメソッドを使用してVCLをsafleyで更新するにはどうすればよいですか?
TIdHttpServerを使用していくつかのコマンドを処理していますが、いくつかのコマンドが失われているというのは、私がOnConnect内のvclを更新しているからです。TIdHttpServerがVCLと同期する
Synchronizeメソッドを使用してVCLをsafleyで更新するにはどうすればよいですか?
これは簡単です。TThread.Synchronize()
には、GUIスレッドによって呼び出される番号TThreadMethod
が必要です。 TThreadMethod
はパラメータなしprocedure of object
ですが、呼び出しを行っているセカンダリスレッドは、同期メソッドがGUIスレッドによって実行されるまでブロックされているので、さらなる保護なしにsynchronizedメソッドのTThread
メンバを使用できます。
私は、いくつかの選択肢がありますが、すべてが優れていることを言及する必要があります(何も悪化することはないので試していないものもあります)。 Indyには変数を持ち、カスタムメソッドを実装するために派生できるクラスTIdSync
とTIdNotify
があります。新しいデルファイのバージョンはTThread.Queue()
とTThread.ForceQueue()
であり、匿名メソッドを使用して呼び出しスレッドをブロックせずにGUIスレッドが実行できるクロージャ(キャプチャされた変数付き)を生成できます。 PostMessage()
とPostThreadMessage()
APIもあります。これは、D3/W95以降に変更なしで動作し、Windows上で永遠に利用可能な通信システムです。
インディは、それぞれ同期スレッドと非同期スレッドで同期するための独自のTIdSync
とTIdNotify
クラスを持っています。 TIdSync
から新しいクラスを派生し、そのDoSynchronize()
メソッドをオーバーライドするか、またはTIdNotify
から派生し、そのDoNotify()
メソッドをオーバーライドします。
更新:これらのクラスは、主にTIdSync
/TIdNotify
はもともとバックのために設計されたのとほぼ同じ仕事をしTThread.Synchronize()
とTThread.(Force)Queue()
方法のデルファイの独自の静的バージョンの賛成で、最近廃止されていることノートTThread
はまだのみサポートされている場合非静的なものSynchronize()
。