Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2007, 15:17   #1
Hintman
Пользователь
 
Регистрация: 14.04.2007
Сообщений: 28
По умолчанию Приостановка программы

Пишу на Delphi программу,
выполняющую очень долгий цикл repeat...until.

Подскажите, как сделать, чтобы при нажатии, скажем,
клавиши <Esc> выдавалось MessageDialog() с вопросом:
"Приостановить работу программы"?

А вначале я хотел чтобы можно было прервать работу программы горячей клавишей.
Сделал, как написано здесь:
http://www.excode.ru/art3997p7.html

Но программа не всегда реагирует на событие WM_HOTKEY,
наверное, управление не успевает передаваться процедуре WMHotkey.

Т.е. программа реагирует на горячую клавишу, когда цикл не запущен,
а запускаешь цикл - не реагирует.
Application.ProcessMessages и Application.HandleMessage внутри цикла не помогает.

Может не туда вставляю? Как выйти из положения? Заранее благодарен.
Hintman вне форума Ответить с цитированием
Старый 14.04.2007, 17:42   #2
bphoenix
Пользователь
 
Аватар для bphoenix
 
Регистрация: 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.
Пусть баги обходят вас стороной
bphoenix вне форума Ответить с цитированием
Старый 14.04.2007, 17:43   #3
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

попробуй во время выполнения цикла проверять на нажатие кнопки.
GetKeyState(VK_ESCAPE)
Роман Радер вне форума Ответить с цитированием
Старый 14.04.2007, 18:31   #4
Hintman
Пользователь
 
Регистрация: 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.
Hintman вне форума Ответить с цитированием
Старый 14.04.2007, 19:16   #5
Hintman
Пользователь
 
Регистрация: 14.04.2007
Сообщений: 28
По умолчанию

Цитата:
Сообщение от bphoenix Посмотреть сообщение
а почему не использовать класс TThread?
Когда нужно будет приостановить работу потока используй TMyThread.Suspend.
Для возобновления выполнения -- MyThread.Resume.
Да вопрос-то не в том, как приостановить работу (Suspend),
а в том - когда (когда нажат <Esc> или горячая клавиша)!

Но все равно спасибо за помощь, узнал кое-что о классе TThread,
глядишь - пригодится!
Hintman вне форума Ответить с цитированием
Старый 14.04.2007, 20:18   #6
bphoenix
Пользователь
 
Аватар для bphoenix
 
Регистрация: 12.04.2007
Сообщений: 21
По умолчанию

А я бы сказал, что дело в понимании применения класса TThread
Просто весь код, выполняющийся классом TThread, выполняется параллельно главному потоку приложения, а это значит, что сообщения, приходящие к твоим хоткеям не будут терятся из-за недостаточного выделения процессорного времени потоку, выполняющему обработку оконных сообщений.
Пусть баги обходят вас стороной
bphoenix вне форума Ответить с цитированием
Старый 14.04.2007, 23:38   #7
Hintman
Пользователь
 
Регистрация: 14.04.2007
Сообщений: 28
По умолчанию

Вот как? Попробую! Спасибо!!!
Hintman вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приостановка выполнения цикла 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