On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 5855
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.05.18 21:33. Заголовок: Вылет из программы...


Всем привет !
Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете) ?
Т.е. хочу сделать сразу после появления MsgBox() вызов 2-3 функций и потом сделать DbCloseAll().
Как это реализовать ?

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

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 19 [только новые]


moderator


Пост N: 1246
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 14.05.18 21:57. Заголовок: Andrey пишет: Как м..


Andrey пишет:

 цитата:
Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете)


изменить стандартный обработчик ошибок. см. Errorsys.prg

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5856
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.05.18 23:55. Заголовок: Haz пишет: изменить..


Haz пишет:

 цитата:
изменить стандартный обработчик ошибок. см. Errorsys.prg



Т.е. нужно будет сделать следующее:
1) Изменить файл MiniGUI\SOURCE\ErrorSys.prg под себя - примерно так:
Скрытый текст

2) Добавить этот файл к себе в проект.

Достаточно этого будет ?

Дело в том, что не всегда на сервере закрываются базы !
Приходиться вручную закрывать открытые базы пользователя.
Не знаю кто оставляет их открытыми: терминалка на хХарборе или МиниГуи.
Но с таким периодически я сталкиваюсь.
Если в качестве сервера юзера пользуются Win ХР, то такое бывает чаще.
А избавиться от ХР никак не получается.

Спасибо: 0 
ПрофильЦитата Ответить
moderator


Пост N: 1248
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 15.05.18 00:12. Заголовок: Andrey пишет: Доста..


Andrey пишет:

 цитата:
Достаточно этого будет ?


Чтоб не писать свой обработчик ошибок. Можно и так.
Этого достаточно.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 795
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 15.05.18 08:44. Заголовок: "Опасные" у..


"Опасные" участки программы обрамить конструкцией
try
catch
MyExitFunction() // вызов моих функций
DbCloseAll() // закрыть все базы
end

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6826
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 15.05.18 09:12. Заголовок: Andrey пишет: И при..


Andrey пишет:

 цитата:
И при выходе из программы, стираю этого пользователя из базы.


Rlock() записи юзера не подходит ? Если вылет , запись разблокируется (надеюсь что так).

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5857
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 15.05.18 12:04. Заголовок: Vlad04 пишет: "..


Vlad04 пишет:

 цитата:
"Опасные" участки программы обрамить конструкцией
try
catch
MyExitFunction() // вызов моих функций
DbCloseAll() // закрыть все базы
end


Это лишнее.
Опасные участки я делаю через такой код примерно:
      BEGIN SEQUENCE  WITH { |e|break( e ) }  
....
RECOVER
....
END SEQUENCE

Этого достаточно.

Dima пишет:

 цитата:
Rlock() записи юзера не подходит ?


Нет, не подходит. Если программа аварийно слетела или ещё какие то причины (не знаю какие) база на сервере (даже Win2008) остаётся открытой, т.е. занятой пользователем. Такое редко на Win2008 бывает. И приходиться вручную через панель администратора закрывать базы, а там штук 60 баз... 60 раз кликов мышки на файл, потом на кнопку закрыть. Работа та ещё.
Или сервер перегрузить нужно, но всех юзеров замучишься по кабинетам обходить и выгонять из подключений к серверу.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5879
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.05.18 18:31. Заголовок: Сделал как посоветов..


Сделал как посоветовал Haz !
Отлично работает !
MyExitFunction() // вызов моих функций - отрабатывает нормально.

Дело в том что у меня главная программа на МиниГуи, через неё вызываю терминальные окна программы
и запоминаю хендлы открытых окон, а при аварийном вылете программы на МиниГуи, закрываю заодно и терминальные окна.
Классно проходит закрытие...
Заодно и пользователя из dbf-журнала пользователей программы (кто в программе) удаляю.

Спасибо за помощь !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5893
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 31.05.18 00:11. Заголовок: Привет всем ! Появил..


