Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.03;
Скачать: CL | DM;

Вниз

Альтернатива 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 вся ветка

Текущий архив: 2008.08.03;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
15-1213951578
palva
2008-06-20 12:46
2008.08.03
Знаете ли вы, что Ubuntu это на самом деле...


15-1213938889
Slider007
2008-06-20 09:14
2008.08.03
С днем рождения ! 20 июня 2008 пятница


2-1214779198
Андрей_1
2008-06-30 02:39
2008.08.03
Exel в Paradox


3-1203655549
Ganda
2008-02-22 07:45
2008.08.03
Туплю


15-1213893743
VingtQuatrieme
2008-06-19 20:42
2008.08.03
Кроме шуток, нужно снять пароль в ХР