Отправлено: 14.05.18 21:33. Заголовок: Вылет из программы...
Всем привет ! Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете) ? Т.е. хочу сделать сразу после появления MsgBox() вызов 2-3 функций и потом сделать DbCloseAll(). Как это реализовать ?
Для чего это нужно, поясню: при входе в свою программу я пишу в базу кто и когда вошел в программу (логин пользователя). И при выходе из программы, стираю этого пользователя из базы. Если программа "вылетает", то юзер числится как работающий. Древнее наследие с клипера, хотел переделать, да так и осталось.
Отправлено: 19.09.21 07:57. Заголовок: Haz пишет Сколько же..
Haz пишет
цитата:
Сколько же переделывать
Может такая переделка быть (поменьше править кода) и берем из _HMG_aControlIds[ k ]
{|ow| myFunc(ow) } FUNCT myFunc(oWnd) LOCAL oBr := This.oBrw.Object // oBrw ... SET WINDOW THIS TO oWnd:Name oBr := This.oBrw.Object SET WINDOW THIS TO
У меня оч редко после исполнения блока терялся алиас и выдавал alias not found и пропадала переменная public . Возможно это и есть сборщик. Проблема решилась частыми вызовами doEvents()
Отправлено: 19.09.21 09:00. Заголовок: Вроде не в тему, а м..
Вроде не в тему, а может и в эту тему - аварийное завершение программы !
Я в программу у себя поставил текстовый файл ловушку ошибки. Т.е. при старте программы создаётся файл ErrDATA+TIME.log если нет ошибки, то при выходе удаляю этот файл.
Смотрю у юзеров куча таких файлов, но внутри нет ошибок. Наверное ВЫХОД из программы делают аварийно, т.е. тупо закрывают сессию терминального сервера. Блин, а можно как то узнать у себя в программе, что юзер тупо закрыл сессию или перегрузил комп ? Т.е. программа завершается аварийно. Что-то на форуме вроде писали об этом, но я не помню.
обрабатывай сообщения (как ты делал WM_COPYDATA) WM_ENDSESSION WM_QUERYENDSESSION
А ещё какие нужно сообщения обрабатывать в своей программе ? Снятие из Диспетчера задачи - это какое сообщение будет ? Кто что использует ? Поделитесь опытом.
Отправлено: 16.11.21 17:24. Заголовок: Сделал тест что прои..
Сделал тест что происходит с программой. Запуск, снятие, закрытие сессии и т.д. Пишет в лог всегда, потом можно смотреть что было с программой и с юзером "бодаться" ! Вроде работает. Что ещё не учёл, посмотрите ? Скрытый текст
/* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2021 Sergej Kiselev <bilance@bilance.lv> * Copyright 2021 Verchenko Andrey <verchenkoag@gmail.com> Dmitrov, Moscow region * * Закрытие программы. Запись в лог-файл * Closing the program. Writing to a log file */ ANNOUNCE RDDSYS
#define _HMG_OUTLOG #define SHOW_TITLE "Closing the program. Writing to a log file"
PROCEDURE MAIN() LOCAL nY, nX, nW, nH, cMsg, cFileLog
SET CODEPAGE TO RUSSIAN SET LANGUAGE TO RUSSIAN SET MSGALERT BACKCOLOR TO { 178, 227, 137 } // for HMG_Alert() DEFINE FONT DlgFont FONTNAME "DejaVu Sans Mono" SIZE 14 // for HMG_Alert() SET FONT TO "DejaVu Sans Mono", 12 SET OOP ON
// Проверка на запуск второй копии программы cMsg := "Попытка запуска второй копии программы !;" cMsg += App.ExeName + ";Отказано в запуске.;" cMsg += _HMG_MESSAGE[4] + ";;" cMsg := AtRepl( ";", cMsg, CRLF ) _HMG_MESSAGE[4] := cMsg SET MULTIPLE OFF WARNING
cFileLog := ChangeFileExt( ExeName(), '.log' ) //fErase( cFileLog ) SET LOGFILE TO &cFileLog ? HB_TSTOSTR( HB_DATETIME() ) , "Launching the program", ProcNL()
// назначить обработчик событий программы в функции App_OnEvents() // assign a program event handler to the App_OnEvents() function SET EVENTS FUNC TO App_OnEvents
DEFINE WINDOW Form_Test ; AT nY, nX WIDTH nW HEIGHT nH ; TITLE MiniGuiVersion() ; ICON "1MAIN_ICO" ; MAIN NOMAXIMIZE NOSIZE ; BACKCOLOR { 178, 227, 137 } ; ON INIT {|| This.Label_1.Setfocus } ; ON RELEASE {|| myExitPrg() } ; ON INTERACTIVECLOSE {|| myExitPrg("[x]") }
////////////////////////////////////////////////////////////////// STATIC FUNCTION myExitPrg(cVal) LOCAL nI, cFileLog := _SetGetLogFile() DEFAULT cVal := ""
//IF ! ThisWindow.Closable For nI := 20 to 1 Step -1 This.Label_1.Value := "Closing a program through " + HB_NtoS(nI) DO EVENTS wApi_Sleep(200) Next //ENDIF
/////////////////////////////////////////////////////////////////// // Обработчик событий программы // этот обработчик вызывается всегда вместо Events(...) FUNCTION App_OnEvents( hHwnd, nMsg, wParam, lParam ) LOCAL cData, nDataID
// это ключ\ID для проверки правильности полученных данных //IF nDataID == APP_ID
// общее событие для вызова из других программ с формы Form_Test //_wPost(111, "Form_Test ", cData) ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_COPYDATA", ProcNL() ; ? "."
RETURN 1 // выполненно nMsg == WM_COPYDATA, обрабатывать nMsg больше не надо
ELSEIF nMsg == WM_ENDSESSION // 22 ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_ENDSESSION", ProcNL() ; ? "." RETURN 1 // выполненно, обрабатывать nMsg больше не надо
ELSEIF nMsg == WM_QUERYENDSESSION // 17 ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_QUERYENDSESSION", ProcNL() ; ? "." RETURN 1 // выполненно, обрабатывать nMsg больше не надо
ELSEIF nMsg == WM_CLOSE // 16 ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_CLOSE", ProcNL() ; ? "." RETURN 1 // выполненно, обрабатывать nMsg больше не надо
ELSEIF nMsg == WM_QUIT // 18 ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_QUIT", ProcNL() ; ? "." RETURN 1 // выполненно, обрабатывать nMsg больше не надо
ELSEIF nMsg == WM_SYSTEMERROR // 23 ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_SYSTEMERROR", ProcNL() ; ? "." RETURN 1 // выполненно, обрабатывать nMsg больше не надо
ELSEIF nMsg == WM_DESTROY // 2 ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_DESTROY", ProcNL() ; ? "." RETURN 1 // выполненно, обрабатывать nMsg больше не надо
ENDIF
RETURN Events( hHwnd, nMsg, wParam, lParam)
А когда прога упадёт по ошибке системной что будет срабатывать ? ELSEIF nMsg == WM_SYSTEMERROR - это будет писаться в лог ?
// это ключ\ID для проверки правильности полученных данных //IF nDataID == APP_ID
// общее событие для вызова из других программ с формы Form_Test //_wPost(111, "Form_Test ", cData) ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_COPYDATA", ProcNL() ; ? "."
и функция выхода из программы изменена для обработки события ON INTERACTIVECLOSE следующим образом:
STATIC FUNCTION myExitPrg(cVal)
LOCAL nI, cFileLog := _SetGetLogFile() DEFAULT cVal := ""
IF Form_Test.Btn_Exit.Enabled Form_Test.Btn_Exit.Enabled := .F. ENDIF
IF Empty( cVal ) For nI := 20 to 1 Step -1 This.Label_1.Value := "Closing a program through " + HB_NtoS(nI) DO EVENTS wApi_Sleep(200) Next ? HB_TSTOSTR( HB_DATETIME() ) , "Closing the program", ProcNL() ; ? "." DbCloseAll() ENDIF
Возможно, обработчик событий должен выглядеть так:
Да в том то и дело, что я не знаю как правильно. Только вчера сделал и тестировал. Нужные выходы юзеров - прога протоколирует в лог. То что и нужно мне было.
А нигде больше такой лог и не видел ни у кого.... Размещайте у себя в библиотеке, может кому понадобиться сейчас или потом.
Отправлено: 17.11.21 12:31. Заголовок: Andrey пишет: А ниг..
Andrey пишет:
цитата:
А нигде больше такой лог и не видел ни у кого....
Application =========== Path and name: E:\FWH\samples\testxbr3.exe (32 bits) Size: 4,393,984 bytes Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20201212) FiveWin version: FWH 20.12 C compiler version: Borland/Embarcadero C++ 7.3 (32-bit) Windows version: 6.2, Build 9200
Time from start: 0 hours 0 mins 3 secs Error occurred at: 17-11-2021, 11:59:46 Error description: Error DBCMD/2001 Workarea not in use: DBSKIP
Stack Calls =========== Called from: => DBSKIP( 0 ) Called from: testxbr3.prg => ADOBRWALLCOLSWIN( 402 ) Called from: testxbr3.prg => (b)MAINMENU( 109 ) Called from: .\source\classes\MENU.PRG => TMENU:COMMAND( 1560 ) Called from: .\source\classes\WINDOW.PRG => TWINDOW:COMMAND( 1141 ) Called from: .\source\classes\MDIFRAME.PRG => TMDIFRAME:COMMAND( 272 ) Called from: => TMDIFRAME:HANDLEEVENT( 0 ) Called from: .\source\classes\WINDOW.PRG => _FWH( 3559 ) Called from: => WINRUN( 0 ) Called from: .\source\classes\WINDOW.PRG => TMDIFRAME:ACTIVATE( 1097 ) Called from: testxbr3.prg => MAIN( 55 )
System ====== CPU type: Intel(R) Core(TM) i7-10870H CPU @ 2.20GHz 2208 Mhz Hardware memory: 16173 megs
Free System resources: 90 % GDI resources: 90 % User resources: 90 %
Windows total applications running: 3 1 , 2 GDI+ Window (testxbr3.exe), C:\WINDOWS\WinSxS\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.22000.318_none_1634a27527742bf 3 HardwareMonitorWindow, E:\FWH\samples\testxbr3.exe
Variables in use ================ Procedure Type Value ========================== DBSKIP Param 1: N 11 Local 1: U Local 2: B {|| ... } ADOBRWALLCOLSWIN Local 1: O Class: TMDICHILD Local 2: O Class: TXBROWSE Local 3: U Local 4: O Class: TOLEAUTO Local 5: O Class: TOLEAUTO Local 6: O Class: TBRUSH (b)MAINMENU Param 1: O Class: TMENUITEM TMENU:COMMAND Param 1: N 20006 Local 1: O Class: TMENU Local 2: O Class: TMENUITEM TWINDOW:COMMAND Param 1: N 20006 Param 2: N 0 Local 1: O Class: TMDIFRAME Local 2: N 0 Local 3: N 20006 Local 4: N 0 Local 5: U TMDIFRAME:COMMAND Param 1: N 20006 Param 2: N 0 Local 1: O Class: TMDIFRAME Local 2: L .F. TMDIFRAME:HANDLEEVENT Param 1: N 273 Param 2: N 20006 Param 3: N 0 _FWH Param 1: N 0 Param 2: N 273 Param 3: N 20006 Param 4: N 0 Param 5: N 1 Local 1: O Class: TMDIFRAME WINRUN Param 1: N 1049798 TMDIFRAME:ACTIVATE Param 1: C "NORMAL" Param 2: U Param 3: U Param 4: U Param 5: U Param 6: U Param 7: U Param 8: U Param 9: U Param 10: U Param 11: U Param 12: U Param 13: U Param 14: U Param 15: U Param 16: U Param 17: U Param 18: U Param 19: U Param 20: L .F. Local 1: O Class: TMDIFRAME Local 2: U Local 3: U MAIN Local 1: O Class: TMDIFRAME Local 2: O Class: TFONT Local 3: O Class: TBRUSH
DataBases in use ================ 1: SM RddName: DBFCDX ============================== RecNo RecCount BOF EOF 1 500 .F. .F.
Indexes in use TagName ID ID UPPER(FIRST) FIRST UPPER(LAST) LAST UPPER(STREET) STREET UPPER(CITY) CITY UPPER(STATE) STATE UPPER(ZIP) ZIP HIREDATE HIREDATE MARRIED MARRIED AGE AGE SALARY SALARY UPPER(NOTES) NOTES
Отправлено: 17.11.21 12:55. Заголовок: Большой в смысле, чт..
Большой в смысле, что ни у кого не видел причину выхода из программы ! Вот так, как сейчас сделано:
2021-11-15 22:40:20.454 Launching the program Call from: MAIN(52) --> demo.prg 2021-11-15 22:40:34.640 Closing the program Call from: MYEXITPRG(101) --> demo.prg . 2021-11-16 17:15:48.704 Launching the program Call from: MAIN(52) --> demo.prg 2021-11-16 17:16:13.468 Event arrived - WM_QUERYENDSESSION Call from: APP_ONEVENTS(142) --> demo.prg . 2021-11-16 17:16:13.730 Event arrived - WM_ENDSESSION Call from: APP_ONEVENTS(138) --> demo.prg . 2021-11-16 17:32:33.815 Launching the program Call from: MAIN(48) --> demo.prg 2021-11-16 17:32:41.487 Closing the program Call from: MYEXITPRG(96) --> demo.prg . 2021-11-17 12:49:00.523 Launching the program Call from: MAIN(48) --> demo.prg 2021-11-17 12:49:11.420 Event arrived - WM_CLOSE Call from: APP_ONEVENTS(141) --> demo.prg
WM_CLOSE - это программа снята через Диспетчер задач WM_ENDSESSION - программа закрыта через перезагрузку компа. Т.е. все эти события, кроме "Closing the program" - не нормальное завершение программы.
Time from start: 0 days 0 hours 1 mins 36 secs Error MGERROR/0 Control: Label_Buff Of Form_Seek Not defined. Program terminated. --------------------------------- Stack Trace --------------------------------- Called from MSGMINIGUIERROR(0) Called from VERIFYCONTROLDEFINED(0) Called from DOMETHOD(0) Called from (b)FORMA_FILTER(918) in module: Source\Tbrw_fFind.prg Called from _DOCONTROLEVENTPROCEDURE(0) Called from EVENTS(0) Called from MYEVENTSHANDLER(1729) in module: Source\main.prg Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0) Called from FORMA_FILTER(1167) in module: Source\Tbrw_fFind.prg Called from MYFINDEDIT(729) in module: Source\Tbrw_fFind.prg Called from (b)CREATEBROWSEFIND(560) in module: Source\Tbrw_fFind.prg Called from TSBROWSE:KEYDOWN(0) Called from TSBROWSE:HANDLEEVENT(0) Called from EVENTS(0)
Окно Form_Seek теряется совсем после вызова другого MODAL окна ...
Отправлено: 21.06.22 11:25. Заголовок: Andrey пишет Окно Fo..
Andrey пишет
цитата:
Окно Form_Seek теряется совсем после вызова другого MODAL окна ...
Надо исп. в модальных окнах _HMG_InplaceParentHandle := hWnd // hWnd - окна родителя ... // после action модального окна _HMG_InplaceParentHandle := 0 иначе у modal окна родитель будет main window (default и вероятно фокус убегает на него)
Dima пишет
цитата:
Делай проверку
Этого мало в большой программе, надо исп. события, т.к. например код
не дает завершится процедуре ACTION WINDOW Form_Seek нормальным образом (блок ON INIT это часть ACTION WINDOW ... после него еще есть код для завершения и он работает). т.е. лучше
Отправлено: 26.07.22 18:36. Заголовок: Опять проблема в про..
Опять проблема в проге МиниГуи и Windows Server 2008 R2 6.1 SP1 - опять вылет, на том же самом сервере. Причем интересно, одна и таже прога эксплуатируется на нескольких WinServer 2008 и 2012. На 2012 проблемы нет, а на 2008 проблема есть. Причем используется процессоры Xeon. На одном сервере эта проблема и есть (хотя сервер фирменный PROLIANT), на другом такой же проц, только попроще - проблема тоже есть, подвисание, а потом вылет. Прога на МиниГуи, большая (26Мб ехе-ник) открывает 3 окона MODAL, в последнем окне справочник улиц. Если выбирать улицу стрелками, то прога не вешается, а если начинаем поиск по буквам, то первый выбор не вешается, а второй вешается прога. Окно нормально закрывается, НО возврат на второе окно MODAL не происходит, идёт вылет - пишет нет объекта на форме. Окно на экране - а прога пишет нет такого окна ! Блин фигня какая то.... Что делать - непонятно... Вот такие окна в проге: Месяц назад исправил ошибку, работало нормально - не вылетало, а сейчас опять вылетает... Можно и дальше убрать вылет окна, но это не решение ! ТЕРЯЕТСЯ ОКНО 2 после выбора из справочника в 3-окне. Как это предотвратить ?
Отправлено: 30.01.23 14:00. Заголовок: Опять глюги в програ..
Опять глюги в программе у меня. Вылет из программы и 2-3 окна "Программа уже запущена"
У меня нет нигде в коде такого сообщения. Наверное берётся системное сообщение из МиниГуи. Поискал и не нашёл.... Непонятно - КАКАЯ ПРОГРАММА уже запущена ? 1) Может стоит добавить строку в это окно, откуда уже запущена программа, в сам МиниГуи ? Типа такого - ProcNL() + CRLF + ProcNL(1)
2) Вот мой код:
IF _IsWindowDefined("Form_Card") DoMethod("Form_Card", "SetFocus") ELSE aForm := HMG_GetForms() // все открытые окна cTekForm := ThisWindow.Name // строка 54 aFormHide := {} ? "---> Start card:", cTekForm, ProcNL() DO EVENTS ; hb_gcAll() ; DO EVENTS ; wApi_Sleep(50) // запустить "сборщик мусора"
FOR nI := 1 TO Len(aForm) cForm := UPPER(aForm[nI]) ? nI, cForm, _HMG_aFormType[nI], _HMG_aFormHandles[nI], _HMG_aFormDeleted[nI] ?? "Visible=", IsWindowVisible( GetFormHandle( cForm ) ) ?? GetProperty( cForm, "Visible" ) IF cForm == UPPER(cTekForm) ; LOOP ENDIF lHide := .T. IF AT("FORM_WIN", cForm) == 0 AADD(aFormHide, cForm ) ELSE lHide := .F. ENDIF .... .... DEFINE WINDOW Form_Card ; ..... END WINDOW
ACTIVATE WINDOW Form_Card
DO EVENTS ; hb_gcAll() ; DO EVENTS ; wApi_Sleep(50) // запустить "сборщик мусора"
FOR nI := 1 TO Len(aFormHide) cForm := aFormHide[nI] IF _IsWindowDefined(cForm) ; DoMethod(cForm, "Show") ENDIF NEXT
SwitchToWin( cTekForm ) // переключить на тек.форму
Отправлено: 28.02.23 17:22. Заголовок: Перешёл на новую вер..
Перешёл на новую версию - Harbour MiniGUI Extended Edition 23.02 (Update 1) До этого было - Harbour MiniGUI Extended Edition 22.12 (Update 2) Пересобрал свою большую прогу и установил только у ОДНОГО юзера... И поехало в первый же день... Прога вываливатся там где всегда работала. Фигня получается... Система WinServer 2008. Ошибки не постоянные, то вылетает то нет.
Все даты в формате GMT
3 час. Хитов сегодня: 0
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет