如何立即完全停止应用程序并显示消息?

时间:2018-02-18 13:56:16

标签: delphi winapi delphi-2010

当我的应用程序需要紧急停止时,我可以致电HaltExitProcess立即终止它。但这不应该悄然发生;用户需要显示一条消息。因此,我查看了FatalAppExit,但很惊讶它保持所有内容(计时器,线程)一直运行,直到用户关闭对话框。

据我所知,显示流程所拥有的UI需要流程继续运行。但是,UI不需要由我的进程拥有。 FatalAppExit提供的对话似乎归Windows所有,即使它也保持流程运行。

FatalAppExit的主要问题是它阻塞 - 我想要对话但不等待确认 - 所以我仍然无法立即终止。为了避免这种情况,我必须启动一个调用FatalAppExit的线程,稍等一下然后终止进程。不喜欢那里的比赛条件。

我也可以启动一个自己的流程来显示消息,但是我宁愿不知道Windows是否可以处理它。

Windows是否提供同时终止和显示友好消息的方法?还有其他任何建议尽可能干净地处理这个问题吗?

2 个答案:

答案 0 :(得分:1)

据我所知,这里唯一的选择是启动一个显示消息并立即终止的外部进程。您可以为此目的编写自己的程序(这可能是最简单的选项),或者您可以启动这样的批处理文件:

msg "%USERNAME%" %*

这会向给定用户发送一条消息(%USERNAME%是当前登录的用户)并使用传递给它的所有参数作为实际消息。

就个人而言,我会编写自己的程序,所以如果以后需要,我可以写一个日志条目并做其他的事情。

答案 1 :(得分:0)

您可以拥有全局变量,例如

var ShutdownMessage: string;

当您需要以错误结束时,请执行以下操作:

ShutdownMessage := 'Error occured';
Application.Terminate;

并在Application.Run之后的dpr文件中:

if ShutdownMessage <> '' then
  MessageBox(0, PChar(ShutdownMessage), 'Error', MB_OK or MB_ICONERROR);

然后,在所有表格关闭并退出主循环后,将显示该消息。

或者,如果失败,您可以尝试在Application.Run之后引发异常 - 它应该传播到OS