Привет всем !
Появился у меня вылет из программы, при сбое соединения с PostgreSQL.
При сбое отправки в PostgreSQL вывожу окно MODAL. А оно не выводиться.
Появляется вот такая ошибка и вылет:
Error MGERROR/0  Release a window in its own ON RELEASE procedure or release the Main Window in any ON RELEASE  
procedure is not allowed. Program terminated.
Called from MSGMINIGUIERROR(0)
Called from RELEASEALLWINDOWS(0)
Called from SHOWERROR(194) in module: Source\ErrorSys.prg
Called from DEFERROR(131) in module: Source\ErrorSys.prg
Called from (b)ERRORSYS(64) in module: Source\ErrorSys.prg
Called from MSGMINIGUIERROR(0)
Called from _ACTIVATEWINDOW(0)
Called from WAIT_WINDOW_MY(308) in module: Source\WaitWin.prg
Called from WAITWINDOWERROR(157) in module: Source\WaitWin.prg
Called from FIELDSTOPGSQLZAIV2(776) in module: Source\form_site.prg
Called from COPYPGSQL3ALGORITM(1275) in module: Source\form_site.prg
.........


Как исправить эту ошибку ? Что нужно делать ?
P.S. ErrorSys.prg добавлен свой, чуть-чуть скорректирован, как Игорь посоветовал.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1827
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 31.05.18 07:09. Заголовок: Andrey Возможно дел..


Andrey
Возможно делаешь CloseAllWindow(), а где то в др. окне в on release\on interactiveclose делаешь вызов ее или Form_?.Release или DoMethod(..., 'Release'), похоже на такой компот ...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5894
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 31.05.18 18:34. Заголовок: SergKis пишет: Возм..


SergKis пишет:

 цитата:
Возможно делаешь CloseAllWindow()


Нет, не делаю.
Ошибка приходит из PostgreSQL, текстовая строка, сделал вывод в отладку - нормально выглядит.
Called from FIELDSTOPGSQLZAIV2(776) in module: Source\form_site.prg
вот кусок кода:
      IF nResultStatus == PGRES_COMMAND_OK 
....
ELSE
cMsg += " - Результат: " + GetResultStatus( nResultStatus, 2 ) + " - "
cMsg += GetResultStatus( nResultStatus, 3 ) + CRLF + CRLF
cMsg += "Файл ошибки: " + cFileNoPath( ChangeFileExt( cFile, ".err" ) ) + CRLF
? VALTYPE(cMsg)
? cMsg
WaitWindowError(cMsg) // строка 776
ENDIF

Функции простые, работают в других местах без сбоев:
Called from WAIT_WINDOW_MY(308) in module: Source\WaitWin.prg
Called from WAITWINDOWERROR(157) in module: Source\WaitWin.prg


А что за ошибки такие, перед ними:
Called from MSGMINIGUIERROR(0)  
Called from RELEASEALLWINDOWS(0)
Called from SHOWERROR(194) in module: Source\ErrorSys.prg
Called from DEFERROR(131) in module: Source\ErrorSys.prg
Called from (b)ERRORSYS(64) in module: Source\ErrorSys.prg
Called from MSGMINIGUIERROR(0)
Called from _ACTIVATEWINDOW(0)
?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1427
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 31.05.18 18:58. Заголовок: Andrey пишет: А что..


Andrey пишет:

 цитата:
А что за ошибки такие, перед ними:
Called from MSGMINIGUIERROR(0)
Called from RELEASEALLWINDOWS(0)
Called from SHOWERROR(194) in module: Source\ErrorSys.prg
Called from DEFERROR(131) in module: Source\ErrorSys.prg
Called from (b)ERRORSYS(64) in module: Source\ErrorSys.prg
Called from MSGMINIGUIERROR(0)
Called from _ACTIVATEWINDOW(0)



Видимо твой подкорректированный Errorsys и есть причина того что "Error MGERROR/0 Release a window in its own ON RELEASE procedure or release the Main Window in any ON RELEASE"

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1828
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 31.05.18 18:58. Заголовок: Andrey пишет А что з..


