Автор | Сообщение |
|
| |
Пост N: 340
Зарегистрирован: 08.07.06
|
|
Отправлено: 15.10.13 12:07. Заголовок: Как запретить перезагрузку Windows из Harbour ?
Добрый день. Многие сталкивались, наверное, с ситуацией, когда при перезагрузке Windows (например, после установки очередных обновлений) возникает сообщение: "Windows не может завершить работу приложения ABCDEF, нажмите "Завершить" или "Отменить". Как добиться похожего поведения программы на Harbour? Понятно, что этот механизм спрятан где-то внутри системы. Думаю, было-бы достаточно, чтобы при получении сообщения от операционки "быстро выходить" выполнялась определенная функция: закрывались таблицы, сохранялись документы и тп... Как считаете, это реально ? PS: откуда все это взялось: в процессе поиска редких и "необъяснимых" вылетов без единого сообщения в моем приложении прошло какое-то "кривое" октябрьское обновление для WinXP, которое требует многократной перезагрузки компа. Я сижу и смотрю логи, пытаюсь понять, что привело к вылетам и пустым логам... Спрашиваю у сотрудников че да как... А у них просто "компьютер потребовал перезагрузку, а выйти из программы забыли... а что, так разве нельзя???..."
|
|
|
Ответов - 24
, стр:
1
2
All
[только новые]
|
|
|
| |
Пост N: 3628
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.10.13 14:05. Заголовок: http://habrahabr.ru/..
|
|
|
|
| |
Пост N: 953
Зарегистрирован: 11.06.10
|
|
Отправлено: 15.10.13 14:22. Заголовок: Вручную отключить ав..
Вручную отключить автоматическое обновление! И не требовать от Harbour намного больше
|
|
|
|
| |
Пост N: 341
Зарегистрирован: 08.07.06
|
|
Отправлено: 15.10.13 14:35. Заголовок: Раньше не верил, но ..
Раньше не верил, но сейчас все больше убеждаюсь в мысли, что среднестатистический юзер - не больше, чем обезьянка с клавиатурой. После установки обновлений комп не перегружается автоматом, а лишь предлагает перезагрузку. Нафиг народу о чем-то думать, об открытых таблицах, документах - нажал "перегрузить", вышел покурить - и через пару минут все готово. А то, что в работе может быть куча таблиц, индексов, накладных - да пофиг...
|
|
|
|
| |
Пост N: 954
Зарегистрирован: 11.06.10
|
|
Отправлено: 15.10.13 14:51. Заголовок: Sergy пишет: Раньше..
Sergy пишет: цитата: | Раньше не верил, но сейчас все больше убеждаюсь в мысли, что среднестатистический юзер - не больше, |
|
вот -вот, куда мы катимся? Но это уже разговор в другом разделе не в harbour
|
|
|
|
| |
Пост N: 342
Зарегистрирован: 08.07.06
|
|
Отправлено: 15.10.13 15:32. Заголовок: AlexMyr пишет: вот ..
AlexMyr пишет: цитата: | вот -вот, куда мы катимся? Но это уже разговор в другом разделе не в harbour |
| Нифига... как раз Harbour должен решить этот вопрос. Винда говорит: "так, всем построиться и выйти нафиг, у нас reboot". А он ей в ответ: постой, паровоз, не стучите колеса, кондуктор, нажми на тормоза... я к юзеру в лапы, с последним приветом спешу показаться на глаза... Вопрос: как получить это системное сообщение от винды в приложение и правильно отработать его ? Уверен, что остальные приложения могут действовать в этой ситуации, а уж базе данных и подавно это жизненно необходимо.
|
|
|
|
| Администратор
|
Пост N: 3021
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.10.13 15:47. Заголовок: Против кнопки RESET ..
Против кнопки RESET лома нет приема Еще один способ перезагрузки (мой любимый): выдернуть сзади питание из системного блока
|
|
|
|
| |
Пост N: 955
Зарегистрирован: 11.06.10
|
|
Отправлено: 15.10.13 15:54. Заголовок: Sergy пишет: Нифига..
Sergy пишет: цитата: | Нифига... как раз Harbour должен решить этот вопрос. |
|
А если у юзера win98, тогда как? Уже было это по letodb, как остановить сервер на этой оси. Sergy пишет: цитата: | Вопрос: как получить это системное сообщение от винды в приложение и правильно отработать его ? Уверен, что остальные приложения могут действовать в этой ситуации, а уж базе данных и подавно это жизненно необходимо. |
|
Это скорее всего обработка ctrl-break для проги. Да и вроде ось не гарантирует при выдаче commit() молниеносного выполнения команды (могу ошибаться).
|
|
|
|
| постоянный участник
|
Пост N: 259
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.10.13 18:41. Заголовок: Sergy пишет:как раз ..
Sergy пишет: цитата: | как раз Harbour должен решить этот вопрос. |
| Это вопрос обработки сообщений: WM_QUERYENDSESSION и WM_ENDSESSION windows Для терминалов WVT, WIN можно поступить след.образом: 1. в IDLE (организовать on timer) проверку наличия файла <ExeName>.esc и "правильный" выход при наличии 2. Windows программа (запускается до основной) которая, получив вышеуказанные сообщения, создаст файл *.esc, подержит немного windows и завершится. Конечно от ситуации - Pasha пишет: цитата: | Против кнопки RESET лома нет приема Еще один способ перезагрузки (мой любимый): выдернуть сзади питание из системного блока |
| это не спасет, но хоть что-то. У меня такая штука стоит на letodb и еще на пару программулек
|
|
|
|
| постоянный участник
|
Пост N: 1148
Зарегистрирован: 09.10.06
|
|
Отправлено: 15.10.13 21:39. Заголовок: Sergy пишет: как ра..
Sergy пишет: цитата: | как раз Harbour должен решить этот вопрос |
| Решить вопрос должны Вы Средство регистрации событий завершения работы Windows Средство регистрации событий завершения работы предназначено для регистрации причины, которая привела к перезагрузке или завершению работы компьютера. Затем данную информацию можно просмотреть в журнале событий. Если компьютер под управлением Windows 7 подключен к домену, в котором используются средства наблюдения, сбор данной информации может осуществляться как часть процесса создания отчетов о сети. Если средство регистрации событий завершения работы включено, пользователи не могут осуществить перезагрузку или завершить работу системы без предоставления причины. При неожиданной перезагрузке или неожиданном завершении работы в результате сбоя подачи питания или поломки оборудования пользователю предлагается ввести причину в окне средства регистрации событий завершения работы при следующей загрузке компьютера. Так, что ищите в сети и читайте, узнаете много интересного. К примеру: Отмена перезагрузки или завершения работы Отменить перезагрузку или завершение работы с помощью пользовательского интерфейса регистрации событий завершения работы Windows невозможно. Это можно сделать только с помощью командной строки. Чтобы отменить перезагрузку или завершить работу: Откройте командную строку. Введите shutdown /a в течение периода ожидания. А еще есть API функции, к примеру AbortSystemShutdown, ShutdownBlockReasonCreate..
|
|
|
|
| |
Пост N: 343
Зарегистрирован: 08.07.06
|
|
Отправлено: 16.10.13 00:04. Заголовок: Петр пишет: А еще е..
Петр пишет: цитата: | А еще есть API функции, к примеру AbortSystemShutdown, ShutdownBlockReasonCreate.. |
| Похоже это именно то, что нужно. Осталось научиться получать сообщения WM_QUERYENDSESSION и WM_ENDSESSION upd: Хотя со второй функцией ничего даже ловить не нужно: http://msdn.microsoft.com/library/windows/desktop/aa376877.aspx цитата: | Applications should call this function as they begin an operation that cannot be interrupted, such as burning a CD or DVD. When the operation has completed, call the ShutdownBlockReasonDestroy function to indicate that the system can be shut down. |
| Но работает только под Vista/Server 2008... http://msdn.microsoft.com/ru-RU/library/windows/desktop/aa376881.aspx цитата: | Shutdown Notifications Applications with a window and message queue receive shutdown notifications through the WM_QUERYENDSESSION and WM_ENDSESSION messages. These applications should return TRUE to indicate that they can be terminated. Applications should not block system shutdown unless it is absolutely necessary. Applications should perform any required cleanup while processing WM_ENDSESSION. ... Console applications receive shutdown notifications in their handler routines. To register a console handler, use the SetConsoleCtrlHandler function. |
|
|
|
|
|
| |
Пост N: 3629
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.10.13 11:34. Заголовок: может чем поможет ht..
|
|
|
|
|
| |
Пост N: 344
Зарегистрирован: 08.07.06
|
|
Отправлено: 16.10.13 12:27. Заголовок: Dima пишет: может ч..
Dima пишет: О как... оказывается, 5 лет назад этот вопрос уже поднимался. Удалось его закрыть или было принято решение что против лома кнопки reset нет приема ? Дело в том, что переходить на графический интерфейс в ближайшее время пока не собираюсь и в том коде много для меня неясного...
|
|
|
|
| постоянный участник
|
Пост N: 260
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.10.13 13:00. Заголовок: Sergy пишет:Удалось ..
Sergy пишет: цитата: | Удалось его закрыть или было принято решение что против лома кнопки reset нет приема ? |
| Ваша задача должна определять предыдущий запуск был завершен нормально или аварийно. Во втором случае предпринимать определенные действия по проверке целостности данных, перестройке индексов и ...
|
|
|
|
| Администратор
|
Пост N: 3022
Зарегистрирован: 23.05.05
|
|
Отправлено: 16.10.13 14:19. Заголовок: SergKis пишет: Ваша..
SergKis пишет: цитата: | Ваша задача должна определять предыдущий запуск был завершен нормально или аварийно. Во втором случае предпринимать определенные действия по проверке целостности данных, перестройке индексов и ... |
| В случае сетевой задачи это проблематично. Если один клиент упал (а это явление нередкое), то придется ставить на уши всех. Еще один аргумент для использования клиент-сервера: в этом случае достаточно пожарные мероприятия делать только на сервере.
|
|
|
|
| |
Пост N: 345
Зарегистрирован: 08.07.06
|
|
Отправлено: 16.10.13 14:20. Заголовок: SergKis пишет: Ваша..
SergKis пишет: цитата: | Ваша задача должна определять предыдущий запуск был завершен нормально или аварийно. Во втором случае предпринимать определенные действия по проверке целостности данных, перестройке индексов и ... |
| Это моя программа делает без вопросов и уже много лет. Единственная проблема - "необъяснимые" вылеты без сообщений об ошибках и логов. Например выяснил, что FUNC Main(); Main(); RETURN выполняется около 9 тысяч раз и вылетает через GPF, не оставив не единого сообщения от Harbour на экране. Вот тут и хотелось-бы понять - что это: юзер нажал на перезагрузку или программа вылетела без участия errorsys. Может быть, проще зайти с другой стороны: наверняка где-нить в реестре хранится дата/время начала текущей сессии. Если ее прочитать и сравнить с временем запуска программы?
|
|
|
|
| |
Пост N: 956
Зарегистрирован: 11.06.10
|
|
Отправлено: 16.10.13 15:14. Заголовок: Sergy пишет: FUNC M..
Sergy пишет: цитата: | FUNC Main(); Main(); RETURN |
|
Вы зациклили main()? Sergy пишет: цитата: | Единственная проблема - "необъяснимые" вылеты без сообщений об ошибках и логов. |
|
если вылетов много на день, то вариант самому сесть на место юзера и посмотреть реальную картину или понаблюдать за юзером, что он делает.
|
|
|
|
| |
Пост N: 346
Зарегистрирован: 08.07.06
|
|
Отправлено: 16.10.13 18:18. Заголовок: AlexMyr пишет: Вы з..
AlexMyr пишет: Да. В языках высокого уровня, коим является Harbour, по идее должен быть обработчик ошибок на такой случай. Ведь программист - человек и может ошибиться, написав ошибочный код. Во всяком случае, при компиляции под Windows его нет. Дело доходит до системного GPF. цитата: | если вылетов много на день, то вариант самому сесть на место юзера и посмотреть реальную картину или понаблюдать за юзером, что он делает. |
| 1-2 в день, да и то не всегда. По сообщениям юзеров - окно просто "схлопывается" без единой ошибки. Настроил пару "мышеловок", в том числе с захватом экрана после завершения процесса (см.в теме про CTRL-BREAK) - посмотрим.
|
|
|
|
| Администратор
|
Пост N: 3023
Зарегистрирован: 23.05.05
|
|
Отправлено: 16.10.13 21:03. Заголовок: Sergy пишет: В язык..
Sergy пишет: цитата: | В языках высокого уровня, коим является Harbour, по идее должен быть обработчик ошибок на такой случай. Ведь программист - человек и может ошибиться, написав ошибочный код. Во всяком случае, при компиляции под Windows его нет. Дело доходит до системного GPF. |
| Это не ошибка, а обычная рекурсия, которая неправильно используется. Рекурсию же не запретишь. Компиляторы С тоже пропускают функцию вроде такой: void ttt(){ttt();}
|
|
|
|
| |
Пост N: 347
Зарегистрирован: 08.07.06
|
|
Отправлено: 16.10.13 21:42. Заголовок: Pasha пишет: Это не..
Pasha пишет: цитата: | Это не ошибка, а обычная рекурсия, которая неправильно используется. Рекурсию же не запретишь. |
| Еще чего не хватало. Нужно лишь ограничить ее глубину и контролировать, только и всего. цитата: | Компиляторы С тоже пропускают функцию вроде такой: void ttt(){ttt();} |
| Ну так на Си пишут операционные системы, драйверы и прочую системную инженерию вроде самого Harbour. Если там в каждом случае делать проверку на переполнение стека вызовов, мы опять вернемся по тормозам к Windows 95 и процу 486-DX133. А Harbour - язык высокого уровня, на нем пишутся пусть сложные системы, но не требующие высочайшей производительности или отклика в реальном времени. Поскольку там все равно упирается в ширину канала и нагрузку на сервер, скорость жестких дисков, а не такты процессора. PS: недавно проверил, что глубина вызовов deferror/errorsys ограничена числом 8. Свыше этого возникает ошибка 9003. И это правильно. А в Clipper 5.2e подобный код: CLEAR SCREEN Main(0) QUIT * -------- * FUNC Main(n) @ 10,10 SAY n Main(n+1) RETURN Вызывает контролируемую Unrecoverable error 650: Processor stack fault примерно через 130 вызовов, а не системный GPF
|
|
|
|
| Администратор
|
Пост N: 3024
Зарегистрирован: 23.05.05
|
|
Отправлено: 17.10.13 08:46. Заголовок: Да будь язык хоть са..
Да будь язык хоть самого сверхвысокого уровня, он не будет блокировать зацикливание при рекурсии, ни на этапе компиляции, ни на этапе интерпретации (когда такой этап имеется). Если знаете такой - напишите. На какой размер блокировать рекурсию ? На 100 ? На 100 тысяч ? А если это необходимо для расчетов ? Это же абсурд. Надо понимать еже такой момент. Любая проверка в vm сказывается на его производительности. Если добавить эту абсурдную проверку, то выполнение всех харбор-функций будет чуть медленнее. Таких абсурдных проверок можно придумать множество. Но проверять такие вещи - не функция vm, а функция программиста. Реакция на абсурдный код непредсказуема, поэтому она разная в клиппере и харборе. Размер стека в клиппере к тому же мизерный по сравнению с харбором. Впрочем, все в Ваших руках. Хотите - напишите в devlist предложение добавить такую проверку, и посмотрите на реакцию.
|
|
|
|
| |
Пост N: 349
Зарегистрирован: 08.07.06
|
|
Отправлено: 17.10.13 12:29. Заголовок: Pasha пишет: Да буд..
Скрытый текст Pasha пишет:
цитата: | Да будь язык хоть самого сверхвысокого уровня, он не будет блокировать зацикливание при рекурсии, ни на этапе компиляции, ни на этапе интерпретации (когда такой этап имеется). Если знаете такой - напишите. На какой размер блокировать рекурсию ? На 100 ? На 100 тысяч ? А если это необходимо для расчетов ? Это же абсурд. |
|
Я привел пример Clipper, там все ровно: 130 рекурсивных вызовов и привет. 100 тысяч рекурсивных вызовов - вот это действительно абсурд.
цитата: | Надо понимать еже такой момент. Любая проверка в vm сказывается на его производительности. Если добавить эту абсурдную проверку, то выполнение всех харбор-функций будет чуть медленнее. Таких абсурдных проверок можно придумать множество. Но проверять такие вещи - не функция vm, а функция программиста. |
|
Насколько я понимаю Си и ассемблер, проверить одну переменную (указатель стека вызовов) - 2..3 машинных такта. Посмотрите, сколько "лишних" операций происходит при работе кода, написанного на Harbour. И все из-за целей совместимости. Опять-же, есть опция компилятора: сохранять номера строк выполняемых операций/команд/функций. Те-же самые 2-3 машинных такта. Выключите ее и посмотрите, насколько быстрее станет работать приложение. Честно говоря, вовсе не собирался с кем-то ругаться по этому поводу. И не хочу перекладывать вину с себя (где-то что-то ненароком зациклил) на среду разработки. Просто высказал свое удивление и надеюсь на взаимопонимание, а не метание какашками. Сорри если что не так.
| Давайте вернемся к теме: пока не могу сделать свой обработчик системных сообщений, подскажите плиз - кто-нить знает, где в реестре хранится время начала текущего сеанса ? Спасибо.
|
|
|
|
|
| |
Пост N: 64
Зарегистрирован: 21.04.13
|
|
Отправлено: 17.10.13 12:54. Заголовок: Журнал сеансов запуска приложения
1)Проще сделать свой собственный журнал - общую DBF при старте ПО сгенерить уникальный ИД сеанса и записать атрибуты начала сеанса (ИД,дата,время...). При завершении - найти в журнале свою запись по ИД и записать в эту строку атрибуты окончания сеанса. Если потом при просмотре журнала атрибуты окончания сеанса окажутся пустыми ( не записано), значит этот сеанс не дошел до конца(свалился) 2) Если есть права к Планировщику заданий компов клиентов - сделайте задания планировщика на запуск приложения, планировщик ведет журнал запуска сеансов.
|
|
|
|
| |
Пост N: 3630
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.10.13 14:28. Заголовок: Sergy пишет: Опять-..
Sergy пишет: цитата: | Опять-же, есть опция компилятора: сохранять номера строк выполняемых операций/команд/функций. Те-же самые 2-3 машинных такта. Выключите ее и посмотрите, насколько быстрее станет работать приложение. |
| Не поверил бы на слово , но пересобрав приложение чисто внешне обнаружил что работает несколько быстрее. А какие еще есть опции влияющие на производительность работы приложения ?
|
|
|
|
| |
Пост N: 354
Зарегистрирован: 08.07.06
|
|
Отправлено: 20.10.13 11:07. Заголовок: Dima пишет: Не пове..
Dima пишет: цитата: | Не поверил бы на слово , но пересобрав приложение чисто внешне обнаружил что работает несколько быстрее. А какие еще есть опции влияющие на производительность работы приложения ? |
| Ну, с таким-же успехом можно включить/выключть дебуггер и сравнить. Опция -b идет со времен Clipper.
|
|
|
Ответов - 24
, стр:
1
2
All
[только новые]
|
|