Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Можно как-то отловить нажатие Esc? (число прочтений - 16236 )
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно как-то отловить нажатие Esc?
Ответ #15 - 14. Ноября 2007 :: 16:52
Печать  
kms писал(а) 14. Ноября 2007 :: 16:40:
это ХОРОШО или это ПЛОХО?

Деструктор будет вызван, если случилась остановка по Esc?
А у базовых классов?
  
Наверх
ICQ  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно как-то отловить нажатие Esc?
Ответ #16 - 14. Ноября 2007 :: 16:52
Печать  
В действительности все еще сложнее, чем на самом деле.

Если в коде класса вот такой код:
Код
Выбрать все
	Для С = 1 По 10000 Цикл
		А = 2+2;
	КонецЦикла;
 


То эскейп ловится в обоих вариантах.

А если в коде класса вот такой код:
Код
Выбрать все
	Для С = 1 По 100000 Цикл
		А = 2+2;
	КонецЦикла;
 


, то есть если метод класса выполняется в 10 раз больше времени, то эскейп ловится только в новом варианте (с отладкой). В старом же варианте на длинном методе эскейп вообще улетает в никуда.

Вот теперь я готов побыть крошкой сыном, пришедшим к отцу.
  
Наверх
www  
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно как-то отловить нажатие Esc?
Ответ #17 - 14. Ноября 2007 :: 16:57
Печать  
Кстати, про деструктор: а если Esc прилетает в части кода деструктора? Улыбка
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Можно как-то отловить нажатие Esc?
Ответ #18 - 14. Ноября 2007 :: 17:01
Печать  
Цитата:
Вот теперь я готов побыть крошкой сыном, пришедшим к отцу.

OFF: Я тоже, но к сожалению, понимание этого пришло ко мне слишком поздно.

fez писал(а) 14. Ноября 2007 :: 16:52:
, то есть если метод класса выполняется в 10 раз больше времени, то эскейп ловится только в новом варианте (с отладкой). В старом же варианте на длинном методе эскейп вообще улетает в никуда.

Да ты уже все сам понял, 100%.

История там такая - да, я решал свои личные [нужное подставить] трудности, поэтому демаскировал обработку ESC при обработке методов классов.
Это было в какой-то моей сборке, код которой я опубликовал вместе с методикой отладки классов без использования "кнопки отладка".

Т.е. для меня это было хорошо.
Потом я уже не следил за процессом, наверное Артур этот вариант использовал в какой-то ветке.
Наверное, только в одной 2.5, ибо как я понимаю, поведение отличается в разных ветках.

Ну а дальше - пока что есть, то есть.
Если мы сможем придумать что-то еще более грамотное - это будет ох№№. ох, как хорошо это будет.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно как-то отловить нажатие Esc?
Ответ #19 - 14. Ноября 2007 :: 17:15
Печать  
kms писал(а) 14. Ноября 2007 :: 17:01:
fez писал(а) 14. Ноября 2007 :: 16:52:
, то есть если метод класса выполняется в 10 раз больше времени, то эскейп ловится только в новом варианте (с отладкой). В старом же варианте на длинном методе эскейп вообще улетает в никуда.

Да ты уже все сам понял, 100%.

Только я сам еще об этом не знаю Улыбка

В общем так.

1. Пользователям нравится, когда работу длинного отчета (ну ошиблись в выборе интервала дат) можно прервать эскейпом.
2. Мне нравится, когда для реализации этого поведения не нужно ничего дополнительно кодировать.

С этой точки зрения старый вариант - это хорошо, новый вариант - это плохо.

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

С этой точки зрения новый вариант дает хоть какую-то надежду. Старый вариант полностью беспомощен.

P.S. К Тебе, Господи, возношу душу мою. Боже мой, на Тебя уповаю, да не постыжусь вовек, да не восторжествуют надо мной враги мои.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Можно как-то отловить нажатие Esc?
Ответ #20 - 14. Ноября 2007 :: 17:21
Печать  
Хорошо сказал. Улыбка

Короче, есть еще над чем подумать.
И над вопросами Кирилла.

Видимо, нужны нормальные механизмы контроля состояния запроса на прерывание работы модуля.

P.S.
А у меня, кстати, методы класса могут отрабатывать десятки секунд.
Целые отчеты могут выводиться одним методом - тут старое поведение было просто смертельным йадом.

Ну, ничего, я оптимист.
Вот вернусь из отпуска - а все везде уже сделано, все как надо. Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно как-то отловить нажатие Esc?
Ответ #21 - 14. Ноября 2007 :: 17:23
Печать  
kms писал(а) 14. Ноября 2007 :: 17:01:
История там такая - да, я решал свои личные [нужное подставить] трудности, поэтому демаскировал обработку ESC при обработке методов классов.

Возможно ли сделать так, чтобы эта демаскировка работала только при включенной кнопке "Отладка"?

Думаю, что это лучшее, что можно сделать быстро и малой кровью. Ибо тогда пользователи хотя бы иногда будут получать возможность прерывать свои отчеты, а разработчики смогут продолжать решать свои личные трудности.
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно как-то отловить нажатие Esc?
Ответ #22 - 14. Ноября 2007 :: 17:25
Печать  
kms писал(а) 14. Ноября 2007 :: 17:21:
Вот вернусь из отпуска - а все везде уже сделано, все как надо. Улыбка

