Форум » GUI » Вылет из программы... » Ответить

Вылет из программы...

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

Ответов - 173, стр: 1 2 3 4 5 6 7 8 9 All

gfilatov2002: Andrey пишет: Прога вываливатся там где всегда работала. Andrey Единственное, что приходит в голову, это - замена Харбора из поставки сборки 23.02 на Харбор из сборки 22.12 Надеюсь, это поможет решить проблему...

Andrey: gfilatov2002 пишет: Единственное, что приходит в голову, это - замена Харбора из поставки сборки 23.02 на Харбор из сборки 22.12 Спасибо ! Попробую.

Andrey: Блин, опять полная У заказчика прога на МиниГуи стала очень медленно работать... Комп быстрый, у заказчика, система Win10. Таблицы строит быстро, а вот при открытие карточки (показ одной записи) - очень медленно 30-50 секунд. У меня открывается за 1-5 секунд. В чем может быть проблема ?


Andrey: Установил новую версию - 23.02 (Update 4) Примеры собираются и работают, а моя большая система собирается и сразу вылетает !!! Предыдущая версия - 23.01 (Release) работает без проблем. Вылет такой: [pre2]Error BASE/1004 Message not found: TWNDDATA:EVENT Args: [1] = O TWNDDATA --------------------------------- Stack Trace --------------------------------- Called from __ERRRT_SBASE(0) Called from TWNDDATA:ERROR(0) Called from (b)HBOBJECT(0) Called from TWNDDATA:MSGNOTFOUND(0) Called from TWNDDATA:EVENT(0) Called from MAIN(205) in module: Source\main.prg [/pre2] Код простой: [pre2] DEFINE WINDOW Form_Main ; AT 0,0 WIDTH 640 HEIGHT 480 ; TITLE cTitle ICON cIcon ; MAIN NOSHOW ; NOMAXIMIZE NOSIZE NOCAPTION ; ON INIT { || DoEvents(), _wPost(0) } ; ON INTERACTIVECLOSE { || IIF( lStaticErrorClose, MyExit(), Nil ) } ? PROCNL(), "внутри DEFINE WINDOW Form_Main" ..... WITH OBJECT This.Object :Event( 0, {| | _logfile(.t.,"----[ Событие 0 ]--- " + ProcNL() ) ,; MsgInfo("Запуск события 0"), MyInitForm() } ) // строка 205 ..... END WINDOW Form_Main.Timer_1.Enabled := .F. // ОТКЛЮЧИТЬ таймер ? PROCNL(), "_DefineSplashWindow()" _DefineSplashWindow( "Form_Splash",,,,, "SPLASH", 10, {|| IIF( !lStaticErrorClose, Addition_MainForms(), Nil ) } ) ACTIVATE WINDOW Form_Splash, Form_Main Return Nil[/pre2] И ПЕРЕСТАЛА работать _DefineSplashWindow(...), так как прога сразу идёт на ON INIT { || DoEvents(), _wPost(0) } Как это исправить ? Вот логи запуска программы: в старой версии прога запускается и _DefineSplashWindow() отрабатывает. [pre2] Вызов из: MAIN(178) --> Source\main.prg внутри DEFINE WINDOW Form_Main Вызов из: MAIN(230) --> Source\main.prg _DefineSplashWindow() Вызов из: _DEFINESPLASHWINDOW(266) --> Source\main.prg Вызов из: _SPLASHDELAY(334) --> Source\main.prg и т.д. [/pre2] А в новой версии (23.02-4) вот так: [pre2] Вызов из: MAIN(161) --> Source\main.prg M->aRunCheck= ARRAY[23] Вызов из: MAIN(167) --> Source\main.prg .F. Вызов из: MAIN(178) --> Source\main.prg внутри DEFINE WINDOW Form_Main ====================> ОШИБКА при завершении программы ! MyExitError() <===== Error BASE/1004 Message not found: TWNDDATA:EVENT Args: [1] = O TWNDDATA Called from __ERRRT_SBASE(0) Called from TWNDDATA:ERROR(0) Called from (b)HBOBJECT(0) Called from TWNDDATA:MSGNOTFOUND(0) Called from TWNDDATA:EVENT(0) Called from MAIN(206) in module: Source\main.prg[/pre2] Не доходит до функции _DefineSplashWindow(), просто вылетает с ошибкой !

Andrey: Беру в папку C:\MiniGUI (с версией 23.02-4) записываю папку Harbour от версии 23.01 Проект собирается и работает. Блин и что за фигню сделали в этой версии Харбора ? 2 дня геморроя и проблема частично решена. А как быть в дальнейшем ?

gfilatov2002: Andrey пишет: что за фигню сделали в этой версии Харбора ? Из списка изменений Харбора следует, что были сделаны важные изменения и оптимизации в ядре виртуальной машины и была затронута функция AClone(). Также был расширен обработчик ошибок xhb_ErrorNew в библиотеке xHB и почищен модуль symbol range checking для классов Харбора. Что именно так повлияло на твою программу, остается только догадываться

