Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Вниз

Устройство TApplication   Найти похожие ветки 

 
Piter ©   (2004-11-08 15:18) [0]

TApplication производит выборку сообщений с помощью PeekMessage, очевидно из-за того, чтобы не "зависнуть", если сообщений нет. Делается это так, чтобы генерировать OnIdle в отсутствии сообщений и производить некий UpdateActions (для чего - я пока не понял). В связи с чем у меня возникает вопрос - а почему Дельфовое приложение не начинает занимать все свободное время процессора? Ведь всегда есть чем заняться - крутиться бесконечный цикл вызовов HandleMessage.

Я понимаю с GetMessage - если сообщений нету, то поток приостанавливается. Я даже думаю он вообще из планирования исключается до прихода сообщений. А тут как умудряется все работать?

P.S. И побочный вопрос - а нафига реализовано TApplication.ProcessMessages ? Вроде его вызовов нигде нету...


 
KilkennyCat ©   (2004-11-08 15:21) [1]

а может, все наоборот? не приложение хочет, а ему разрешают? :)


 
Piter ©   (2004-11-08 15:24) [2]

KilkennyCat ©   (08.11.04 15:21) [1]

не понял


 
Sandman25 ©   (2004-11-08 15:32) [3]

UpdateActions - это вызов обработчка OnUpdate у различный TAction, TActionList и т.д.

Дельфовое приложение не начинает занимать все свободное время процессора?

procedure TApplication.Idle(const Msg: TMsg);
begin
...  
 if Done then WaitMessage; // вот оно - ожидание!
end;

TApplication.ProcessMessages вызывается клиентским кодом.


 
KilkennyCat ©   (2004-11-08 15:34) [4]

я просто думал всегда, что OnIdle генерируется в приложение, а не в приложении...


 
KilkennyCat ©   (2004-11-08 15:37) [5]

я не прав. пойду спать.


 
Ihor Osov'yak ©   (2004-11-08 15:41) [6]

> а почему Дельфовое приложение не начинает занимать все свободное время процессора? Ведь всегда есть чем заняться - крутиться бесконечный цикл вызовов HandleMessage.

Внимательно смотреть TApplication.Idle. Может повезет, и заметите строчку
 if Done then WaitMessage;
===

> TApplication.ProcessMessages

Для организации обработки очереди сообщений в процессе длительной работы какого-то обработчика (во избежание "замораживания" интерфейса).
Использование чревато очень многочисленными граблями в случае непонимания происходящих процессов вокруг очереди сообщений. К сожелению, такое непонимание очень часто наблюдается. Воинствующее непонимание.


 
Piter ©   (2004-11-08 16:01) [7]

Удалено модератором


 
Piter ©   (2004-11-08 16:18) [8]

Sandman25 ©   (08.11.04 15:32) [3]
TApplication.ProcessMessages вызывается клиентским кодом


торможу-у-у...


 
Ihor Osov'yak ©   (2004-11-08 16:37) [9]

Удалено модератором


 
Sandman25 ©   (2004-11-08 16:42) [10]

[8] Piter ©   (08.11.04 16:18)

В [6] хорошо рассказано. В обработчике нажатия кнопки выполняются длительные расчеты. Чтобы форма не выглядела подвисшей, периодически из цикла расчетов вызывается отрисовка форм приложения. Application.ProcessMessages вполне подойдет вместо Form1.Update, Form2.Update и т.д.


 
Anatoly Podgoretsky ©   (2004-11-08 16:50) [11]

Sandman25 ©   (08.11.04 16:42) [10]
Только не отрисовка, а опрос наличия сообщений и если они есть, то они обрабатываются.


 
Sandman25 ©   (2004-11-08 16:57) [12]

[11] Anatoly Podgoretsky ©   (08.11.04 16:50)

Конечно. Поэтому следует сделать Enabled := False тем контролам, которые должны быть недоступны, пока не закончатся вычисления.


 
Piter ©   (2004-11-08 18:11) [13]

Удалено модератором
Примечание: Выяснениние отношений надо делать в частной переписке, а не в форуме, остальным это не интересно


 
VMcL ©   (2004-11-08 18:28) [14]

>>Piter ©  (08.11.04 18:11) [13]

procedure TForm1.Button1Click(Sender: TObject);
var
 I: Integer;
begin
  for I := 1 to 30 do
  begin
     Sleep(1000);
     Application.ProcessMessages;
  end;
end;


 
VMcL ©   (2004-11-08 18:31) [15]

Даже лучше так:

procedure TForm1.Button1Click(Sender: TObject);
var
 I: Integer;
begin
  for I := 1 to 30 do
  begin
     Sleep(1000);
     Application.ProcessMessages;
     if Application.Terminated then
        Exit;
  end;
end;


 
Piter ©   (2004-11-08 18:41) [16]

а-а-а... ну это если в обработчике предусмотрен вызов ProcessMessages... а если не предусмотрн - хрен что обновляться будет.

В любом случае, ответ на вопрос я понял, не заметил WaitMessage...



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.034 c
14-1099482873
VEG
2004-11-03 14:54
2004.11.21
Ограничение на количество окон в Windows


14-1099243806
123
2004-10-31 20:30
2004.11.21
MS-DOS


1-1099480835
Tracer
2004-11-03 14:20
2004.11.21
Как в тело программы запихнуть файлы?


1-1099675963
Ty3uk
2004-11-05 20:32
2004.11.21
любой файл в звук и обратно


1-1099843076
InfMag
2004-11-07 18:57
2004.11.21
Запор с INI файлами





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский