Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

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


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:06.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025