![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 14.04.2007
Сообщений: 28
|
![]()
Пишу на Delphi программу,
выполняющую очень долгий цикл repeat...until. Подскажите, как сделать, чтобы при нажатии, скажем, клавиши <Esc> выдавалось MessageDialog() с вопросом: "Приостановить работу программы"? А вначале я хотел чтобы можно было прервать работу программы горячей клавишей. Сделал, как написано здесь: http://www.excode.ru/art3997p7.html Но программа не всегда реагирует на событие WM_HOTKEY, наверное, управление не успевает передаваться процедуре WMHotkey. Т.е. программа реагирует на горячую клавишу, когда цикл не запущен, а запускаешь цикл - не реагирует. Application.ProcessMessages и Application.HandleMessage внутри цикла не помогает. Может не туда вставляю? Как выйти из положения? Заранее благодарен. |
![]() |
![]() |
![]() |
#2 |
Пользователь
Регистрация: 12.04.2007
Сообщений: 21
|
![]()
а почему не использовать класс TThread? там всё просто:
type TMyThread = class(TThread) private protected procedure Execute; override; public end; implementation procedure TMyThread.Execute; begin // здесь твой цикл repeat...until: repeat if Terminated then Break; ... until <условие>; end; когда нужно будет приостановить работу потока используй TMyThread.Suspend. Для возобновления выполнения -- TMyThread.Resume.
Пусть баги обходят вас стороной
|
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 16.12.2006
Сообщений: 859
|
![]()
попробуй во время выполнения цикла проверять на нажатие кнопки.
GetKeyState(VK_ESCAPE) |
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 14.04.2007
Сообщений: 28
|
![]()
GetKeyState(VK_ESCAPE) - работает!
if GetKeyState(VK_ESCAPE)<0 then begin if MessageDlg('Приостановить работу?',mtConfirmation,[mbYes, mbNo],0)=mrYes then begin ShowMessage('Количество циклов: '+IntToStr(i)); Exit; end; end else Application.ProcessMessages; Но! Опять работает не всегда. Видимо, программа настолько подгружает ОС, что обработка не срабатывает. Нужно быстро нажать раз 5 <Esc>, чтобы выдалось предупреждение. Ну, хоть как-то, но работает, не подвисает ![]() Хотя все-таки интересно узнать, как добиться однократного нажатия клавиши. Последний раз редактировалось Hintman; 14.04.2007 в 19:12. |
![]() |
![]() |
![]() |
#5 | |
Пользователь
Регистрация: 14.04.2007
Сообщений: 28
|
![]() Цитата:
а в том - когда (когда нажат <Esc> или горячая клавиша)! Но все равно спасибо за помощь, узнал кое-что о классе TThread, глядишь - пригодится! ![]() |
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 12.04.2007
Сообщений: 21
|
![]()
А я бы сказал, что дело в понимании применения класса TThread
![]() Просто весь код, выполняющийся классом TThread, выполняется параллельно главному потоку приложения, а это значит, что сообщения, приходящие к твоим хоткеям не будут терятся из-за недостаточного выделения процессорного времени потоку, выполняющему обработку оконных сообщений.
Пусть баги обходят вас стороной
|
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 14.04.2007
Сообщений: 28
|
![]()
Вот как? Попробую! Спасибо!!!
![]() |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Приостановка выполнения цикла | ACE Valery | Общие вопросы C/C++ | 21 | 19.11.2011 12:40 |
приостановка выполнения процедуры | BESS | Общие вопросы Delphi | 5 | 15.09.2008 00:53 |
Запуск программы на выполнение из другой программы. | ViNcHeStEr | Паскаль, Turbo Pascal, PascalABC.NET | 6 | 18.06.2008 14:33 |
Приостановка цикла для выполнения внешней программы | Uomo | Общие вопросы Delphi | 3 | 04.04.2008 11:48 |
программы | koyot | Фриланс | 1 | 14.03.2008 13:10 |