-
Здравствуйте, уважаемые. Знаю что тема заезжена, но вот ответа который бы меня устроил я так и не нашел. Скажем есть цикл
while not OK do
begin
end
Есть у кого то предложения по этому поводу? За ранее большое спасибо за _полезные_ ответы!
-
> НО не подвесило работу основного процесса (sleep отпадает), >
эээ... а какое отношение sleep имеет к основному процес... потоку, ты хотел сказать? Sleep приостанавливает работу того, и только того потока, из которого она была вызвана.
-
> Sleep приостанавливает работу того, и только того потока, > из которого она была вызвана. >
хм... а почему тогда форма не двигается, когда sleep применяется в структуре:
Основновное приложение-->Поток (родитель, от него идет еще ряд потоков)--> Дочерний поток и тут (!) применяется sleep.
Причем у родительского и у дочерних потоков приоритет стоит tpIdle
-
Вот код только что написал, что бы понятнее было... (и при этом подвисает форма основного приложения)
TMotherThread = class(TThread)
private
procedure BeginOfAll;
protected
procedure Execute; override;
end;
TSonThread = class(TThread)
private
procedure BeginSon;
protected
procedure Execute; override;
end;
var
Form1: TForm1;
TMother:TMotherThread;
TSon:TSonThread;
implementation
procedure TMotherThread.Execute;
begin
Synchronize(BeginOfAll);
end;
procedure TMotherThread.BeginOfAll;
begin
TSon.Execute;
end;
procedure TSonThread.Execute;
begin
Synchronize(BeginSon);
end;
procedure TSonThread.BeginSon;
begin
Sleep(1000);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
TMother:=TMotherThread.Create(true);
TMother.Priority:=tpIdle;
TSon:=TSonThread.Create(true);
TSon.Priority:=tpIdle;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TMother.Execute;
end;
-
Выяслин, что synhronize, который я использовал - это зло.
Благодарю за внимание. Тема закрыта
-
> Zuzlan © (01.11.07 01:23) [3] > > Вот код только что написал, что бы понятнее было... (и при > этом подвисает форма основного приложения)
Да. Действительно понятнее. Ещё одна жертва Архангельского и его учеников :(((
Почитай про метод Synchronize. Может поймёшь что-нибудь.
-
> Германн © (01.11.07 01:45) [5]
Опоздал. Автор оказался умнее, чем это могло показаться на первый взгляд. Только он не прав, говоря что > synhronize, который я использовал - это зло.
Это не зло. Это очень полезная вещь. Только пользоваться ею надо с умом.
-
P.S. Кстати и WinAPI тут совершенно не при чём.
-
> > procedure TSonThread.Execute; > begin > Synchronize(BeginSon); > end;
Тут все очень просто. Процедура, передаваемая параметром в Synchronize, выполняется в контексте основного потока. Оттого и интерфейс «подвисает», ведь он тоже выполняется в основном.
-
> Zuzlan (01.11.2007 01:23:03) [3]
procedure TMotherThread.Execute;
begin
Synchronize(BeginOfAll);
end;
У нас это называют Архангельщина. Так же буть поосторожнее и с Фленовщиной.
|