|
|
Регистрация | << Правила форума >> | 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, но во втором случае в таких хитросплетениях нет необходимости. Как же всетаки универсально решать подобные вопросы? С уважением. |
#3
|
|||
|
|||
Да вы конечно правы, но только не правы, я не справшивал о том как работать с потоками, как организовывать доступ из разных потоков к общим данным, и как организовывать работу "из потока" с VCL. Я разбираюсь в тематике вопроса, именно по этому и возник вопрос, наверное я его слишком муторно описал, попробую перефразировать:
Можно ли оставить для всех случаев Synchronize , или же имеет смысл разработать механизм управления методом синхронизации (требуется или не требуется синхронизация через метод Synchronize). Тут подводный камушек есть с Synchronize, так как он работает по принципу "остановил вызывающую нить и поставил переданный метод в очередь главной нити, а главная нить опрашивает очередь в промежутках между обработкой сообщений Windows" а это может привести к нежелательным задержкам в местах кода, критичных к скорости выполнения. |
#4
|
||||
|
||||
т.к. для TSomeClass вызов FSomeProc не нуждается в синхронизации, а для TForm1 он необходим, то в конструктор следует передавать флаг нужды, имхо. хотя почему бы TSomeClass не унаследовать от TThread...
Пишу программы за еду. __________________ |
#5
|
||||
|
||||
Для доступа к общим данным есть критические секции.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение: | ||
LoDS (11.03.2012)
|
#6
|
||||
|
||||
я так понял что ТС хочет использовать один и тот же класс потока для вывода результата в форму в первом случае и куда-то еще во втором. иначе я вообще ничего не понял)))
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
LoDS (11.03.2012)
|
#7
|
|||
|
|||
код приведен для примера, никакого отношения к реалиям не имеет, вопрос про то, как лучше всего организовать механизм выбора способа синхронизации внутри нити, так как нить может работать с методом VCL объекта, а может и с методом не VCL объекта а дергать метод от другого объекта. Склоняюсь к мысли - в конструкторе нити передавать флаг проводить метод через Synchronize или нет.
|
#8
|
||||
|
||||
значится так: если поток может изменять VCL, хоть через какой-то еще объект, который его породил, но в свою очередь изменяет VCL - делать синхронизацию, иначе - нет. доступ к общим данным, как уже сказано, через критические секции. флаг нужды в синхронизации передавать конструктору потока.
Пишу программы за еду. __________________ |