问题是,作为我的第一个可执行语句,我想检查是否可以从数据库中读取。如果我不能,我调用 MessageDlg
这么解释,那我Halt;
.
但是,关闭对话框后,我仍然在 tak 管理器中看到应用程序(如果我停止它并重新运行应用程序,也会发生同样的事情)。
知道我做错了什么吗?
Global.ADQuery1 是一个 AnyDac 数据库访问组件。我通过 IP 地址访问 d/b。当我将我的 PC 地址设置为 d/b 地址时,代码工作正常,并在我更改我的 IP 地址时给出报告的问题(因此,无法访问 d/b,这会引发异常)。
procedure TMainForm.FormCreate(Sender: TObject);
begin
try
Global.ADQuery1.Open('SHOW DATABASES');
except
On E: Exception do
begin
MessageDlg('Database access problem', mtError, [mbOK], 0);
Halt;
end;
end;
[更新] 当我在 IDE 中运行时,捕获后
(EMySQLNativeException) : "[AnyDAC][Phys][MySQL] Can't connect to MySQL server on '10.21.18.211' (10060)"
我捕获了
EIdWinSockStubError either the program has not called wsastartup or wsastartup failed
- 但我不知道它是如何抛出的......我猜Application.Terminate
调用可能主窗体的FormClose
,这对我的 Indy 组件没有任何作用,但我猜当父窗体被销毁时,它的子窗体也会被销毁。[进一步更新]
我的
TMainForm.FormCreate
现在只说Sleep(1000);
PostMessage(Handle, UM_PROGRAM_START, 0, 0);
我把所有的代码都移到了处理它的函数的stat中。确定一切都是在那个时候创造的吗?那么,为什么我的 Indy 组件会抛出异常呢?
也许我应该把
PostMessage()
在我的 [application].pas Application.Run();
之后?(旁白:1)其他人通常如何以这种方式处理应用程序启动? 2)有人有应用程序框架吗?我正在考虑创建一个选项来处理最小化到系统托盘,只允许一个实例,最近的文件菜单等) - 尽管作为一个单独的问题可能会更好
最佳答案
Halt
程序不是我们有时误认为的直接进程杀手。它调用所有程序单元的单元完成部分,因此您的程序可能会卡在其中一个中,也许正在等待您的表单发生某些事情,而自从您的 OnCreate
之后就不会发生这种情况。处理程序尚未返回。
您可以使用调试器来找出您的程序正在做什么或等待什么。
要真正尽快退出程序,请跳过 Halt
直接转至ExitProcess
.这是最后一件事Halt
来电。Application.Terminate
实际上离任何真正终止发生的点更远,因为它实际上只是一个咨询命令;应用程序在到达消息循环之前不会终止。
更好的是,找到一种更优雅的方式来退出程序。例如,在创建表单之前测试您的数据库,这样您就不会陷入尴尬的境地,因为您不再需要创建一半的表单。
关于delphi - 调用 Halt 后程序仍在任务管理器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12189025/