Multithreading 在delphi中从线程中止整个应用程序
我的delphi应用程序有一个大问题。我正在开发一个使用外部安全性的软件。我使用的usb设备必须连接到用户计算机才能运行我的软件。如果用户删除了这个加密狗,或者在没有它的情况下启动,应用程序应该警告用户并立即停止。 在创建应用程序时会释放一个线程,用于检查安全设备。但是,当检查失败时,例如没有找到设备,该线程不会终止我的应用程序。我用的是这样的东西:Multithreading 在delphi中从线程中止整个应用程序,multithreading,delphi,Multithreading,Delphi,我的delphi应用程序有一个大问题。我正在开发一个使用外部安全性的软件。我使用的usb设备必须连接到用户计算机才能运行我的软件。如果用户删除了这个加密狗,或者在没有它的情况下启动,应用程序应该警告用户并立即停止。 在创建应用程序时会释放一个线程,用于检查安全设备。但是,当检查失败时,例如没有找到设备,该线程不会终止我的应用程序。我用的是这样的东西: retCode := checkSecurity(); if retCode = -1 then begin
retCode := checkSecurity();
if retCode = -1 then
begin
ShowMessage('Security device not found! Terminating immediately!');
Application.Terminate;
end;
这里的主要问题是,
Application.Terminate
并不会真正杀死应用程序。我已经读过很多其他地方,Terminate发送了一个正常关机的信号,并等待其他线程(在我的例子中是应用程序的主线程)完成。我真的需要像前面提到的那样杀掉这个应用程序,杀掉所有线程并退出,如果可能的话,清理以避免内存泄漏,但是如果没有,我可以。我正在使用DelphiXe2,用Windows8.1开发
有什么想法吗?要杀死一个应用程序,只需打电话。它是DOS时代的遗留产品,适合与现代Delphi应用程序配合使用。它将调用所有单元中的所有“finalization”块,但不会太多。您可以调用以强制立即终止。与停止相比,操作系统函数退出进程执行的清理更少。要从线程终止应用程序,可以使用以下方法:
TThread.Queue(nil,
procedure
begin
Application.Terminate;
end
);
这是跨平台的,与
PostThreadMessage(MainThreadID, WM_QUIT, 0, 0)
鉴于应用程序对象尚未销毁,并且您使用Windows。“清理以避免内存泄漏”这就是
应用程序的原因。Terminate
以这种方式工作,以确保事情得到清理。此应用程序“我正在开发的软件将被商业化,因此如果有人试图在没有安全设备的情况下使用该软件,我并不介意留下一些剩余的东西,只要该应用程序关闭突然关闭任何应用程序都不是一个好主意。为什么?因为这样做甚至可能导致数据损坏。例如,我们可以说,在终止应用程序时,您的应用程序正在向disn写入一些数据,并且它只完成了一半。此时突然关闭它将意味着本应写入的大部分数据将永远消失。现在您说,当有人试图以不正确的方式使用应用程序时,您不关心应用程序会导致什么。但在许多情况下,您的应用程序可能会认为它的使用方式不正确。例如,您可能有一个合法用户,该用户的USB控制器有问题,所以您的应用程序可能会时不时地检测到您的安全设备被拔出。您是否真的希望每次都为这样的用户创建haveoc。或者,当USB控制器可能由于省电(计算机进入睡眠模式)而断电时,情况又如何呢?仅供参考,Application.Terminate()
将WM\u QUIT
消息发布到调用线程的消息队列中,主线程中的Application.Run()
在收到该消息时会查找要退出的消息。如果在工作线程中调用Terminate()
,Run()
将永远不会收到消息。因此,让工作线程使用PostThreadMessage(MainThreadID,WM_QUIT,0,0)
。您还可以考虑在启动之前在主线程中进行初始安全检查,然后再启动其他任何操作。如果检查失败,请立即退出应用程序,否则请完成启动并为后续检查创建线程。使用Halt会引发异常系统错误代码5:访问被拒绝
,这肯定是因为代码中的某些内容在终止时被执行。使用调试器会告诉您它是什么。要么处理该代码引发错误的原因,要么完全绕过它。ExitProcess
工作起来很有魅力!正如我提到的,我的软件和财务安全是第一位的,稍后我将尝试改进漏洞。谢谢大卫!!!你不会泄露任何东西。操作系统会为您整理。