![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Альтернатива sleep [D7, WinXP]
Zuzlan © (2007-11-01 00:48:00)Здравствуйте, уважаемые.
Знаю что тема заезжена, но вот ответа который бы меня устроил я так и не нашел.
Скажем есть цикл
while not OK do
begin
// {сюда нужно что то, что приостановило бы работу текущего потока, НО не подвесило работу основного процесса (sleep отпадает), не грузило бы процессор под завязку (application.ProcessManager отпадает) и при этом не влияло на работу остальных потоков.}
end
Есть у кого то предложения по этому поводу?
За ранее большое спасибо за _полезные_ ответы!
Anatoly Podgoretsky (2007-11-01 09:24:00) [1]> Zuzlan (01.11.2007 01:23:03) [3]
procedure TMotherThread.Execute;
begin
Synchronize(BeginOfAll);
end;
У нас это называют Архангельщина. Так же буть поосторожнее и с Фленовщиной.
Джо (2007-11-01 01:50:00) [2]>
> procedure TSonThread.Execute;
> begin
> Synchronize(BeginSon);
> end;
Тут все очень просто.
Процедура, передаваемая параметром в Synchronize, выполняется в контексте основногопотока. Оттого и интерфейс «подвисает», ведь он тоже выполняется в основном.
Германн (2007-11-01 01:49:00) [3]P.S. Кстати и WinAPI тут совершенно не при чём.
Германн (2007-11-01 01:47:00) [4]
> Германн © (01.11.07 01:45) [5]
Опоздал. Автор оказался умнее, чем это могло показаться на первый взгляд.
Только он не прав, говоря что
> synhronize, который я использовал - это зло.
Это не зло. Это очень полезная вещь. Только пользоваться ею надо с умом.
Германн (2007-11-01 01:45:00) [5]
> Zuzlan © (01.11.07 01:23) [3]
>
> Вот код только что написал, что бы понятнее было... (и при
> этом подвисает форма основного приложения)
Да. Действительно понятнее. Ещё одна жертва Архангельского и его учеников :(((
Почитай про метод Synchronize. Может поймёшь что-нибудь.
Zuzlan (2007-11-01 01:42:00) [6]Выяслин, что synhronize, который я использовал - это зло.
Благодарю за внимание. Тема закрыта
Zuzlan (2007-11-01 01:23:00) [7]Вот код только что написал, что бы понятнее было... (и при этом подвисает форма основного приложения)
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;
{$R *.dfm}
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;
Zuzlan (2007-11-01 01:09:00) [8]
> Sleep приостанавливает работу того, и только того потока,
> из которого она была вызвана.
>
хм... а почему тогда форма не двигается, когда sleep применяется в структуре:
Основновное приложение-->Поток (родитель, от него идет еще ряд потоков)--> Дочерний поток и тут (!) применяется sleep.
Причем у родительского и у дочерних потоков приоритет стоит tpIdle
DrPass (2007-11-01 00:51:00) [9]
> НО не подвесило работу основного процесса (sleep отпадает),
>
эээ... а какое отношение sleep имеет к основному процес... потоку, ты хотел сказать? Sleep приостанавливает работу того, и только того потока, из которого она была вызвана.