2010-11-30 18 views

答えて

3

メインスレッド以外のスレッドでもVCLオブジェクトを変更しない場合と同じルールが有効です。 OnExecuteイベントハンドラのVCLコントロールを変更しないでください。これは、すべての接続でIndyがワーカースレッドのスポーンのコンテキストでコードを実行するためです。

グラフィカルユーザーインターフェイスを変更する必要がある場合は、同期またはキューメソッドを使用するか、GUIの変更を行うようにメインスレッドに通知するカスタム通知メカニズムを使用します。

あなたが同期またはキューメソッドを呼び出したい場合は、あなたがTIdYarnから派生し、スレッドとそれを実装しTIdYarnOfThreadにTIdYarnキャストを入力する必要があります。

// Calling MyMethod using Synchornize inside TIdTcpServer.OnExecute event-handler 
TIdYarnOfThread(AContext.Yarn).Thread.Synchronize(MyMethod); 


// Calling MyMethod using Queue inside TIdTcpServer.OnExecute event-handler 
TIdYarnOfThread(AContext.Yarn).Thread.Queue(MyMethod); 
+3

をのTThreadは、静的な同期()とキュー()メソッドを持っていますD7 +では、糸の内部に直接アクセスする必要はありません。代わりに、IndyのTIdSyncクラスとTIdNotifyクラスを使用して、これらの詳細を処理します。 –

+0

@Remy、ありがとうございます。特にIndyのTIdSyncとTIdNotifyのために;私は彼らについて知らなかった。 – vcldeveloper

+0

TidSynchは、メインvclスレッドがワーカーを終了するのを待っていて、ワーカーがtidynchメソッドがメインのvclスレッドで終了するのを待っていると、デッドロックを引き起こす可能性があるため、TidNotifyを使用することをお勧めします。 – MikeT

関連する問題