![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте господа, вопрос по сути тривиальный..
Код:
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, но во втором случае в таких хитросплетениях нет необходимости. Как же всетаки универсально решать подобные вопросы? С уважением. |