|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
14.04.2007, 15:17 | #1 |
Пользователь
Регистрация: 14.04.2007
Сообщений: 28
|
Приостановка программы
Пишу на Delphi программу,
выполняющую очень долгий цикл repeat...until. Подскажите, как сделать, чтобы при нажатии, скажем, клавиши <Esc> выдавалось MessageDialog() с вопросом: "Приостановить работу программы"? А вначале я хотел чтобы можно было прервать работу программы горячей клавишей. Сделал, как написано здесь: http://www.excode.ru/art3997p7.html Но программа не всегда реагирует на событие WM_HOTKEY, наверное, управление не успевает передаваться процедуре WMHotkey. Т.е. программа реагирует на горячую клавишу, когда цикл не запущен, а запускаешь цикл - не реагирует. Application.ProcessMessages и Application.HandleMessage внутри цикла не помогает. Может не туда вставляю? Как выйти из положения? Заранее благодарен. |
14.04.2007, 17:42 | #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.
Пусть баги обходят вас стороной
|
14.04.2007, 17:43 | #3 |
Форумчанин
Регистрация: 16.12.2006
Сообщений: 859
|
попробуй во время выполнения цикла проверять на нажатие кнопки.
GetKeyState(VK_ESCAPE) |
14.04.2007, 18:31 | #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. |
14.04.2007, 19:16 | #5 | |
Пользователь
Регистрация: 14.04.2007
Сообщений: 28
|
Цитата:
а в том - когда (когда нажат <Esc> или горячая клавиша)! Но все равно спасибо за помощь, узнал кое-что о классе TThread, глядишь - пригодится! |
|
14.04.2007, 20:18 | #6 |
Пользователь
Регистрация: 12.04.2007
Сообщений: 21
|
А я бы сказал, что дело в понимании применения класса TThread
Просто весь код, выполняющийся классом TThread, выполняется параллельно главному потоку приложения, а это значит, что сообщения, приходящие к твоим хоткеям не будут терятся из-за недостаточного выделения процессорного времени потоку, выполняющему обработку оконных сообщений.
Пусть баги обходят вас стороной
|
14.04.2007, 23:38 | #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 |