在创建线程对象时,我想从需要同步的应用程序中调用代码.问题是我不知道如何调用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
使用匿名方法.
正如您可以在手册中阅读的那样 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