Andrey пишет
 цитата:
А что за ошибки такие, перед ними:


это стек вызовов в момент ошибки
используй begin sequnce, что бы не падало и вывели тексты не в окно. а в log.


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1829
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.06.18 07:31. Заголовок: Andrey пишет Появляе..


Andrey пишет
 цитата:
Появляется вот такая ошибка и вылет:
Error MGERROR/0 Release a window in its own ON RELEASE procedure or release the Main Window in any ON RELEASE



 цитата:
Нет, не делаю


 
*-----------------------------------------------------------------------------*
FUNCTION _ReleaseWindow ( FormName )
*-----------------------------------------------------------------------------*
...
IF _HMG_ThisEventType == 'WINDOW_RELEASE'
IF GetFormIndex ( FormName ) == _HMG_ThisIndex
MsgMiniGuiError( "Release a window in its own ON RELEASE procedure or release the Main Window in any ON RELEASE procedure is not allowed." )

ENDIF
ENDIF

* If the window to release is the main application window, RELEASE ALL WINDOWS command will be executed

IF GetWindowType ( FormName ) == 'A'

IF _HMG_ThisEventType == 'WINDOW_RELEASE'
MsgMiniGuiError( "Release a window in its own ON RELEASE procedure or release the Main Window in any ON RELEASE procedure is not allowed." )

ELSE
ReleaseAllWindows()
ENDIF

ENDIF
...

т.е. уже находясь в событии release window -> IF _HMG_ThisEventType == 'WINDOW_RELEASE',
выполняется новый release window


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5896
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 01.06.18 10:38. Заголовок: SergKis пишет: т.е...


SergKis пишет:

 цитата:
т.е. уже находясь в событии release window -> IF _HMG_ThisEventType == 'WINDOW_RELEASE',
выполняется новый release window



Да не делаю я нигде WINDOW_RELEASE.
Программа работает нормально. Как приходит ошибка отправки в PostgreSQL, то и появляется эта ошибка.
Поставил вывод в лог-файл и убрал вызов моей функции WaitWindowError(cMsg).
Программа перестала падать.
Значит дело в моей функции WaitWindowError(cMsg), т.е. там не может создать окно.
Вроде делаю всё как обычно... Непонятки одни с этим окном.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1830
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.06.18 11:34. Заголовок: Andrey пишет Непонят..


Andrey пишет
 цитата:
Непонятки одни с этим окном.


STATIC PROCEDURE OnRelease()
ThisWindow.Release
...
если This окно, по какой то причине, Form_Main, то release вызовет RELEASEALLWINDOWS(0),
т.к. окно не проявляется, то вполне может залезть в ситуацию сообщения "Release a window in its own ON RELEASE..."
поставь трассировку по WaitWindowError - куда лезет узнаешь

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5897
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 01.06.18 12:03. Заголовок: SergKis пишет: пост..


SergKis пишет:

 цитата:
поставь трассировку по WaitWindowError - куда лезет узнаешь



Я уже пытался. Подскажи как ?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1831
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.06.18 17:18. Заголовок: Andrey пишет Подска..


Andrey пишет
 цитата:
Подскажи как ?


Пример (на идеи из BASIC\WAIT_WINDOW_2) на событиях без потоков. http://my-files.ru/1ykqd9
Твой WaitWindowError можно сделать аналогично.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1832
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 02.06.18 00:32. Заголовок: PS Если сделать прав..


PS
Если сделать правку, будет нагляднее по окнам
 
FUNCTION StartWait( oWnd, nEvent )
...
LOCAL aWnd := array(4)

WHILE _IsWindowDefined( cWnd := '_w_' + hb_ntos( ++nId ) )
END

cTitle += ' ' + hb_ntos( nId )

aWnd[1] := { nY , nX }
...


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1833
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 02.06.18 09:23. Заголовок: Может будет интересн..


Может будет интересно, пример продолжение http://my-files.ru/gkupot
Добавлен выбор, дублклик в календаре и перенос выбора на wait окна

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 1
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет