Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Альтернатива 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 приостанавливает работу того, и только того потока, из которого она была вызвана.


Наверх

Титульная страница Поиск, карта сайта Написать письмо