non*_*one 2 delphi multithreading delphi-2009 synchronize
在创建线程对象时,我想从需要同步的应用程序中调用代码.问题是我不知道如何调用Synchronize带参数的应用程序函数.
说我们有
procedure ThreadObject.Execute;
var
val1,val2:integer;
Star:string;
begin
Synchronize(funcyfunc); //how to pass val1,val2,star here?
end;
Run Code Online (Sandbox Code Playgroud)
其中funcyfunc定义如下
procedure OtherClass.funcyfunc(param1,param2:integer;spok:string);
begin
letsCallFriends(spok,param1);
letsCallFriends(spok,param2);
end;
Run Code Online (Sandbox Code Playgroud)
现在奇怪的解决方案是在ThreadObject私有中说
private
star:string;
val1,val2:integer;
procedure starVal;
Run Code Online (Sandbox Code Playgroud)
在我们的实施中
procedure ThreadObject.starVal;
begin
funcyfunc(Star,val1,val2);
end;
Run Code Online (Sandbox Code Playgroud)
并在线程执行中我们改为
procedure ThreadObject.Execute;
var
val1,val2:integer;
Star:string;
begin
Synchronize(starVal); //how to pass val1,val2,star here?
end;
Run Code Online (Sandbox Code Playgroud)
但这是一个麻烦,因为每个过程调用必须有一个全局变量.有没有更好的办法?
码:
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.
Run Code Online (Sandbox Code Playgroud)
使用匿名方法.
正如您可以在手册中阅读的那样 TThread.Synchronize
Synchronize(
procedure
begin
Form1.Memo1.Lines.Add('Begin Execution');
end);
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,引用的变量 Form1有点像复制并保存,直到执行过程(称为变量捕获).
注意:David反对"复制变量"的想法,他可能是对的.然而,讨论所有角落案例和实施细节将是一种矫枉过正.他与"全局变量"OTOH的比较可能会对递归程序等造成麻烦.所有简单易懂的类比都是非常粗糙的,并且倾向于这样或那样的ISTM.
您的匿名程序应该使用您的变量val1,val2然后它们也应该被捕获
http://docwiki.embarcadero.com/Libraries/XE5/en/System.Classes.TThread.Synchronize