Показать сообщение отдельно
  #1  
Старый 07.03.2012, 13:37
LoDS LoDS вне форума
Прохожий
 
Регистрация: 09.12.2008
Сообщения: 10
Репутация: 10
По умолчанию Интересный момент ...

Здравствуйте господа, вопрос по сути тривиальный..


Код:
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, но во втором случае в таких хитросплетениях нет необходимости. Как же всетаки универсально решать подобные вопросы? С уважением.
Ответить с цитированием