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版本?
答案 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创建自己的消息循环。