___ писал(а):
контрл+брэйк помогает не всегда
иногда работает четко, сразу выбрасывает трап и все ок, а иногда глухо, подождав время и понажимав неск раз приходится закрывать приложение. (но последовательность действий четкую сформулировать не могу. делаешь одно и тоже а результаты разные. либо стабильно виснет, либо стабильно трап выкидывает норм).
на хосте стоит вин7-64 (в виртуальной машине есть винХП, там контрл+брэйк вроде не сбоил, но там только для эксперимента запускал, а постоянно не работаю. раскомментирвоание халта и в хп дало реагирование на контрл+брэйк но сам робот зацикливается на цикле)
сейчас попробую ехе...
___ писал(а):
раскомментирвоание халта и в хп дало реагирование на контрл+брэйк но сам робот зацикливается на цикле
Наличие халта не влияет на работу Ctrl+Break. Попробуйте написать вот такой цикл:
WHILE TRUE DO HALT(20) END. Неужели не будет окна трапа? Если трап всё же будет, значит раскомментирование HALT'а не получилось.
Итак, мы решаем две разные проблемы.
Первая - ненадёжная работа Ctrl[+Shift]+Break. Здесь может быть проблема у одноядерных процессоров, которую можно попробовать решить путём поднятия приоритета нити, отвечающей за перехват Ctrl+Break. Вот здесь приложен BlackBox1.exe с поднятым приоритетом:
Вложение:
Комментарий к файлу: Повышен приоритет KeyboardWatcher.
BlackBox1.zip [37.07 КБ]
Скачиваний: 275
Попробуйте простой цикл WHILE TRUE DO END и проверьте работу Ctrl+Break. Прерывает ли? Надёжно ли работает или через раз?
Вторая проблема - мистическое отсутствие трапа после раскомментирования HALT. Проверьте просто так, работает ли вызов HALT(20)? (Должен показывать окно трапа.) Если просто так работает, а в SkRobot - нет, значит что-то не так раскомментировали или не то скомпилировали, не перезапустили и т.п. Должно быть так:
Код:
PROCEDURE Error;
BEGIN
Dialog.Beep;
robo.err := 1;
IF trap#NIL THEN trap ELSE HALT(20) END;
END Error;
...
PROCEDURE Step(rhumb: INTEGER);
BEGIN
IF robo.err = 0 THEN
IF Clear(rhumb) THEN
CASE rhumb OF
| noord: DEC(robo.y);
| zuid: INC(robo.y)
| west:DEC(robo.x)
| oost: INC(robo.x)
END
ELSE
Error
END;
Update
ELSE
END;
END Step;
Можете прямо отсюда скопировать, чтобы не проверять по буковкам.
Кстати, проверьте, не задано ли значение SkRobot.trap, ведь если SkRobot.trap # NIL, то HALT не вызывается.