Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1215154601
JohnKorsh
2008-07-04 10:56
2008.08.03
Арабский формат ввода текста в Memo или RichEdit.


15-1213716332
Dmitry S
2008-06-17 19:25
2008.08.03
Перестановки


2-1214643313
Дядя Педро
2008-06-28 12:55
2008.08.03
WinAMP


15-1213690490
Gg
2008-06-17 12:14
2008.08.03
Стоимость работ


2-1215055645
prodex
2008-07-03 07:27
2008.08.03
Объясните разницу..





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский