powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Принудительное завершение программы
25 сообщений из 60, страница 2 из 3
Принудительное завершение программы
    #38212120
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В свое время долгие мучения на тему юзера, который "забыл" выключиться привели к простому решению при условии не-архи-критичности ещенощной индексации:
"забыл" выключиться - остался без ужина!
2-3 "резонансных" случая на контору - и никаких проблем уже десяток лет...
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38212122
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
е ж енощной... сорри...
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38212125
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvДавайте опишем стратегию, а не реализацию. К реализации перейдем после понимания того что, когда и где надо делать.
Что ж, давайте попробуем. В принципе, ответ Вам уже дали:Dima TДумаю стандартного решения у этой проблемы нет, на это надо заранее закладываться. Например в каждой форме предусмотреть метод, вызвав который
форма без вопросов закроется. И вызывать этот метод при автозакрытии.
Теперь подробнее. Это вроде уже есть:
MaestroEvВ программе есть таймер. Раз в десять минут проверяет время - если время больше установленного для выхода - пытается завершить программу.
Во-первых, надо ставить (программно, вручную) некий индикатор "требуется завершение программы". У меня создается файлик в общей
рабочей папке на сервере и основная форма по таймеру проверяет раз в 30 минут его наличие. Если появился - сообщение (содержимое этого txt-файлика, т.е. текст сообщения можно менять при создании) всем активным юзерам и блокировка запуска для новых юзеров.
Одновременно включается признак "принудительного завершения" - глобальная переменная=.T. Есть еще переменная, соответствующая
"уровню формы". Она не дает закрыться родительской форме, пока не закрыты все дочерние.
Таймеров должно быть несколько - на каждую форму. Код Timer() примерно такой:

Код: plsql
1.
2.
3.
4.
IF gnLevel=3 AND glExit
*  Thisform.cmdSave.Click()    && в некоторых формах этого нет, не нужно
  Thisform.cmdExit.Click()
ENDIF


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

М-да, получилось как-то сумбурно и не подробно (всего сейчас просто не помню), но идея, я думаю, понятна.
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38212278
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvЧто ж мы сразу то или убить пользователя или убить процесс.

Ладно, упростим задачу. Выключить надо не резко, а в принципе. Ночь большая. Выключить и все. Дождаться всех незавершенных циклов если есть и выключить так как это бы сделал юзер последовательно закрывая все окошки и нажав <выход>.

Серверу утром нужен монопольный режим и у нас вся ночь на выход из программы.
Давайте опишем стратегию, а не реализацию. К реализации перейдем после понимания того что, когда и где надо делать.
Готового решения у меня нет, не было необходимости такую задачу решать. Ниже по какому бы пути я пошел решая эту задачу.

Без убивания процесса тут никак, но это крайняя мера, поэтому я бы так сделал:
первым запускается этот же EXE c параметрами
Код: sql
1.
2.
lcPid = alltrim(str(_vfp.ProcessId))
run /n My.exe kill &lcPid


Новый сразу получает хэндл по 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.
on shutdown
clear events
quit


Тут возможно появление ошибок в Destroy() объектов которые существуют на этот момент.

PS Ну и писать лог всех действий таймера и все вызовы код из таймера обернуть в TRY ... CATCH
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38212631
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНапример если вышел MessageBox то ничего ты с ним программно не сделаешь. А так:
Код: plsql
1.
KEYBOARD '{ENTER}' PLAIN CLEAR

Главное, чтобы messagebox был правильно настроен (нужная кнопка по умолчанию).
Dima TЕще надо как-то определять что открыт REPORT на предпросмотр, тут ничего не подскажу, не разбирался ни разу с этим вопросом.
Закрыть репорт можно попробовать с помощью KEYBOARD "CTRL+W" Тоже не проблема:
Код: plsql
1.
2.
3.
4.
5.
6.
IF WEXIST('Print Preview')
  Release Window "Print Preview"
ENDIF
IF WEXIST('Предварительный просмотр')
  Release Window "Предварительный просмотр"
ENDIF
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38212677
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jonny540Dima TНапример если вышел MessageBox то ничего ты с ним программно не сделаешь. А так:
Код: plsql
1.
KEYBOARD '{ENTER}' PLAIN CLEAR

Главное, чтобы messagebox был правильно настроен (нужная кнопка по умолчанию).
Тоже такая мысль появилась, правда после того как запостил. Что касается кнопки по умолчанию: MessageBox еще на кнопки "Д", "Н" и т.д. реагирует, буквы на кнопках подчеркнуты. Тут только возникает вопрос как из таймера определить что на экране MessageBox() висит? Ну и убедиться что сработает таймер в этот момент, а не будет ждать пока пользователь что-нибудь ответит.

Тема неизученная, надо просто протестить все подозрительные варианты и придумать их обработку.
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38212722
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТут только возникает вопрос как из таймера определить что на экране MessageBox() висит?В этом все и дело. Пока не приходилось проверять, надо попробовать.
А вообще-то неплохо бы в программе предусмотреть, когда выдавать мессбокс, а когда нет.Dima TНу и убедиться что сработает таймер в этот момент в этот момент, а не будет ждать пока пользователь что-нибудь ответитТут проще - если "маячок" горит, значит пользователь уже ушел от нас и ничего он уже никогда никому не ответит
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38212760
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEv,

И еще: принудительное корректное закрытие приложения - штука довольно мозгоемкое (так и просится другое слово ),
особенно если много всяких форм, отчетов и т.д. Если ты этого действительно хочешь - флаг в руки и барабан на шею. Чем можем - поможем.
Чем унифицированней формы, кнопки, код... - тем лучше. Если неохота этим заниматься - то 14133592
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38212767
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jonny540Dima TТут только возникает вопрос как из таймера определить что на экране MessageBox() висит?В этом все и дело. Пока не приходилось проверять, надо попробовать.
А вообще-то неплохо бы в программе предусмотреть, когда выдавать мессбокс, а когда нет.Dima TНу и убедиться что сработает таймер в этот момент в этот момент, а не будет ждать пока пользователь что-нибудь ответитТут проще - если "маячок" горит, значит пользователь уже ушел от нас и ничего он уже никогда никому не ответит


Вопрос вообще-то по другому стоит
MaestroEvСерверу утром нужен монопольный режим и у нас вся ночь на выход из программы.
т.е. пользователь в конце рабочего дня встал, оделся и ушел, точнее свалил по-быстрому забыв закрыть прогу и выключить комп. Прога может и на MessageBox`е остаться открыта. В любом состоянии может остаться.

Твой "маячок" вообще бесполезен если за компом никого нет и ничего в проге не делается. Ты же исходишь из того что пользователь своей активностью запустит проверку "маячка", а дальше отработает нужный тебе код. А тут нет пользователя.
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38212782
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jonny540Если неохота этим заниматься - то 14133592
Не всегда возможно. Если ты сторонний разработчик, то может появиться доминирующее мнение "это не мы криворукие, это разработчик прогу корявую написал". Особенно если местный админ забывает прогу закрывать и комп выключать.
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38212823
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТвой "маячок" вообще бесполезен если за компом никого нет и ничего в проге не делается. Ты же исходишь из того что пользователь своей активностью
запустит проверку "маячка", а дальше отработает нужный тебе код. А тут нет пользователя.
А юзер и не нужен, если есть таймер. Messagebox великолепно удаляется и без юзера, только что проверил.
А "маячок" зажигается админом приложения и от юзера уже мало зависит, сохранится и завершится и без него :) 14133599
Во всяком случае у меня эта схема работает довольно давно без каких либо сложностей.

ЗЫ То, что коряво ее описал, это другой вопрос.
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38212833
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное вот что забыл сказать: маячок зажигается с любой доступной машины в сети, вход с паролем админа приложения.
И все, таймер затикал, все остальные могут собирать манатки...
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38212990
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540Messagebox великолепно удаляется и без юзера

У Messagebox() есть параметр таймаут (как-бы нет смысла в висении его часами)
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38213181
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XAndyУ Messagebox() есть параметр таймаут (как-бы нет смысла в висении его часами)Это не всегда удобно, если юзер все-таки еще не совсем ушел (скажем, покурить).
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38213202
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XAndyJonny540Messagebox великолепно удаляется и без юзера

У Messagebox() есть параметр таймаут (как-бы нет смысла в висении его часами)

Есть такое, я сначала даже начал пользоваться, только потом выяснилось что при указании таймаута возникает нездоровый побочный эффект - если кликнуть мимо окошка Messagebox() то он уходит на задний план (за окно фокса) и прога выглядит зависшей. Можно конечно задать поверх всех окон (+4096 во втором параметре), тогда оно вылазит в центре экрана даже если окно самой проги скрыто под другими, что тоже не очень хорошо.
А без таймаута все нормально, окошко в центре окна фокса, за него не прячется и поверх других не лезет

Не знаю почему такая багофича у разработчиков фокса получилась, но моим пользователям это сильно не понравилось. Пришлось отказаться от ее использования.
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38213237
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jonny540Dima TТвой "маячок" вообще бесполезен если за компом никого нет и ничего в проге не делается. Ты же исходишь из того что пользователь своей активностью
запустит проверку "маячка", а дальше отработает нужный тебе код. А тут нет пользователя.
А юзер и не нужен, если есть таймер. Messagebox великолепно удаляется и без юзера, только что проверил.
А "маячок" зажигается админом приложения и от юзера уже мало зависит, сохранится и завершится и без него :) 14133599
Во всяком случае у меня эта схема работает довольно давно без каких либо сложностей.

ЗЫ То, что коряво ее описал, это другой вопрос.
Тут ты опять от темы отходишь. Вопрос ведь стоит "как закрыть", а "не как определить момент закрытия". Мы с тобой о разных вещах говорим. Я о "как закрыть".
Пусть MaestroEv сам решает какой из вопросов его интересует.

PS Кстати про программное определение того что MessageBox() висит ты ничего не написал :)
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38213385
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TМы с тобой о разных вещах говорим. Я о "как закрыть" Я тоже.

Dima TPS Кстати про программное определение того что MessageBox() висит ты ничего не написал :)Писал уже:Jonny540 Dima TТут только возникает вопрос как из таймера определить что на экране MessageBox() висит?В этом все и дело. Пока не приходилось проверять, надо попробовать.
А вообще-то неплохо бы в программе предусмотреть, когда выдавать мессбокс, а когда нет.Пока не пробовал еще, м.б. завтра :)

И, действительно, пусть ТС решает, а то он что-то молчит. :) Ладно, пусть пока переваривает советы.
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38213603
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jonny540И, действительно, пусть ТС решает, а то он что-то молчит.
Спит он уже. У него часовой пояс Москва+6 часов :)
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38213687
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tпотом выяснилось что при указании таймаута возникает нездоровый побочный эффект - если кликнуть мимо окошка Messagebox() то он уходит на задний план (за окно фокса) и прога выглядит зависшей. Можно конечно задать поверх всех окон (+4096 во втором параметре), тогда оно вылазит в центре экрана даже если окно самой проги скрыто под другими

Вот как, не знал (пользуюсь своим Messagebox'ом)
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38214117
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TXAndyпропущено...


У Messagebox() есть параметр таймаут (как-бы нет смысла в висении его часами)

Есть такое, я сначала даже начал пользоваться, только потом выяснилось что при указании таймаута возникает нездоровый побочный эффект - если кликнуть мимо окошка Messagebox() то он уходит на задний план (за окно фокса) и прога выглядит зависшей. Можно конечно задать поверх всех окон (+4096 во втором параметре), тогда оно вылазит в центре экрана даже если окно самой проги скрыто под другими, что тоже не очень хорошо.
А без таймаута все нормально, окошко в центре окна фокса, за него не прячется и поверх других не лезет

Не знаю почему такая багофича у разработчиков фокса получилась, но моим пользователям это сильно не понравилось. Пришлось отказаться от ее использования.

Это не "багофича", а так задумано. Разумеется, если проверять в реальных кодах.

Из хелпа:
MESSAGEBOX() возвращает значение -1, когда происходит задержка времени.
В этом и суть - в нужных случаях это значение можно обрабатывать программно и без ваших "пользователей".

MESSAGEBOX() это не только фоксовская функция:
#DEFINE MB_APPLMODAL 0x0 && пользователь может перемещаться в окнах других прикладных программ и работать в этих окнах.
#DEFINE MB_SYSTEMMODAL 0x1000 && чтобы уведомлять пользователя о серьезных, потенциально опасных ошибках, которые требуют немедленного внимания
#DEFINE MB_TASKMODAL 0x2000 && вызывающая прикладная программа или библиотека не имеют доступного дескриптора окна, но все еще должны сохранять вводимые данные для других окон в текущей прикладной программе

ЗЫ. Вам впору уже свои идеи патентовать ...
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38214122
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЧасть 1. Пробуем закрыть средствами проги
берем _screen.activeform или если нет такой первую попавщуюся из коллекции _vfp.forms()


Интересно, если подробнее ... как вы ловите свою "первую попавщуюся".
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38214204
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12Это не "багофича", а так задумано. Разумеется, если проверять в реальных кодах.
MSDN сам переводил или скопипастил у кого?

Ты проверь сначала что это работает, прежде чем сюда писать. Покажи что я должен написать чтобы не иметь обе проблемы:
1. если кликнуть в окно фокса мимо окошка Messagebox() то оно уходит на задний план (за окно фокса) и прога выглядит зависшей
2. окно Messagebox() не должно вылазить в центре экрана поверх всех окон если окно фокса скрыто под другими
т.е. поведение окна Messagebox() при вызове с указанием таймаута должно быть такое же как и при вызове его без указания таймаута.
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38214411
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТы проверь сначала что это работает, прежде чем сюда писать. Покажи что я должен написать чтобы не иметь обе проблемы:
1. если кликнуть в окно фокса мимо окошка Messagebox() то оно уходит на задний план (за окно фокса) и прога выглядит зависшей
2. окно Messagebox() не должно вылазить в центре экрана поверх всех окон если окно фокса скрыто под другими
т.е. поведение окна Messagebox() при вызове с указанием таймаута должно быть такое же как и при вызове его без указания таймаута.

Мои сочувствия по поводу нехорошего поведения окон в Windows.
Попробуйте написать свой MESSAGEBOX(), под себя.
Разумеется, если сумеете - классы.
Где-то на Фоксклубе был образец.
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38214428
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так хорошо тема шла... Пришел <censored> и в своей обычной манере начал <censored> .
...
Рейтинг: 0 / 0
Принудительное завершение программы
    #38214436
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12Попробуйте написать свой MESSAGEBOX(), под себя.
Достал. Я тебе уже говорил что не надо троллить в чужих топиках.

PS Не говори мне что я должен делать и я не скажу куда тебе идти. .
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 2 из 3
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Принудительное завершение программы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]