2012-03-19 1 views
1

TIdHttpServerを使用していくつかのコマンドを処理していますが、いくつかのコマンドが失われているというのは、私がOnConnect内のvclを更新しているからです。TIdHttpServerがVCLと同期する

Synchronizeメソッドを使用してVCLをsafleyで更新するにはどうすればよいですか?

答えて

1

これは簡単です。TThread.Synchronize()には、GUIスレッドによって呼び出される番号TThreadMethodが必要です。 TThreadMethodはパラメータなしprocedure of objectですが、呼び出しを行っているセカンダリスレッドは、同期メソッドがGUIスレッドによって実行されるまでブロックされているので、さらなる保護なしにsynchronizedメソッドのTThreadメンバを使用できます。

私は、いくつかの選択肢がありますが、すべてが優れていることを言及する必要があります(何も悪化することはないので試していないものもあります)。 Indyには変数を持ち、カスタムメソッドを実装するために派生できるクラスTIdSyncTIdNotifyがあります。新しいデルファイのバージョンはTThread.Queue()TThread.ForceQueue()であり、匿名メソッドを使用して呼び出しスレッドをブロックせずにGUIスレッドが実行できるクロージャ(キャプチャされた変数付き)を生成できます。 PostMessage()PostThreadMessage() APIもあります。これは、D3/W95以降に変更なしで動作し、Windows上で永遠に利用可能な通信システムです。

3

インディは、それぞれ同期スレッドと非同期スレッドで同期するための独自のTIdSyncTIdNotifyクラスを持っています。 TIdSyncから新しいクラスを派生し、そのDoSynchronize()メソッドをオーバーライドするか、またはTIdNotifyから派生し、そのDoNotify()メソッドをオーバーライドします。

更新:これらのクラスは、主にTIdSync/TIdNotifyはもともとバックのために設計されたのとほぼ同じ仕事をしTThread.Synchronize()TThread.(Force)Queue()方法のデルファイの独自の静的バージョンの賛成で、最近廃止されていることノートTThreadはまだのみサポートされている場合非静的なものSynchronize()

関連する問題