Автор | Сообщение |
|
| постоянный участник
|
Пост N: 5855
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.05.18 21:33. Заголовок: Вылет из программы...
Всем привет ! Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете) ? Т.е. хочу сделать сразу после появления MsgBox() вызов 2-3 функций и потом сделать DbCloseAll(). Как это реализовать ? Для чего это нужно, поясню: при входе в свою программу я пишу в базу кто и когда вошел в программу (логин пользователя). И при выходе из программы, стираю этого пользователя из базы. Если программа "вылетает", то юзер числится как работающий. Древнее наследие с клипера, хотел переделать, да так и осталось.
|
|
|
Ответов - 173
, стр:
1
2
3
4
5
6
7
8
9
All
[только новые]
|
|
|
| |
Пост N: 1246
Зарегистрирован: 20.02.11
|
|
Отправлено: 14.05.18 21:57. Заголовок: Andrey пишет: Как м..
Andrey пишет: цитата: | Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете) |
| изменить стандартный обработчик ошибок. см. Errorsys.prg
|
|
|
|
| постоянный участник
|
Пост N: 5856
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.05.18 23:55. Заголовок: Haz пишет: изменить..
Haz пишет: цитата: | изменить стандартный обработчик ошибок. см. Errorsys.prg |
| Т.е. нужно будет сделать следующее: 1) Изменить файл MiniGUI\SOURCE\ErrorSys.prg под себя - примерно так: Скрытый текст
STATIC PROCEDURE ShowError( cErrorMessage, oError ) *-----------------------------------------------------------------------------* STATIC _lShowError := .T. IF _lShowError _lShowError := .F. #ifdef _TSBROWSE_ _TSB_aControlhWnd := {} #endif MsgStop( iif( _lShowDetailError(), cErrorMessage, ErrorMessage( oError ) ), 'Program Error', NIL, .F. ) ErrorLevel( 1 ) MyExitFunction() // вызов моих функций DbCloseAll() // закрыть все базы ReleaseAllWindows() ENDIF RETURN
| 2) Добавить этот файл к себе в проект. Достаточно этого будет ? Дело в том, что не всегда на сервере закрываются базы ! Приходиться вручную закрывать открытые базы пользователя. Не знаю кто оставляет их открытыми: терминалка на хХарборе или МиниГуи. Но с таким периодически я сталкиваюсь. Если в качестве сервера юзера пользуются Win ХР, то такое бывает чаще. А избавиться от ХР никак не получается.
|
|
|
|
| |
Пост N: 1248
Зарегистрирован: 20.02.11
|
|
Отправлено: 15.05.18 00:12. Заголовок: Andrey пишет: Доста..
Andrey пишет: Чтоб не писать свой обработчик ошибок. Можно и так. Этого достаточно.
|
|
|
|
| постоянный участник
|
Пост N: 795
Зарегистрирован: 13.10.05
|
|
Отправлено: 15.05.18 08:44. Заголовок: "Опасные" у..
"Опасные" участки программы обрамить конструкцией try catch MyExitFunction() // вызов моих функций DbCloseAll() // закрыть все базы end
|
|
|
|
| |
Пост N: 6826
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.05.18 09:12. Заголовок: Andrey пишет: И при..
Andrey пишет: цитата: | И при выходе из программы, стираю этого пользователя из базы. |
| Rlock() записи юзера не подходит ? Если вылет , запись разблокируется (надеюсь что так).
|
|
|
|
| постоянный участник
|
Пост 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 раз кликов мышки на файл, потом на кнопку закрыть. Работа та ещё. Или сервер перегрузить нужно, но всех юзеров замучишься по кабинетам обходить и выгонять из подключений к серверу.
|
|
|
|
| постоянный участник
|
Пост N: 5879
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.05.18 18:31. Заголовок: Сделал как посоветов..
Сделал как посоветовал Haz ! Отлично работает ! MyExitFunction() // вызов моих функций - отрабатывает нормально. Дело в том что у меня главная программа на МиниГуи, через неё вызываю терминальные окна программы и запоминаю хендлы открытых окон, а при аварийном вылете программы на МиниГуи, закрываю заодно и терминальные окна. Классно проходит закрытие... Заодно и пользователя из dbf-журнала пользователей программы (кто в программе) удаляю. Спасибо за помощь !
|
|
|
|
| постоянный участник
|
Пост 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 добавлен свой, чуть-чуть скорректирован, как Игорь посоветовал.
|
|
|
|
| постоянный участник
|
Пост N: 1827
Зарегистрирован: 17.02.12
|
|
Отправлено: 31.05.18 07:09. Заголовок: Andrey Возможно дел..
Andrey Возможно делаешь CloseAllWindow(), а где то в др. окне в on release\on interactiveclose делаешь вызов ее или Form_?.Release или DoMethod(..., 'Release'), похоже на такой компот ...
|
|
|
|
| постоянный участник
|
Пост 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) ?
|
|
|
|
| постоянный участник
|
Пост 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"
|
|
|
|
|
| постоянный участник
|
Пост N: 1828
Зарегистрирован: 17.02.12
|
|
Отправлено: 31.05.18 18:58. Заголовок: Andrey пишет А что з..
Andrey пишет цитата: | А что за ошибки такие, перед ними: |
| это стек вызовов в момент ошибки используй begin sequnce, что бы не падало и вывели тексты не в окно. а в log.
|
|
|
|
| постоянный участник
|
Пост 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
|
|
|
|
| постоянный участник
|
Пост 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), т.е. там не может создать окно. Вроде делаю всё как обычно... Непонятки одни с этим окном.
|
|
|
|
| постоянный участник
|
Пост 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 - куда лезет узнаешь
|
|
|
|
| постоянный участник
|
Пост N: 5897
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.06.18 12:03. Заголовок: SergKis пишет: пост..
SergKis пишет: цитата: | поставь трассировку по WaitWindowError - куда лезет узнаешь |
| Я уже пытался. Подскажи как ?
|
|
|
|
| постоянный участник
|
Пост N: 1831
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.06.18 17:18. Заголовок: Andrey пишет Подска..
Andrey пишет Пример (на идеи из BASIC\WAIT_WINDOW_2) на событиях без потоков. http://my-files.ru/1ykqd9 Твой WaitWindowError можно сделать аналогично.
|
|
|
|
| постоянный участник
|
Пост 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 } ...
|
|
|
|
| постоянный участник
|
Пост N: 1833
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.06.18 09:23. Заголовок: Может будет интересн..
Может будет интересно, пример продолжение http://my-files.ru/gkupot Добавлен выбор, дублклик в календаре и перенос выбора на wait окна
|
|
|
|
| постоянный участник
|
Пост N: 6924
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.03.21 15:21. Заголовок: Так я и не разобралс..
Так я и не разобрался с падением программы, другое пришлось делать. Вот такая ошибка у меня периодически у некоторых юзеров возникает: Time from start: 0 days 1 hours 45 mins 36 secs Error MGERROR/0 ACTIVATE WINDOW: activate windows within an ON RELEASE window procedure is not allowed. Program terminated. --------------------------------- Stack Trace --------------------------------- Called from MSGMINIGUIERROR(100) in module: h_error.prg Called from _ACTIVATEWINDOW(1311) in module: h_windows.prg Called from WAIT_WINDOW_MY(354) in module: Source\WaitWin.prg Called from WAITWINDOWERROR(171) in module: Source\WaitWin.prg Called from SITEDBFLOG(1093) in module: Source\form_site.prg Called from COPYPGSQL3ALGORITM(1293) in module: Source\form_site.prg Called from PGSQL3ALGORITM(1259) in module: Source\form_site.prg Called from ZAIVKAONERECNO(372) in module: Source\Tbrw_table01.prg Called from FCARDSITE(325) in module: Source\Tbrw_table01.prg Called from (b)SHOW_CARD(258) in module: Source\Tbrw_fCard.prg Called from _DOWINDOWEVENTPROCEDURE(1936) in module: h_windows.prg Called from EVENTS(3730) in module: h_events.prg Called from MYEVENTSHANDLER(1500) in module: Source\main.prg Called from DOEVENTS(0) Called from COPYPGSQL3ALGORITM(1326) in module: Source\form_site.prg Called from PGSQL3ALGORITM(1259) in module: Source\form_site.prg Called from ZAIVKAONERECNO(372) in module: Source\Tbrw_table01.prg Called from FCARDSITE(325) in module: Source\Tbrw_table01.prg Вижу что что-то сбоит в PostgreSQL, а появление окна с ошибкой нет. Вылетает по ON RELEASE window procedure is not allowed Куда можно поставить свою отладку ? И как понять из-за чего свалилась программа ?
|
|
|
Ответов - 173
, стр:
1
2
3
4
5
6
7
8
9
All
[только новые]
|
|