传递参数以同步过程调用



创建线程对象时,我想从需要同步的应用程序中调用代码。问题是我不知道如何致电Synchronize使用参数。

说我们有

procedure ThreadObject.Execute;
var
  val1,val2:integer;
  Star:string;
begin
  Synchronize(funcyfunc); //how to pass val1,val2,star here?
end;

其中funcyfunc定义如下

procedure OtherClass.funcyfunc(param1,param2:integer;spok:string);
begin
   letsCallFriends(spok,param1);
   letsCallFriends(spok,param2);
end;

现在,奇怪的解决方案是在threadObject private

中说
private
  star:string;
  val1,val2:integer;
  procedure starVal;

在实施中,我们进行

procedure ThreadObject.starVal;
begin
  funcyfunc(Star,val1,val2);
end;

在执行线程中,我们更改为

procedure ThreadObject.Execute;
var
  val1,val2:integer;
  Star:string;
begin
  Synchronize(starVal); //how to pass val1,val2,star here?
end;

但这是一个麻烦,因为每个过程调用都必须有一个全局变量。有更好的方法吗?

代码:

unit ThreadObject;
interface
uses
  Classes;
type
  TThreadObject= class(TThread)
  private
    star:string;
    val1,val2:integer;
    procedure starVal;
  protected
    procedure Execute; override;
    //assume we have a constructor that ini the star val1 val2.
  end;
implementation
{ TThreadObject }
procedure ThreadObject.Execute;
var
  val1,val2:integer;
  Star:string;
begin
  Synchronize(starVal); //how to pass val1,val2,star here?
end;
procedure ThreadObject.starVal;
begin
  funcyfunc(Star,val1,val2);
end;
end.

使用匿名方法

您可以在TThread.Synchronize

的手册中阅读
Synchronize(
  procedure
  begin
    Form1.Memo1.Lines.Add('Begin Execution');
  end);

在上面的引用变量 Form1的示例中,有点像复制和保存,直到执行过程为止(称为 actible capture capture )。)。

注意:大卫反对"复制变量"的想法,他可能是对的。但是,讨论所有角落案件和实施细节将是过度杀伤。他与"全局变量" OTOH的比较可能会在递归程序等方面遇到麻烦。所有简单掌握的类比都非常粗糙且以一种或另一种方式倾斜。

您的匿名过程应使用您的变量val1val2,然后它们也应该被捕获

http://docwiki.embarcadero.com/libraries/xe5/en/system.classes.tthread.synchronize

如果您使用的是不支持匿名方法的旧版本的delphi,则在类上制作"参数"字段。即。

procedure ThreadObject.Execute;
var
  val1,val2:integer;
  Star:string;
begin
  FVal1 := val1;
  FVal2 := val2;
  FStar := Star;
  Synchronize(funcyfunc);
end;
procedure ThreadObject.FuncyFunc;
begin
  //Do stuff with FVal1, FVal2 and FStar
end;

注意这些是不是 global。
这也是很安全的,因为Synchronize的点是确保两个线程彼此协调。因此,只要您没有尝试访问相同数据的其他其他线程,就不会有任何种族条件。

是的,这是一个" klunky",但这是在delphi的较新版本中使用匿名方法的优点。

最新更新