3

I'm in trouble understanding the real difference between IDSYNC and IDNOTIFY, what means synchronous / asynchronous in respect to the lines of code I write ?

procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
begin
    ....
    DoSomeThing (TIDNotify)    ....

    DoSomethingOther(TIDsync) ......

 end; 

Why can't I be sure that both lines of code are executed within the TCPServer Execute function? Is there only the risk that a few lines of code are not executed within my TIDSynfunction or how can a Deadloack be explained ?

4

1 に答える 1

10

TIdSyncとTIdNotifyは同じ目標を達成します-メインスレッドのコンテキストでコードの一部を実行する-しかし、それらは異なる方法でそれを行います。

TIdSync同期です。このTIdSync.Synchronize()メソッドは、メインスレッドがTIdSync.DoSynchronize()メソッドを呼び出して終了するまで、呼び出し元のスレッドをブロックします。TIdSync.Synchronize()メインスレッドがサーバーをシャットダウンしているときにサーバーイベントハンドラー内でが呼び出された場合、デッドロックが発生する可能性があります。これは、サーバーがスレッドを終了するのを待ってメインスレッドがブロックされているためです。ただし、メインスレッドが同期要求を処理するのを待っている間、スレッドはブロックされます。

TIdNotify非同期です。このメソッドは、メソッドをバックグラウンドキューにTIdNotify.Notify()追加してすぐに終了するため、呼び出し元のスレッドはブロックされません。TIdNotify.DoNotify()メインスレッドは、TIdNotify.DoNotify()暇なときにメソッドを呼び出します。この状況ではデッドロックは発生しません。

于 2012-11-23T23:34:01.823 に答える