【问题标题】:Program still in taskmanager after calling Halt调用 Halt 后程序仍在任务管理器中
【发布时间】:2012-08-30 02:18:34
【问题描述】:

问题是,作为我的第一个可执行语句,我想检查是否可以从数据库中读取。如果我不能,我打电话给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() 放在我的[应用程序].pas 中Application.Run(); 之后?

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

【问题讨论】:

  • 试试Application.Terminate吧?
  • 首先,调用Halt;这应该是最后的手段。其次,不要在您的问题中发布任何源代码;如果你不展示你在做什么,就不可能说出你做错了什么。
  • +1 两者。啊,Ken,你总是想看代码 ;-) 好的,更新了……而且 Application.Terminate 似乎没有改变任何东西
  • 使用调试器。暂停您的程序并查看调用堆栈,看看您的程序仍在做什么以及它在等待什么。
  • +1 但我没有看到堆栈???也许一个线程还在运行???

标签: delphi indy10


【解决方案1】:

Halt 过程并不是我们有时误认为的直接进程杀手。它调用所有程序单元的单元完成部分,因此您的程序可能会卡在其中一个中,也许正在等待您的表单发生某些事情,这不会发生,因为您的 OnCreate 处理程序没有还没回来。

您可以使用调试器找出您的程序正在做什么或等待什么。

真的尽快退出程序,请跳过Halt,直接转到ExitProcess。这是Halt 调用的最后一件事。

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

更好的是,找到一种更优雅的方式来退出您的程序。例如,在创建表单之前测试您的数据库,这样您就不会陷入尴尬的境地,因为您不再需要创建一半的表单。

【讨论】:

  • +1 谢谢,@Rob ExitProcess(0) 成功了(当然,可能仍然存在内存泄漏,但我必须接受)
  • @Mawg ExitProcess 不能泄漏内存。系统将其全部收回。但是你真的不应该打电话给ExitProcess。这表明您的应用中还有其他不完全正确的地方。
猜你喜欢
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
相关资源
最近更新 更多