为什么 Progress 在会话崩溃后返回到初始屏幕?
Why does Progress go back to the initial screen after a session crash?
大家好,感谢您查看此问题,
我有一个用户可以通过登录屏幕访问的程序。一旦在登录屏幕上验证了用户的凭据,就会调用主程序(从登录屏幕),然后登录屏幕消失。都好。但是,如果会话崩溃(或者我按下 CTRL-PAUSE),主程序就会终止,我最终会出现在初始登录屏幕。我曾假设在会话崩溃后,Progress (11.4) 应该将我带回 OS (Windows Server 2012),但不会带回初始屏幕。我已尝试将 QUIT 放置在程序的不同区域,但 Progress 仍将我带回初始屏幕,而我需要它完全退出。任何想法将不胜感激。谢谢!
AVM 的默认行为是在出现未处理的停止条件后重新运行启动过程。
您可以添加一个
ON STOP UNDO, RETURN "stopped" .
选择 DO、FOR 或 REPEAT 块关闭发生“崩溃”的地方。然后调用过程可以检查“已停止”的 RETURN-VALUE。
假设您使用的是最新版本 (OpenEdge 12.x),您还可以将 CATCH 块用于 Progress.Lang.Stop:
CATCH stopcon AS Progress.Lang.Stop:
QUIT.
END CATCH.
我相信我已经找到了一种方法,可以通过使用 ETIME 函数在由于会话崩溃而出现时退出初始登录屏幕。再次感谢迈克的回复。
我认为您对“崩溃”一词的使用非常非常混乱。如果您的会话实际上在通常意义上“崩溃”,即 _progres(或 prowin,如果这是 Windows)终止,那么您将没有任何锁定的记录。您还会有一个 protrace 文件,可以帮助您确定问题发生的位置。
顺便说一句,您可以在客户端启动时添加错误日志,以确定 QXtend 找不到的错误发生的位置:
_progres dbname -p startup.p -clientlog logname.log
您没有共享任何代码,所以我只能猜测,但据推测,您正在通过 -p 启动参数运行设置您的登录程序。
如果我错了,请纠正我,但大致如下:
_progres dbname -p startup.p
启动程序然后 运行 无论如何 运行 让您登录并 运行 应用程序。也许是这样的:
/* startup.p
*/
message "(re)starting!".
pause.
run value( "login.p" ).
run value( "stuff.p" ).
message "all done".
pause.
quit.
并且:
/* login.p
*/
message "hello, logging in!".
pause.
return.
连同:
/* stuff.p
*/
message "hello, doing stuff!".
pause.
run value( "notthere.p" ).
message "hello, doing more stuff!".
pause.
return.
有时会发生错误(您似乎想称其为“崩溃”)。当 stuff.p 尝试“运行 notthere.p”时,我已经安排了一个严重的错误发生。因此,如果您 运行 我的示例,您将看到您所描述的行为 - 您的会话“崩溃”,启动程序重新 运行s,然后您再次进入登录屏幕。
要更改它并捕获错误,只需在 运行 语句周围包装一个“DO ON STOP”。像这样:
/* startup.p
*/
message "(re)starting!".
pause.
do on error undo, leave
on endkey undo, leave
on stop undo, leave
on quit undo, leave: /* "leave", exits this block when one of the named conditions arises */
run value( "login.p" ).
run value( "stuff.p" ).
/* we just leave because we finished normally */
end.
message "all done".
pause.
quit.
您提到了 QXtend,所以我猜测 MFG/Pro 与此有关。如果您不能直接修改 MFG/Pro 启动程序(我记得应该是“-p mfg.p”),只需将上面的代码改编为 运行s mfg.p 来自“DO ON STOP...”块中。
大家好,感谢您查看此问题,
我有一个用户可以通过登录屏幕访问的程序。一旦在登录屏幕上验证了用户的凭据,就会调用主程序(从登录屏幕),然后登录屏幕消失。都好。但是,如果会话崩溃(或者我按下 CTRL-PAUSE),主程序就会终止,我最终会出现在初始登录屏幕。我曾假设在会话崩溃后,Progress (11.4) 应该将我带回 OS (Windows Server 2012),但不会带回初始屏幕。我已尝试将 QUIT 放置在程序的不同区域,但 Progress 仍将我带回初始屏幕,而我需要它完全退出。任何想法将不胜感激。谢谢!
AVM 的默认行为是在出现未处理的停止条件后重新运行启动过程。
您可以添加一个
ON STOP UNDO, RETURN "stopped" .
选择 DO、FOR 或 REPEAT 块关闭发生“崩溃”的地方。然后调用过程可以检查“已停止”的 RETURN-VALUE。
假设您使用的是最新版本 (OpenEdge 12.x),您还可以将 CATCH 块用于 Progress.Lang.Stop:
CATCH stopcon AS Progress.Lang.Stop:
QUIT.
END CATCH.
我相信我已经找到了一种方法,可以通过使用 ETIME 函数在由于会话崩溃而出现时退出初始登录屏幕。再次感谢迈克的回复。
我认为您对“崩溃”一词的使用非常非常混乱。如果您的会话实际上在通常意义上“崩溃”,即 _progres(或 prowin,如果这是 Windows)终止,那么您将没有任何锁定的记录。您还会有一个 protrace 文件,可以帮助您确定问题发生的位置。
顺便说一句,您可以在客户端启动时添加错误日志,以确定 QXtend 找不到的错误发生的位置:
_progres dbname -p startup.p -clientlog logname.log
您没有共享任何代码,所以我只能猜测,但据推测,您正在通过 -p 启动参数运行设置您的登录程序。
如果我错了,请纠正我,但大致如下:
_progres dbname -p startup.p
启动程序然后 运行 无论如何 运行 让您登录并 运行 应用程序。也许是这样的:
/* startup.p
*/
message "(re)starting!".
pause.
run value( "login.p" ).
run value( "stuff.p" ).
message "all done".
pause.
quit.
并且:
/* login.p
*/
message "hello, logging in!".
pause.
return.
连同:
/* stuff.p
*/
message "hello, doing stuff!".
pause.
run value( "notthere.p" ).
message "hello, doing more stuff!".
pause.
return.
有时会发生错误(您似乎想称其为“崩溃”)。当 stuff.p 尝试“运行 notthere.p”时,我已经安排了一个严重的错误发生。因此,如果您 运行 我的示例,您将看到您所描述的行为 - 您的会话“崩溃”,启动程序重新 运行s,然后您再次进入登录屏幕。
要更改它并捕获错误,只需在 运行 语句周围包装一个“DO ON STOP”。像这样:
/* startup.p
*/
message "(re)starting!".
pause.
do on error undo, leave
on endkey undo, leave
on stop undo, leave
on quit undo, leave: /* "leave", exits this block when one of the named conditions arises */
run value( "login.p" ).
run value( "stuff.p" ).
/* we just leave because we finished normally */
end.
message "all done".
pause.
quit.
您提到了 QXtend,所以我猜测 MFG/Pro 与此有关。如果您不能直接修改 MFG/Pro 启动程序(我记得应该是“-p mfg.p”),只需将上面的代码改编为 运行s mfg.p 来自“DO ON STOP...”块中。