|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
В свое время долгие мучения на тему юзера, который "забыл" выключиться привели к простому решению при условии не-архи-критичности ещенощной индексации: "забыл" выключиться - остался без ужина! 2-3 "резонансных" случая на контору - и никаких проблем уже десяток лет... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 07:27 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
е ж енощной... сорри... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 07:28 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
MaestroEvДавайте опишем стратегию, а не реализацию. К реализации перейдем после понимания того что, когда и где надо делать. Что ж, давайте попробуем. В принципе, ответ Вам уже дали:Dima TДумаю стандартного решения у этой проблемы нет, на это надо заранее закладываться. Например в каждой форме предусмотреть метод, вызвав который форма без вопросов закроется. И вызывать этот метод при автозакрытии. Теперь подробнее. Это вроде уже есть: MaestroEvВ программе есть таймер. Раз в десять минут проверяет время - если время больше установленного для выхода - пытается завершить программу. Во-первых, надо ставить (программно, вручную) некий индикатор "требуется завершение программы". У меня создается файлик в общей рабочей папке на сервере и основная форма по таймеру проверяет раз в 30 минут его наличие. Если появился - сообщение (содержимое этого txt-файлика, т.е. текст сообщения можно менять при создании) всем активным юзерам и блокировка запуска для новых юзеров. Одновременно включается признак "принудительного завершения" - глобальная переменная=.T. Есть еще переменная, соответствующая "уровню формы". Она не дает закрыться родительской форме, пока не закрыты все дочерние. Таймеров должно быть несколько - на каждую форму. Код Timer() примерно такой: Код: plsql 1. 2. 3. 4.
Если есть какие-то большие циклы, то соответствующий таймер надо притормаживать перед ними и опять запускать по их завершении. М-да, получилось как-то сумбурно и не подробно (всего сейчас просто не помню), но идея, я думаю, понятна. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 07:33 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
MaestroEvЧто ж мы сразу то или убить пользователя или убить процесс. Ладно, упростим задачу. Выключить надо не резко, а в принципе. Ночь большая. Выключить и все. Дождаться всех незавершенных циклов если есть и выключить так как это бы сделал юзер последовательно закрывая все окошки и нажав <выход>. Серверу утром нужен монопольный режим и у нас вся ночь на выход из программы. Давайте опишем стратегию, а не реализацию. К реализации перейдем после понимания того что, когда и где надо делать. Готового решения у меня нет, не было необходимости такую задачу решать. Ниже по какому бы пути я пошел решая эту задачу. Без убивания процесса тут никак, но это крайняя мера, поэтому я бы так сделал: первым запускается этот же EXE c параметрами Код: sql 1. 2.
Новый сразу получает хэндл по lcPid и ждет заданное время, например 10 минут, в которые основной должен закрыться своими силами. По истечении времени убивает. Сразу получить хэндл важно, т.к. процесс может закрыться и через 10 минут может появиться другой с этим же ProcessId, т.е. убъем непонятно кого. Например если вышел MessageBox то ничего ты с ним программно не сделаешь. Надо еще проверить срабатывает ли вообще таймер когда активна не форма: 1. MessageBox() 2. при выборе файла GetFile()/LocFile() и т.п. 3. REPORT выведен на предпросмотр, открыт выбор принтера (если PROMPT используется в REPORT). Теперь сам алгоритм закрывания: Часть 1. Пробуем закрыть средствами проги берем _screen.activeform или если нет такой первую попавщуюся из коллекции _vfp.forms() 1.1 проверяем наличие метода SilentRelease() - если есть запускаем, туда должен быть прописан код закрытия формы без задавания вопросов. иначе переходим к 1.2. 1.2. Ищем кнопку cmdCancel если есть делаем cmdCancel.Click() - но это в случае если кнопка "Отмена" всегда называется cmdCancel и никогда не задает вопросов с помощью MessageBox(). У меня обычно именно так. Иначе п. 1.3 1.3. вызываем Release() формы за одно срабатывание таймера такое проделывать только с одной формой, т.к. по закрытию формы генерятся всякие сообщения, становятся в очередь и надо дать фоксу их обработать перед тем как переходить к следующей форме. Еще надо как-то определять что открыт REPORT на предпросмотр, тут ничего не подскажу, не разбирался ни разу с этим вопросом. Закрыть репорт можно попробовать с помощью KEYBOARD "CTRL+W" Часть 2. Закрытие таблиц. переребираем все DATASESSION и в каждой делаем CLOSE DATA ALL. ну и в конце Код: sql 1. 2. 3.
Тут возможно появление ошибок в Destroy() объектов которые существуют на этот момент. PS Ну и писать лог всех действий таймера и все вызовы код из таймера обернуть в TRY ... CATCH ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 10:00 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
Dima TНапример если вышел MessageBox то ничего ты с ним программно не сделаешь. А так: Код: plsql 1.
Главное, чтобы messagebox был правильно настроен (нужная кнопка по умолчанию). Dima TЕще надо как-то определять что открыт REPORT на предпросмотр, тут ничего не подскажу, не разбирался ни разу с этим вопросом. Закрыть репорт можно попробовать с помощью KEYBOARD "CTRL+W" Тоже не проблема: Код: plsql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:32 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
Jonny540Dima TНапример если вышел MessageBox то ничего ты с ним программно не сделаешь. А так: Код: plsql 1.
Главное, чтобы messagebox был правильно настроен (нужная кнопка по умолчанию). Тоже такая мысль появилась, правда после того как запостил. Что касается кнопки по умолчанию: MessageBox еще на кнопки "Д", "Н" и т.д. реагирует, буквы на кнопках подчеркнуты. Тут только возникает вопрос как из таймера определить что на экране MessageBox() висит? Ну и убедиться что сработает таймер в этот момент, а не будет ждать пока пользователь что-нибудь ответит. Тема неизученная, надо просто протестить все подозрительные варианты и придумать их обработку. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 12:49 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
Dima TТут только возникает вопрос как из таймера определить что на экране MessageBox() висит?В этом все и дело. Пока не приходилось проверять, надо попробовать. А вообще-то неплохо бы в программе предусмотреть, когда выдавать мессбокс, а когда нет.Dima TНу и убедиться что сработает таймер в этот момент в этот момент, а не будет ждать пока пользователь что-нибудь ответитТут проще - если "маячок" горит, значит пользователь уже ушел от нас и ничего он уже никогда никому не ответит ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:09 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
MaestroEv, И еще: принудительное корректное закрытие приложения - штука довольно мозгоемкое (так и просится другое слово ), особенно если много всяких форм, отчетов и т.д. Если ты этого действительно хочешь - флаг в руки и барабан на шею. Чем можем - поможем. Чем унифицированней формы, кнопки, код... - тем лучше. Если неохота этим заниматься - то 14133592 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:26 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
Jonny540Dima TТут только возникает вопрос как из таймера определить что на экране MessageBox() висит?В этом все и дело. Пока не приходилось проверять, надо попробовать. А вообще-то неплохо бы в программе предусмотреть, когда выдавать мессбокс, а когда нет.Dima TНу и убедиться что сработает таймер в этот момент в этот момент, а не будет ждать пока пользователь что-нибудь ответитТут проще - если "маячок" горит, значит пользователь уже ушел от нас и ничего он уже никогда никому не ответит Вопрос вообще-то по другому стоит MaestroEvСерверу утром нужен монопольный режим и у нас вся ночь на выход из программы. т.е. пользователь в конце рабочего дня встал, оделся и ушел, точнее свалил по-быстрому забыв закрыть прогу и выключить комп. Прога может и на MessageBox`е остаться открыта. В любом состоянии может остаться. Твой "маячок" вообще бесполезен если за компом никого нет и ничего в проге не делается. Ты же исходишь из того что пользователь своей активностью запустит проверку "маячка", а дальше отработает нужный тебе код. А тут нет пользователя. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:28 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
Jonny540Если неохота этим заниматься - то 14133592 Не всегда возможно. Если ты сторонний разработчик, то может появиться доминирующее мнение "это не мы криворукие, это разработчик прогу корявую написал". Особенно если местный админ забывает прогу закрывать и комп выключать. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:33 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
Dima TТвой "маячок" вообще бесполезен если за компом никого нет и ничего в проге не делается. Ты же исходишь из того что пользователь своей активностью запустит проверку "маячка", а дальше отработает нужный тебе код. А тут нет пользователя. А юзер и не нужен, если есть таймер. Messagebox великолепно удаляется и без юзера, только что проверил. А "маячок" зажигается админом приложения и от юзера уже мало зависит, сохранится и завершится и без него :) 14133599 Во всяком случае у меня эта схема работает довольно давно без каких либо сложностей. ЗЫ То, что коряво ее описал, это другой вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:47 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
Наверное вот что забыл сказать: маячок зажигается с любой доступной машины в сети, вход с паролем админа приложения. И все, таймер затикал, все остальные могут собирать манатки... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 13:53 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
Jonny540Messagebox великолепно удаляется и без юзера У Messagebox() есть параметр таймаут (как-бы нет смысла в висении его часами) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 15:05 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
XAndyУ Messagebox() есть параметр таймаут (как-бы нет смысла в висении его часами)Это не всегда удобно, если юзер все-таки еще не совсем ушел (скажем, покурить). ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 16:15 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
XAndyJonny540Messagebox великолепно удаляется и без юзера У Messagebox() есть параметр таймаут (как-бы нет смысла в висении его часами) Есть такое, я сначала даже начал пользоваться, только потом выяснилось что при указании таймаута возникает нездоровый побочный эффект - если кликнуть мимо окошка Messagebox() то он уходит на задний план (за окно фокса) и прога выглядит зависшей. Можно конечно задать поверх всех окон (+4096 во втором параметре), тогда оно вылазит в центре экрана даже если окно самой проги скрыто под другими, что тоже не очень хорошо. А без таймаута все нормально, окошко в центре окна фокса, за него не прячется и поверх других не лезет Не знаю почему такая багофича у разработчиков фокса получилась, но моим пользователям это сильно не понравилось. Пришлось отказаться от ее использования. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 16:25 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
Jonny540Dima TТвой "маячок" вообще бесполезен если за компом никого нет и ничего в проге не делается. Ты же исходишь из того что пользователь своей активностью запустит проверку "маячка", а дальше отработает нужный тебе код. А тут нет пользователя. А юзер и не нужен, если есть таймер. Messagebox великолепно удаляется и без юзера, только что проверил. А "маячок" зажигается админом приложения и от юзера уже мало зависит, сохранится и завершится и без него :) 14133599 Во всяком случае у меня эта схема работает довольно давно без каких либо сложностей. ЗЫ То, что коряво ее описал, это другой вопрос. Тут ты опять от темы отходишь. Вопрос ведь стоит "как закрыть", а "не как определить момент закрытия". Мы с тобой о разных вещах говорим. Я о "как закрыть". Пусть MaestroEv сам решает какой из вопросов его интересует. PS Кстати про программное определение того что MessageBox() висит ты ничего не написал :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 16:43 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
Dima TМы с тобой о разных вещах говорим. Я о "как закрыть" Я тоже. Dima TPS Кстати про программное определение того что MessageBox() висит ты ничего не написал :)Писал уже:Jonny540 Dima TТут только возникает вопрос как из таймера определить что на экране MessageBox() висит?В этом все и дело. Пока не приходилось проверять, надо попробовать. А вообще-то неплохо бы в программе предусмотреть, когда выдавать мессбокс, а когда нет.Пока не пробовал еще, м.б. завтра :) И, действительно, пусть ТС решает, а то он что-то молчит. :) Ладно, пусть пока переваривает советы. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 17:49 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
Jonny540И, действительно, пусть ТС решает, а то он что-то молчит. Спит он уже. У него часовой пояс Москва+6 часов :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 20:36 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
Dima Tпотом выяснилось что при указании таймаута возникает нездоровый побочный эффект - если кликнуть мимо окошка Messagebox() то он уходит на задний план (за окно фокса) и прога выглядит зависшей. Можно конечно задать поверх всех окон (+4096 во втором параметре), тогда оно вылазит в центре экрана даже если окно самой проги скрыто под другими Вот как, не знал (пользуюсь своим Messagebox'ом) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2013, 22:30 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
Dima TXAndyпропущено... У Messagebox() есть параметр таймаут (как-бы нет смысла в висении его часами) Есть такое, я сначала даже начал пользоваться, только потом выяснилось что при указании таймаута возникает нездоровый побочный эффект - если кликнуть мимо окошка Messagebox() то он уходит на задний план (за окно фокса) и прога выглядит зависшей. Можно конечно задать поверх всех окон (+4096 во втором параметре), тогда оно вылазит в центре экрана даже если окно самой проги скрыто под другими, что тоже не очень хорошо. А без таймаута все нормально, окошко в центре окна фокса, за него не прячется и поверх других не лезет Не знаю почему такая багофича у разработчиков фокса получилась, но моим пользователям это сильно не понравилось. Пришлось отказаться от ее использования. Это не "багофича", а так задумано. Разумеется, если проверять в реальных кодах. Из хелпа: MESSAGEBOX() возвращает значение -1, когда происходит задержка времени. В этом и суть - в нужных случаях это значение можно обрабатывать программно и без ваших "пользователей". MESSAGEBOX() это не только фоксовская функция: #DEFINE MB_APPLMODAL 0x0 && пользователь может перемещаться в окнах других прикладных программ и работать в этих окнах. #DEFINE MB_SYSTEMMODAL 0x1000 && чтобы уведомлять пользователя о серьезных, потенциально опасных ошибках, которые требуют немедленного внимания #DEFINE MB_TASKMODAL 0x2000 && вызывающая прикладная программа или библиотека не имеют доступного дескриптора окна, но все еще должны сохранять вводимые данные для других окон в текущей прикладной программе ЗЫ. Вам впору уже свои идеи патентовать ... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2013, 11:40 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
Dima TЧасть 1. Пробуем закрыть средствами проги берем _screen.activeform или если нет такой первую попавщуюся из коллекции _vfp.forms() Интересно, если подробнее ... как вы ловите свою "первую попавщуюся". ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2013, 11:42 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
sg12Это не "багофича", а так задумано. Разумеется, если проверять в реальных кодах. MSDN сам переводил или скопипастил у кого? Ты проверь сначала что это работает, прежде чем сюда писать. Покажи что я должен написать чтобы не иметь обе проблемы: 1. если кликнуть в окно фокса мимо окошка Messagebox() то оно уходит на задний план (за окно фокса) и прога выглядит зависшей 2. окно Messagebox() не должно вылазить в центре экрана поверх всех окон если окно фокса скрыто под другими т.е. поведение окна Messagebox() при вызове с указанием таймаута должно быть такое же как и при вызове его без указания таймаута. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2013, 12:32 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
Dima TТы проверь сначала что это работает, прежде чем сюда писать. Покажи что я должен написать чтобы не иметь обе проблемы: 1. если кликнуть в окно фокса мимо окошка Messagebox() то оно уходит на задний план (за окно фокса) и прога выглядит зависшей 2. окно Messagebox() не должно вылазить в центре экрана поверх всех окон если окно фокса скрыто под другими т.е. поведение окна Messagebox() при вызове с указанием таймаута должно быть такое же как и при вызове его без указания таймаута. Мои сочувствия по поводу нехорошего поведения окон в Windows. Попробуйте написать свой MESSAGEBOX(), под себя. Разумеется, если сумеете - классы. Где-то на Фоксклубе был образец. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2013, 14:13 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
Так хорошо тема шла... Пришел <censored> и в своей обычной манере начал <censored> . ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2013, 14:19 |
|
Принудительное завершение программы
|
|||
---|---|---|---|
#18+
sg12Попробуйте написать свой MESSAGEBOX(), под себя. Достал. Я тебе уже говорил что не надо троллить в чужих топиках. PS Не говори мне что я должен делать и я не скажу куда тебе идти. . ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2013, 14:22 |
|
|
start [/forum/topic.php?fid=41&msg=38213603&tid=1583088]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 272ms |
total: | 422ms |
0 / 0 |