Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何从主线程完全终止并行任务?_Multithreading_Delphi_Delphi 10.1 Berlin_Omnithreadlibrary - Fatal编程技术网

Multithreading 如何从主线程完全终止并行任务?

Multithreading 如何从主线程完全终止并行任务?,multithreading,delphi,delphi-10.1-berlin,omnithreadlibrary,Multithreading,Delphi,Delphi 10.1 Berlin,Omnithreadlibrary,如何从主线程完全终止此后台线程,即即使是OnTerminated中的代码也不会执行 uses CodeSiteLogging, OtlParallel, OtlTaskControl, OtlTask; procedure TForm2.btnParallelAsyncClick(Sender: TObject); begin CodeSite.Send('btnParallelAsyncClick 1'); Parallel.Async( procedure(con

如何从主线程完全终止此后台线程,即即使是
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;
你不能这样做(除了杀死线程,但请不要这样做)


在创建任务之前,添加一个全局标志
shouldSkipTerminate
,将其设置为
false
,在终止任务之前将其设置为
true
,并检查此标志是否设置在
ontterminated

中,这是否是您希望在没有合作的情况下终止任务的问题之一?谢谢,加布里埃尔。我试过这个,但似乎不起作用:这个有效:但这似乎是一个原始的解决方案。是否可以使用类似于
任务的东西来主动终止
异步
线程。终止
在上面的示例中对我不起作用?@user1580348否。
终止
只是向任务发出停止运行的信号,但任务本身需要配合,在收到信号时退出。要帮助加快终止,请使用TEvent.WaitFor而不是Sleep。然后,当您想要终止时,向事件发送信号并检查TWaitResult:If(MyEvent.Waitfor(2000)System.Types.wrTimeout)或Terminated,然后退出;谢谢你的评论,加布里埃尔!顺便问一下,是否可以使用
SetPriority
将优先级设置为
Parallel.Async
后台任务?