在调用Halt之后,程序仍在任务管理器中

Maw*_*awg 1 delphi indy10

问题是,作为我的第一个可执行语句,我想检查是否可以从数据库中读取.如果我不能,我打电话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;
Run Code Online (Sandbox Code Playgroud)

[更新]当我在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- 但我不是udnertsand它是如何抛出的......我猜这些Application.Terminate调用可能是主要的形式FormClose,它对我的​​Indy组件没有任何作用,但我想当父表单被销毁时它的子节点会也是.


[进一步更新]

TMainForm.FormCreate现在只说

Sleep(1000);
PostMessage(Handle, UM_PROGRAM_START, 0, 0);
Run Code Online (Sandbox Code Playgroud)

我将所有代码都移动到处理它的函数stat中.当然一切都是在那个时候创造出来的?那么,为什么我的Indy组件会抛出异常?

也许我应该放入PostMessage()我的[应用程序] .pas之后Application.Run();

(旁白:1)其他人如何通常以这种方式处理应用程序启动?2)有人有申请骨架吗?我正在考虑创建一个带有选项来处理最小化到系统托盘,只允许一个实例,最近的文件菜单等等) - 尽管这可能更好作为一个单独的问题

Rob*_*edy 8

Halt程序不是我们有时会误认为它的直接过程杀手.它调用所有程序单元的单元定型部分,因此您的程序可能会卡在其中一个部分中,可能等待表单发生某些事情,由于您的OnCreate处理程序尚未返回,因此不会发生这种情况.

您可以使用调试器来查找您的程序正在执行或等待的内容.

真正走出一个程序尽可能快的,跳过Halt,直接进入ExitProcess.这是最后的事情Halt.

Application.Terminate实际终止发生的地方实际上更远,因为它实际上只是一个咨询命令; 应用程序在到达消息循环之前不会终止.

更好的是,找到一种更优雅的方式退出程序.例如,创建表单之前测试您的数据库,这样您就不会处于具有半创建表单的尴尬境地,而您不再需要它.

  • @Mawg`ExportProcess`不能泄漏内存.系统声称一切都回来了.但你真的不应该叫`ExitProcess`.它表明你的应用程序中还有其他不太正确的东西. (5认同)