从delphi中的线程中止整个应用程序

时间:2015-05-06 13:38:56

标签: multithreading delphi

我的delphi App存在一个主要问题。我正在开发一种使用外部安全性的软件。我正在使用必须连接到用户计算机的USB设备才能运行我的软件。如果用户有任何机会删除此加密狗,或者在没有加密狗的情况下启动,应用程序应该警告用户并立即停止。 在创建应用程序时会释放一个线程,该应用程序会检查安全设备。但是,当检查失败时,例如,没有找到设备,该线程没有杀死我的应用程序。我正在使用这样的东西:

    retCode := checkSecurity();
    if retCode = -1 then
    begin
        ShowMessage('Security device not found! Terminating immediately!');
        Application.Terminate;
    end;

这里的主要问题是Application.Terminate并没有真正杀死应用程序。我已经读过SO和其他地方,Terminate发送一个优雅关闭的信号,并等待其他线程,在我的情况下,应用程序的主线程,完成。我真的需要按照提到的方式杀死应用程序,杀死所有线程并退出,如果可能的话,清理以避免内存泄漏,但如果不是,请跟我好。我正在使用Delphi XE2,使用Windows 8.1进行开发。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您可以致电ExitProcess强制立即终止。与Halt相比,操作系统功能ExitProcess执行的清理工作更少。

答案 1 :(得分:2)

要杀死某个应用,只需拨打Halt即可。它是DOS时代的遗留物,适合与现代Delphi应用程序很好地协作。它将呼吁所有的最终确定'所有单位都有块,但不多。

答案 2 :(得分:2)

要从您可以使用的线程终止应用程序:

TThread.Queue(nil, 
  procedure
  begin
    Application.Terminate;
  end
);

这是跨平台的,并且“几乎”与

相同
PostThreadMessage(MainThreadID, WM_QUIT, 0, 0)

鉴于Application对象尚未销毁,您使用的是Windows。