Delphi 申请 运行
Delphi Application Run
Application.Run 过程调用处理 windows 消息的无限循环:
repeat
try
HandleMessage;
except
HandleException(Self);
end;
until Terminated;
Terminated
属性 只能通过 Application.Terminate
发送 PostQuitMesage 的过程设置为真。
我想更改消息处理循环,以便我可以使用全局变量直接停止它(不使用消息队列):
var MyTerminated:Boolean
....
repeat
try
HandleMessage;
except
HandleException(Self);
end;
until Terminated or MyTerminated;
问题是,是否可以让程序使用您自己的 Application.Run 版本?
"Terminated" 属性 是只读的。然而,它是 FTerminated
字段的直接 getter,因此 Application.Terminated
直接从布尔字段读取。虽然该语言不允许设置 Application.Terminated
,但您可以使用指针在该地址设置布尔值:
PBoolean(@Application.Terminated)^ := True;
您也可以考虑使用 Halt
,它将完全跳过消息循环,以获得更突然但更少 hacky 的解决方案。
是的,您可以让您的应用程序使用自己的 Application 运行 版本,但不鼓励这种做法,因为它会改变由 Delphi 的架构师设计的正常程序流程。
直接停止 Application.Run 表示稍后需要重新启动 Application.Run,例如,在需要从主线程完成某些操作之后。这使得程序很费解,同行程序员更难理解,整体更容易出错。
程序设计应该简单明了。如果一个应用程序很大,例如两百万行代码,那么执行流程的整体设计应该很简单:
- 如果您需要执行一些较长的操作,请从工作线程执行;
- 如果您需要执行即时操作,请从您的主窗体或其他窗体进行。
所以 Delphi 应用程序主循环应该只在整个应用程序退出时退出,这是由 PostQuitMessage 完成的。我们不必回避此消息。
之所以要避免PostQuitMessage,可能是瞬时退出。这不是 VCL 应用程序应该如何 运行。如果不需要表单(例如 Windows 服务应用程序),则不要使用 TApplication class 也不要 运行 表单,只需创建自己的消息循环基于 MsgWaitForMultipleObjects.
Application.Run 过程调用处理 windows 消息的无限循环:
repeat
try
HandleMessage;
except
HandleException(Self);
end;
until Terminated;
Terminated
属性 只能通过 Application.Terminate
发送 PostQuitMesage 的过程设置为真。
我想更改消息处理循环,以便我可以使用全局变量直接停止它(不使用消息队列):
var MyTerminated:Boolean
....
repeat
try
HandleMessage;
except
HandleException(Self);
end;
until Terminated or MyTerminated;
问题是,是否可以让程序使用您自己的 Application.Run 版本?
"Terminated" 属性 是只读的。然而,它是 FTerminated
字段的直接 getter,因此 Application.Terminated
直接从布尔字段读取。虽然该语言不允许设置 Application.Terminated
,但您可以使用指针在该地址设置布尔值:
PBoolean(@Application.Terminated)^ := True;
您也可以考虑使用 Halt
,它将完全跳过消息循环,以获得更突然但更少 hacky 的解决方案。
是的,您可以让您的应用程序使用自己的 Application 运行 版本,但不鼓励这种做法,因为它会改变由 Delphi 的架构师设计的正常程序流程。
直接停止 Application.Run 表示稍后需要重新启动 Application.Run,例如,在需要从主线程完成某些操作之后。这使得程序很费解,同行程序员更难理解,整体更容易出错。
程序设计应该简单明了。如果一个应用程序很大,例如两百万行代码,那么执行流程的整体设计应该很简单:
- 如果您需要执行一些较长的操作,请从工作线程执行;
- 如果您需要执行即时操作,请从您的主窗体或其他窗体进行。
所以 Delphi 应用程序主循环应该只在整个应用程序退出时退出,这是由 PostQuitMessage 完成的。我们不必回避此消息。
之所以要避免PostQuitMessage,可能是瞬时退出。这不是 VCL 应用程序应该如何 运行。如果不需要表单(例如 Windows 服务应用程序),则不要使用 TApplication class 也不要 运行 表单,只需创建自己的消息循环基于 MsgWaitForMultipleObjects.