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