Andrey: Спасибо БОЛЬШОЕ ! Я забыл уточнить, что использую BCC 5.5 ! Может из-за этого облом происходит. Не могу перейти на BCC 5.8 - иконки на менюшках не те отображаются. Уже и от ошибок всех избавился, всё равно иконки не те отображаются, которые должны быть.

Andrey: Рано радовался. На новой версии 23.04 (Release) прога при старте "вылетает"... Выдаёт такую ошибку: [pre2]Error BASE/1004 Message not found: TWNDDATA:EVENT Args: [1] = O TWNDDATA Called from __ERRRT_SBASE(0) Called from TWNDDATA:ERROR(0) Called from (b)HBOBJECT(0) Called from TWNDDATA:MSGNOTFOUND(0) Called from TWNDDATA:EVENT(0) Called from MAIN(204) in module: Source\main.prg [/pre2] Вот код программы: [pre2] SET EVENTS FUNCTION TO MyEventsHandler // проверка версии программы DEFINE WINDOW Form_Main ; MAIN NOSHOW ; .... // общее событие для вызова из других программ :Event(111, {|ow,xPar,cdata| ; cdata := hb_defaultValue(cdata, "") ,; _logfile(.t.,"----[ Событие 111 ]--- " + ProcNL() ) ,; _logfile(.t.," ow=",ow,"xPar=",xPar,"cdata=",cdata ) ,; _logfile(.t.," ow:Name",ow:Name,"ow:Handle",ow:Handle ) ,; OnWmCopyData(cData) } ) // строка 204 .... // Обработчик событий программы FUNCTION MyEventsHandler( hHwnd, nMsg, wParam, lParam ) LOCAL cData, nDataID IF nMsg == WM_COPYDATA cData := GetMessageData( lParam, @nDataID ) DO EVENTS // общее событие для вызова из других программ с формы Form_Main _wPost(111, "Form_Main", cData) RETURN 1 // выполненно nMsg == WM_COPYDATA, обрабатывать nMsg больше не надо ENDIF RETURN Events( hHwnd, nMsg, wParam, lParam)[/pre2] И чего в новой версии исправлено ?

SergKis: Andrey Попробуй так (возможно WM_COPYDATA пришло когда объекта окна не было)[pre2] FUNCTION MyEventsHandler( hHwnd, nMsg, wParam, lParam ) LOCAL cData, nDataID, oWnd IF nMsg == WM_COPYDATA cData := GetMessageData( lParam, @nDataID ) DO EVENTS // общее событие для вызова из других программ с формы Form_Main oWnd := _WindowObj( "Form_Main" ) IF HB_ISOBJECT(oWnd) ; _wPost(111, oWnd, cData) ENDIF RETURN 1 // выполненно nMsg == WM_COPYDATA, обрабатывать nMsg больше не надо ENDIF RETURN Events( hHwnd, nMsg, wParam, lParam)[/pre2]

Andrey: Не помогает... Такой же вылет !!!

Andrey: Если ставлю комментарий на [pre2] //SET EVENTS FUNCTION TO MyEventsHandler // проверка версии программы [/pre2] То опять "вылет" проги и другая ошибка: [pre2]Error BASE/1001 Неизвестная функция: EVENTS Args: [1] = N 723514 [2] = N 129 [3] = N 0 [4] = N 1701896 --------------------------------- Stack Trace --------------------------------- Called from EVENTS(0) Called from INITWINDOW(0) Called from _DEFINEWINDOW(0) Called from MAIN(164) in module: Source\main.prg [/pre2] код вот такой: [pre2] DEFINE WINDOW Form_Main ; AT 0,0 WIDTH 640 HEIGHT 480 ; TITLE cTitle ICON cIcon ; MAIN NOSHOW ; NOMAXIMIZE NOSIZE NOCAPTION ; ON INIT { || IniGetPosWindow(,,"MAIN"), MyInitForm() } ; ON INTERACTIVECLOSE { || IIF( lStaticErrorClose, MyExit(), Nil ) } // строка 164[/pre2] И что ему не нравиться в этом коде ? P.S. Замена на Харбор - Version: 3.2.0dev (r2301231146) убирает эту проблему...

Andrey: SergKis пишет: Надо исп. в модальных окнах _HMG_InplaceParentHandle := hWnd // hWnd - окна родителя ... // после action модального окна _HMG_InplaceParentHandle := 0 иначе у modal окна родитель будет main window (default и вероятно фокус убегает на него) Как быть если вызывается подряд 3 модальных окна ? _HMG_InplaceParentHandle := 0 поставим, а другие модальные окна уже не смогут быть привязанными к родительскому окну, будут привязаны к main window Раньше этим вообще не заморачивался, а в новых версиях МиниГуи приходится самому отслеживать, модальное окно скрывается под WINDOWTYPE STANDARD окном. Можно как то привязывать все модальные окна которые вызываются из WINDOWTYPE STANDARD на это окно ?

