当前位置:  开发笔记 > 编程语言 > 正文

将参数传递给Synchronize过程调用

如何解决《将参数传递给Synchronize过程调用》经验,为你挑选了1个好方法。

在创建线程对象时,我想从需要同步的应用程序中调用代码.问题是我不知道如何调用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
  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.

Arioch 'The.. 8

使用匿名方法.

正如您可以在手册中阅读的那样 TThread.Synchronize

Synchronize(
  procedure
  begin
    Form1.Memo1.Lines.Add('Begin Execution');
  end);

在上面的示例中,引用的变量 Form1有点像复制并保存,直到执行过程(称为变量捕获).

注意:David反对"复制变量"的想法,他可能是对的.然而,讨论所有角落案例和实施细节将是一种矫枉过正.他与"全局变量"OTOH的比较可能会对递归程序等造成麻烦.所有简单易懂的类比都是非常粗糙的,并且倾向于这样或那样的ISTM.

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

http://docwiki.embarcadero.com/Libraries/XE5/en/System.Classes.TThread.Synchronize



1> Arioch 'The..:

使用匿名方法.

正如您可以在手册中阅读的那样 TThread.Synchronize

Synchronize(
  procedure
  begin
    Form1.Memo1.Lines.Add('Begin Execution');
  end);

在上面的示例中,引用的变量 Form1有点像复制并保存,直到执行过程(称为变量捕获).

注意:David反对"复制变量"的想法,他可能是对的.然而,讨论所有角落案例和实施细节将是一种矫枉过正.他与"全局变量"OTOH的比较可能会对递归程序等造成麻烦.所有简单易懂的类比都是非常粗糙的,并且倾向于这样或那样的ISTM.

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

http://docwiki.embarcadero.com/Libraries/XE5/en/System.Classes.TThread.Synchronize


FWIW,变量不是**复制**.这是**被捕获**.如果你有另一个捕获相同变量的anon方法,那么两个anon方法都引用**相同的**变量.通过一个anon方法对该var进行的更改在另一个anon方法中可见.以这种方式是从局部变换到全局的捕获变量.
所有三方,声明本地的过程和两个匿名方法都引用相同的变量.事实上,变量不再驻留在堆栈上,因为anon方法的范围当然可以比声明变量的过程的范围更长.捕获的变量被提升到驻留在堆上的对象中.
推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有