Здравствуйте господа, вопрос по сути тривиальный..
Код:
type
TSomeProc = procedure () of object;
// Нить
type
TSomeThread = class(TThread)
private
FSomeProc:TSomeProc;
protected
procedure Execute(); override;
procedure DoSomeProc;
public
constructor Create(SomeProc:TSomeProc);
end;
{ TSomeThread }
constructor TSomeThread.Create(SomeProc: TSomeProc);
begin
inherited Create(False);
FSomeProc:=SomeProc;
end;
procedure TSomeThread.DoSomeProc;
begin
if Assigned(FSomeProc) then
begin
FSomeProc();
end;
end;
procedure TSomeThread.Execute;
begin
// ....
// А вот здесь внимание!!!!
Synchronize(DoSomeProc);
// или же
DoSomeProc();
end;
Если в конструктор нити передать в качестве параметра метод формы, в котором обращаться к объектам на форме - то правильно - использовать Synchronize например:
Код:
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
FThread:TSomeThread;
procedure SomeFormProcedure();
public
{ Public declarations }
end;
{ TForm1 }
procedure TForm1.SomeFormProcedure;
begin
Caption:='SomeFormProcedure';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FThread:=TSomeThread.Create(SomeFormProcedure);
end;
а если экземпляр нити создавать где нибудь в другом классе например
Код:
type
TSomeClass = class(TObject)
private
FField:Integer;
FThread:TSomeThread;
protected
procedure SomClassProcedure();
public
constructor Create;
destructor Destroy; override;
end;
{ TSomeClass }
constructor TSomeClass.Create;
begin
inherited Create;
FField:=0;
FThread:=TSomeThread.Create(SomClassProcedure);
end;
destructor TSomeClass.Destroy;
begin
inherited;
end;
procedure TSomeClass.SomClassProcedure;
begin
FField:=123;
end;
А вот в этом случае как быть??? метод
Synchronize приостанавливает нить, вызвавшую Synchronize, до тех пор пока главная нить не выполнит метод, переданный в Synchronize, но во втором случае в таких хитросплетениях нет необходимости. Как же всетаки универсально решать подобные вопросы? С уважением.