为什么 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 仍将我带回初始屏​​幕,而我需要它完全退出。任何想法将不胜感激。谢谢!

A​​VM 的默认行为是在出现未处理的停止条件后重新运行启动过程。

您可以添加一个

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 文件,可以帮助您确定问题发生的位置。

顺便说一句,您可以在客户端启动时添加错误日志,以确定 QXten​​d 找不到的错误发生的位置:

_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.

您提到了 QXten​​d,所以我猜测 MFG/Pro 与此有关。如果您不能直接修改 MFG/Pro 启动程序(我记得应该是“-p mfg.p”),只需将上面的代码改编为 运行s mfg.p 来自“DO ON STOP...”块中。