![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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)
| ||