SergKis: Andrey пишет Раньше этим вообще не заморачивался, а в новых версиях МиниГуи приходится самому отслеживать Не придумывай, все окна в Гуи имеют родителя, начиная от DeskTop и до контролов (это тоже окна с родителем окном, на котором созданы) и от версии МиниГуи это не зависит. Как быть если вызывается подряд 3 модальных окна ? Всем окнам присваивай handle окна родителя.

Andrey: SergKis пишет: Всем окнам присваивай handle окна родителя. Т.е. после создания окна делаю: [pre2] DEFINE WINDOW &cFormName At 0, 0 ; WINDOWTYPE STANDARD ; .... _HMG_InplaceParentHandle := ThisWindow.Handle ... END WINDOW .... _HMG_InplaceParentHandle := 0 [/pre2] И больше не о чём не забочусь ?

SergKis: Andrey пишет И больше не о чём не забочусь ? Если так сделаешь для трех modal окон и вызывать их будешь с окна STANDARD по одному, то да. А если modal окна вызываешь друг за другом последовательно, то нет. Надо перед каждым модальным окном делать FUNCTION Standard1() ... DEFINE WINDOW &cFormName ... STANDARD ... ... BUTTON ...ACTION Modal1() ... RETURN Nil FUNCTION Modal1() ... _HMG_InplaceParentHandle := ThisWindow.Handle ... DEFINE WINDOW &cFormName MODAL ... ... BUTTON ...ACTION Modal2() ... RETURN Nil FUNCTION Modal2() ... _HMG_InplaceParentHandle := ThisWindow.Handle ... DEFINE WINDOW &cFormName MODAL ... ... BUTTON ...ACTION Modal3() ... RETURN Nil FUNCTION Modal3() ... _HMG_InplaceParentHandle := ThisWindow.Handle ... DEFINE WINDOW &cFormName MODAL ... ... BUTTON ...ACTION ... ... RETURN Nil т.к. вызовы ф-ий происходят в событиях окна или контролов, то _HMG_InplaceParentHandle := ThisWindow.Handle всегда будет handle окна на котором нажали кнопку, например, для вызова след. окна

Andrey: Понял. Спасибо !

Andrey: Бьюсь уже какой месяц с сервером терминалов на Windows Server 2008 R2 Вылетает прога в одном месте постоянно через 2-3 раза по выбору из справочника. Причём прогу смог протестировать на другом точно таком же сервере. Там прога работает без вылетов. Только сейчас дошло до меня, где не работает прога у пользователя урезанный доступ, а где работает полный доступ. Как это может влиять на работу программы МиниГуи ? Но с другой стороны вообще не понятка, одна и таже функция вызывает справочник города и улиц. Города выбираются всегда, а как улицу выбрал, прога вешается, окно закрылось и висит, без ошибки. Если потом нажать любую кнопку на другой форме, то тогда вылет проги. Но почему прога висит ? Форма не закрылась ? Что ещё проге нужно ?

PSP: Andrey пишет: Только сейчас дошло до меня, где не работает прога у пользователя урезанный доступ, а где работает полный доступ. Ну так дай нужные права или админа попроси.

Andrey: PSP пишет: Ну так дай нужные права или админа попроси. Админ дал права, все равно виснет. Окно закрывается и прога висит.... Почему окно закрылось и управление дальше в программу не даёт ? Делаю вывод в лог вот так:[pre2] DEFINE WINDOW Form_SelDim .... ON RELEASE {|| _logfile(.t., SPACE(8)+"+-o-+ :Event(99)"+ProcNL(),"ON RELEASE =", 1, "Завершена работа формы=",cFormName ) ,; _logfile(.t., SPACE(8)+"+-o-+ Form:", HMG_GetForms(), HB_ValToExp(HMG_GetForms()) ), DoEvents() } [/pre2] Вывод в лог файл есть, а дальше прога "ВИСИТ"... [pre2] +-o-+ :Event(99)Вызов из: (b)FORM_SELDIM2(80) --> Sel_Dim_Hmg2frm.prg ON RELEASE=1 Завершена работа формы=Form_SelDim +-o-+ Form: ARRAY[6] { ...., "Form_SeekAdr", "Form_SelDim"} [/pre2] А окно "Form_SelDim" и не закрылось !!! P.S. Ещё заметил такую странность, если выбор осуществлять мышкой то окно НЕ ВЕШАЕТСЯ, а если через ENTER, то окно ПОВЕСИТЬСЯ.

gfilatov2002: Andrey пишет: окно "Form_SelDim" и не закрылось Значит, надо пробовать закрывать его в цикле, например [pre2] DO WHILE IsWindowDefined(Form_SelDim) Form_SelDim.Release ENDDO [/pre2] Andrey пишет: если через ENTER, то окно ПОВЕСИТЬСЯ Можно попробовать временно переназначить действие ENTER на другую клавишу, например [pre2] :UserKeys(VK_RETURN, {|ob| _wPost( 2, ob:cParentWnd), .F. }) заменить на :UserKeys(VK_F10, {|ob| _wPost( 2, ob:cParentWnd), .F. }) [/pre2] также можно попробовать использовать функцию _wSend() вместо _wPost(). Понятно, что это только предложения для пробы



полная версия страницы