При создании объекта потока я хочу вызвать код из приложения, которое необходимо синхронизировать. Проблема в том, что я не знаю, как вызвать 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 частной
и в осуществление делаем
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.
['This way'] (http://pastebin.com/WD2LYNE5). – TLama
Существует замечательная статья в блоге, посвященная этому http://www.uweraabe.de/Blog/2011/01/30/synchronize-and-queue-with-parameters/ –
Возможный дубликат [Передача значения для синхронизации потока] (http://stackoverflow.com/questions/16870387/passing-value-to-synchronize-thread) – CinCout