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

Вниз

Прерывание работы цикла по тпользователя   Найти похожие ветки 

 
Franzy ©   (2004-04-01 18:14) [0]

У меня в программе есть несколько длительных циклов вычислений. Необходимо предусмотреть возможность прерывания цикла по требованию пользователя (например, по нажатию ESC).
В простом паскале для этой цели была предусмотрена замечательная функция keypressed:

for...do
begin
if keypressed then ch:=Readkey;
case ch of...

end;

и все в таком духе. В дельфях такой функции нет. Пробовал реализовать событиями OnKeyDown, KeyPress... И с удивлением обнаружил, что обратка этих событий (если клавиши нажимаются во время работы цикла) происходит только по окончании работы цикла! То есть, когда уже не нужно! :(( Как быть?


 
han_malign ©   (2004-04-01 18:16) [1]

>только по окончании работы цикла!
Application.ProcessMessages;


 
Юрий Зотов ©   (2004-04-01 18:30) [2]

> И с удивлением обнаружил, что обратка этих событий (если
> клавиши нажимаются во время работы цикла) происходит только по
> окончании работы цикла!

Нажатие клавиши приводит к тому, что система помещает в очередь потока сообщение клавиатуры. Чтобы приложение об этом узнало и смогло это сообщение обработать, его надо выбрать из очереди - а пока в потоке работает цикл, никакие сообщения не выбираются и, соответственно, не обрабатываются. Что и дает обнаруженный Вами эффект.

Поэтому в цикл нужно вставить вызов Application.ProcessMessages - вот он-то и обработает сообщения из очереди (если они там есть), а после этого управление вернется в ту же точку цикла.


 
Тимохов ©   (2004-04-01 18:31) [3]

чтобы следущий вопрос не был "Почему Дельфи такое ..., почему так медленно работает" рискну посоветовать далать Application.ProcessMessages не каждую итерацию цикла, раз в 100 раз, например - подбирается на основе опыта.


 
Franzy ©   (2004-04-01 18:36) [4]

Благодарю. И это единственный способ?


 
Тимохов ©   (2004-04-01 18:38) [5]

простой? да.


 
Юрий Зотов ©   (2004-04-01 18:59) [6]

> Franzy ©   (01.04.04 18:36) [4]

Более грамотный (но и более сложный) способ - вынести долгий цикл в дополнительный поток. Такой способ имеет смысл применять, когда Application.ProcessMessages по каким-то причинам не годится (например, сильно тормозит цикл даже если вызывать не на каждом проходе).



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

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

Наверх




Память: 0.48 MB
Время: 0.039 c
3-1079602943
terra
2004-03-18 12:42
2004.04.18
Проблемы с ADOQuery


8-1073313054
MachmuD
2004-01-05 17:30
2004.04.18
Как вывести на форма файл формата TIFF (картинка )


6-1069240456
MoSHgA
2003-11-19 14:14
2004.04.18
Столкнулся с интересной проблемой, при отправке письма...


1-1080740674
PiratA
2004-03-31 17:44
2004.04.18
TAcrionMainMenuBar


4-1076521958
JustAnotherDummy
2004-02-11 20:52
2004.04.18
RichEdit на WinAPI