创建线程对象时,我想从应用程序中调用需要同步的代码。问题是我不知道怎么打电话Synchronize
对于带有参数的应用程序函数。
说我们有
procedure ThreadObject.Execute;
var
val1,val2:integer;
Star:string;
begin
Synchronize(funcyfunc); //how to pass val1,val2,star here?
end;
where 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;
但这很麻烦,因为每个过程调用都必须有一个全局变量。有没有更好的办法?
code:
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.