Ты тогда хоть пальцем покажи, где эту самую демаскировку искать-то?
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Можно как-то отловить нажатие Esc?
Ответ #23 - 14. Ноября 2007 :: 17:28
Печать  
fez писал(а) 14. Ноября 2007 :: 17:23:
Возможно ли сделать так, чтобы эта демаскировка работала только при включенной кнопке "Отладка"?

Дык как всегда, возможно и так и сяк.
Только не думаю, что это лучший вариант.

"Отладка" - на многое еще завязана, типа сброса кеша классов и т.д.
Нужно управление типа "МаскироватьESC()" / "ДемаскироватьESC()", "ПолучитьСтатусESC()".

Т.е.  пока предлагаю сделать как угодно и записать в багзиллу на будущее, когда будет время подумать.
Если мысли еще какие в голову придут - опять туда же записать.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Можно как-то отловить нажатие Esc?
Ответ #24 - 14. Ноября 2007 :: 17:31
Печать  
fez писал(а) 14. Ноября 2007 :: 17:25:
Ты тогда хоть пальцем покажи, где эту самую демаскировку искать-то?

BLModuleWrapper.*

Только я подробностей уже не помню.
Помнить должен... - но я не помню.

И к сожалению, как в фильмах, когда забывчивые пиндосы за двадцатку баксов могут вспомнить хоть содержание большой советцкой энциклопедии, у меня сейчас не получится Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
noprogrammer
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 465
Зарегистрирован: 16. Июня 2006
Re: Можно как-то отловить нажатие Esc?
Ответ #25 - 14. Ноября 2007 :: 20:36
Печать  
Учитывая что в Формексе есть метод "Сервис.ОстановитьВыполнение()" - то в теории вроде как
должен работать следующий код для прекращения выполнения любого модуля (правда на практике код конечно неработает, но почему бы ему не заработать?! Подмигивание)


Код
Выбрать все
Процедура ПриНажатииКнопкиКлавиатуры(Конт, КодКлавиши, фAlt, фShift, фCtrl, Символ, ФСО)
	Если (НажатаКлавиша_Ctrl=1) И (НажатаКлавиша_Backspase=1) Тогда
		_Сервис.ОстановитьВыполнение();
	КонецЕсли;
КонецПроцедуры
 

  
Наверх
wwwICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно как-то отловить нажатие Esc?
Ответ #26 - 15. Ноября 2007 :: 08:30
Печать  
noprogrammer писал(а) 14. Ноября 2007 :: 20:36:
Учитывая что в Формексе есть метод "Сервис.ОстановитьВыполнение()" - то в теории вроде как
должен работать следующий код для прекращения выполнения любого модуля (правда на практике код конечно неработает, но почему бы ему не заработать?! Подмигивание)

Дело в том, что
1) ФормЕкс ничего не знает о классах
2) Указанный выше метод останавливает только выполнение текущего модуля ( в терминах С++ CBLModule::GetExecutedModule() ), т.е. например, модуля формы, но не модуля класса
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно как-то отловить нажатие Esc?
Ответ #27 - 15. Ноября 2007 :: 08:31
Печать  
Читал, но не все понял.
Федор, можно как-то подытожить, что и в каких версиях работает/не работает?
и что требуется в итоге Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно как-то отловить нажатие Esc?
Ответ #28 - 15. Ноября 2007 :: 11:58
Печать  
artbear писал(а) 15. Ноября 2007 :: 08:31:
Читал, но не все понял.
Федор, можно как-то подытожить, что и в каких версиях работает/не работает?
и что требуется в итоге Улыбка

Возьми мою тестовую конфигурацию. Запусти отчет "новый1" и попробуй его прервать эскейпом.
Попробуй сделать это сначала на 2.5.0.1, а потом на 2.5.0.3.
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Можно как-то отловить нажатие Esc?
Ответ #29 - 15. Ноября 2007 :: 12:02
Печать  
spock писал(а) 14. Ноября 2007 :: 16:52:
kms писал(а) 14. Ноября 2007 :: 16:40:
это ХОРОШО или это ПЛОХО?

Деструктор будет вызван, если случилась остановка по Esc?
А у базовых классов?


Не думаю, что в такой ситуации нужно вызывать деструктор. Думаю, что в такой ситуации деструктор вызывать не надо Улыбка

Вообще это общая проблема пользовательского перрывания. Безотносительно классов.
Работает обработка.
Эта обработка вогнала систему в некоторое состояние. К примеру, поменяла какие-то глобальные переменные.
По окончании обработки планируется возврат системы в прежнее состояние.
Пользователь нажал эскейп.
Думаете, 1С вернет систему в прежнее состояние?
Думаете, 1С должна это сделать?

А вот нажатие эскейпа непосредственно в коде деструктора - это отдельная тема. Думаю, что тут на эскейп надо класть, давать деструктору доработать, а по завершению передавать его дальше по стеку получателей эскейпов.
  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать