Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在delphi中从线程中止整个应用程序_Multithreading_Delphi - Fatal编程技术网

Multithreading 在delphi中从线程中止整个应用程序

Multithreading 在delphi中从线程中止整个应用程序,multithreading,delphi,Multithreading,Delphi,我的delphi应用程序有一个大问题。我正在开发一个使用外部安全性的软件。我使用的usb设备必须连接到用户计算机才能运行我的软件。如果用户删除了这个加密狗,或者在没有它的情况下启动,应用程序应该警告用户并立即停止。 在创建应用程序时会释放一个线程,用于检查安全设备。但是,当检查失败时,例如没有找到设备,该线程不会终止我的应用程序。我用的是这样的东西: retCode := checkSecurity(); if retCode = -1 then begin

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

    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
工作起来很有魅力!正如我提到的,我的软件和财务安全是第一位的,稍后我将尝试改进漏洞。谢谢大卫!!!你不会泄露任何东西。操作系统会为您整理。