2

メインスレッドからこのバックグラウンドスレッドを完全に終了させるにはどうすればいいですか?具体的にはOnTerminatedのコードは実行されません。メインスレッドからパラレルタスクを完全に終了するには?

uses 
    CodeSiteLogging, 
    OtlParallel, OtlTaskControl, OtlTask; 

procedure TForm2.btnParallelAsyncClick(Sender: TObject); 
begin 
    CodeSite.Send('btnParallelAsyncClick 1'); 

    Parallel.Async(
    procedure(const task: IOmniTask) 
    var 
     a: Integer; 
    begin 
     // executed in background thread: 
     a := 1 + 1; 
     Sleep(2000); 
     CodeSite.Send('Executed in Async Thread', a); 

     task.Invoke(// used to execute code in main thread 
     procedure 
     begin 
      CodeSite.Send('task.Invoke executed in main thread', a); 
     end); 

     Sleep(2000); 
     CodeSite.Send('Again executed in Async Thread', a); 
    end, 
    Parallel.TaskConfig.OnTerminated(
    procedure(const task: IOmniTaskControl) 
    begin 
     // executed in main thread: 
     CodeSite.Send('After background thread termination: Executed in Main Thread'); 
    end 
    ) 
    ); 

    CodeSite.Send('btnParallelAsyncClick 2'); 
end; 
+0

これは、協力しないでタスクを終了させたいという疑問の1つになりますか? –

答えて

3

これは実行できません(スレッドを強制終了しますが、実行しないでください)。

は、グローバルフラグshouldSkipTerminateを追加し、タスクを作成する前にfalseに設定し、タスクを終了し、このフラグがOnTerminatedに設定されているかどうかを確認する前にtrueに設定してください。

+0

ありがとう、ガブリエル。私はこれを試しましたが、うまくいかないようです:http://i.imgur.com/Xam1273.png – user1580348

+0

これは動作します:http://i.imgur.com/UnhfHDZ.png原始的な解決策である。 'Async'スレッドを' task.Terminate'のようなもので積極的に終了することはできませんが、これは上記の例ではうまくいきませんか? – user1580348

+3

@ user1580348いいえ。 'Terminate'は単にタスクの実行を停止するように指示しますが、タスク自体はシグナルが出されたときに終了することで協調する必要があります。 –

関連する問題