Delphi应用程序运行

时间:2017-05-15 23:46:32

标签: delphi terminate

Application.Run过程调用一个处理Windows消息的无限循环:

  repeat
    try
      HandleMessage;
    except
      HandleException(Self);
    end;
  until Terminated;

Terminated属性只能通过发送PostQuitMesage的Application.Terminate过程设置为true。 我想更改消息处理循环,以便我可以使用全局变量直接停止它(不使用消息队列):

var MyTerminated:Boolean
....
  repeat
    try
      HandleMessage;
    except
      HandleException(Self);
    end;
  until Terminated or MyTerminated;

问题是,是否可以使程序使用您自己的Application.Run版本?

2 个答案:

答案 0 :(得分:5)

“已终止”属性是只读的。但是它是FTerminated字段的直接getter,因此Application.Terminated直接从布尔字段读取。虽然语言不允许设置Application.Terminated,但您可以使用指针在该地址设置布尔值:

PBoolean(@Application.Terminated)^ := True;

你也可以考虑使用Halt,它将完全传递消息循环,以获得更突然但更少 hacky 的解决方案。

答案 1 :(得分:0)

是的,您可以让您的应用程序使用自己的Application版本运行,但不鼓励这种做法,因为它改变了由Delphi架构师设计的正常程序流程。

直接停止Application.Run表示稍后需要重新启动Application.Run,​​例如,在想要从主线程完成某些操作之后。这使程序困惑,更难以被同行程序员理解,并且整体上更容易出错。

程序设计应该简单明了。如果应用程序很大,例如200万行代码,那么执行流程的总体设计应该是简单的:

  • 如果您需要执行更长时间的操作,请从工作线程执行;
  • 如果您需要立即执行操作,请从主表单或其他表单执行操作。

因此,只应在整个应用程序出口退出Delphi应用程序主循环,这由PostQuitMessage完成。我们不必避免这个消息。

想要避免PostQuitMessage的原因可能是瞬间退出。这不是VCL应用程序运行的方式。如果不需要表单(例如,对于Windows服务应用程序),只是不要使用TApplication类,不要运行表单,只需根据MsgWaitForMultipleObjects创建自己的消息循环。