Multithreading 如何使用阻塞函数/过程终止线程?

Multithreading 如何使用阻塞函数/过程终止线程?,multithreading,delphi,Multithreading,Delphi,我在我的应用程序中使用TThread,我有很多函数想在其中使用。 我使用的函数需要时间来完成,所以在线程中使用它们并不理想。这就是为什么我想知道除了复制和粘贴函数/过程,然后将我的终止标志(可能插入)到函数中之外,是否还有其他方法。 我不想使用TerminateThreadAPI 举个简单的例子: procedure MyProcedure; begin // some work that takes time over a few lines of code // add/inject t

我在我的应用程序中使用
TThread
,我有很多函数想在其中使用。 我使用的函数需要时间来完成,所以在线程中使用它们并不理想。这就是为什么我想知道除了复制和粘贴函数/过程,然后将我的
终止
标志(可能插入)到函数中之外,是否还有其他方法。 我不想使用
TerminateThread
API

举个简单的例子:

procedure MyProcedure;
begin
 // some work that takes time over a few lines of code
 // add/inject terminated flag?!
 // try... finally...
end;

procedure TMyThread.Execute;
begin
 MyProcedure;
 // or copy and paste myprocedure
end;

那么,有没有一种有效的方法来编写过程/函数来帮助我使用
终止
标志呢?此外,过程/函数应该是全局的,以便其他函数/过程也可以调用它们

一个选项是在过程调用中引入回调方法。 如果分配了回调方法(从线程调用时),则进行调用并采取操作

从别处调用
MyProcedure
时,将nil传递给该过程

Type
  TAbortProc = function : boolean of object;

procedure MyProcedure( AbortProc : TAbortProc);
begin
  //...
  if (Assigned(AbortProc) and AbortProc) then
    Exit;
  //...
end;


function MyThread.AbortOperation : Boolean;
begin
  Result := Terminated;
end;

我之所以避免传递线程引用而不是回调方法,是为了隐藏
MyProcedure

中的线程逻辑(和依赖关系),您可以在过程调用中引入回调方法。如果已分配(来自线程的调用),则进行回调,否则(来自正常过程)跳过调用。回调方法可以检查终止标志。@LU RD-我想向线程传递引用也会起到同样的作用。如果回调/引用被另一个线程覆盖怎么办?什么东西应该堵在哪里?我真的无法想象实际情况是什么样子。@SertacAkyuz,传递线程引用会隐藏回调目的背后的逻辑。回调引用存在于堆栈上,在MyProcedure中没有任何内容可以覆盖它。@LU RD-从概念上讲,回调可能比传递引用更好,但它仍然可以用于此目的。然而,就我的一生而言,我无法想象这个问题的基础是没有注意到你可以将某些东西传递给程序。@SertacAkyuz,犹豫打破干燥原则是朝着正确方向迈出的一步。如何实现它可能需要一些指导,尤其是在没有嵌套依赖项的情况下。这实际上是一个好主意,而且很有效!谢谢你!