Форум по 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, но во втором случае в таких хитросплетениях нет необходимости. Как же всетаки универсально решать подобные вопросы? С уважением.
Ответить с цитированием
  #2  
Старый 07.03.2012, 13:44
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Вот, просвещайся.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

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

Да вы конечно правы, но только не правы, я не справшивал о том как работать с потоками, как организовывать доступ из разных потоков к общим данным, и как организовывать работу "из потока" с VCL. Я разбираюсь в тематике вопроса, именно по этому и возник вопрос, наверное я его слишком муторно описал, попробую перефразировать:
Можно ли оставить для всех случаев Synchronize , или же имеет смысл разработать механизм управления методом синхронизации (требуется или не требуется синхронизация через метод Synchronize). Тут подводный камушек есть с Synchronize, так как он работает по принципу "остановил вызывающую нить и поставил переданный метод в очередь главной нити, а главная нить опрашивает очередь в промежутках между обработкой сообщений Windows" а это может привести к нежелательным задержкам в местах кода, критичных к скорости выполнения.
Ответить с цитированием
  #4  
Старый 07.03.2012, 14:16
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

т.к. для TSomeClass вызов FSomeProc не нуждается в синхронизации, а для TForm1 он необходим, то в конструктор следует передавать флаг нужды, имхо. хотя почему бы TSomeClass не унаследовать от TThread...
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 07.03.2012, 14:47
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Для доступа к общим данным есть критические секции.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение:
LoDS (11.03.2012)
  #6  
Старый 07.03.2012, 15:08
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Смех

я так понял что ТС хочет использовать один и тот же класс потока для вывода результата в форму в первом случае и куда-то еще во втором. иначе я вообще ничего не понял)))
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
LoDS (11.03.2012)
  #7  
Старый 07.03.2012, 15:35
LoDS LoDS вне форума
Прохожий
 
Регистрация: 09.12.2008
Сообщения: 10
Репутация: 10
По умолчанию

код приведен для примера, никакого отношения к реалиям не имеет, вопрос про то, как лучше всего организовать механизм выбора способа синхронизации внутри нити, так как нить может работать с методом VCL объекта, а может и с методом не VCL объекта а дергать метод от другого объекта. Склоняюсь к мысли - в конструкторе нити передавать флаг проводить метод через Synchronize или нет.
Ответить с цитированием
  #8  
Старый 07.03.2012, 15:45
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

значится так: если поток может изменять VCL, хоть через какой-то еще объект, который его породил, но в свою очередь изменяет VCL - делать синхронизацию, иначе - нет. доступ к общим данным, как уже сказано, через критические секции. флаг нужды в синхронизации передавать конструктору потока.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter