杀死由挂起DLL Delphi引起的所有线程

问题描述 投票:1回答:1

我有一个调用DLL的Delphi代码。DLL是动态链接的。

在我的代码开头,我通过]启动/打开了DLL。>

DllHandle:= LoadLibrary(DllFileName);
  • 如果DLL文件不存在,我会得到一个DLLHandle=0,这很好。我可以继续执行主程序中的下一行。
  • 如果DLL文件存在并正确初始化,我会得到non-zero DLLHandle,这也很好。
  • 但是在DLL内时常出问题,这意味着该文件存在但DLL没有响应。所以我的主要应用程序是挂起的。

为了避免这种情况,我研究了多线程。

我的主程序具有从TMyThread继承并覆盖TThread的新类型Create, Destroy, Execute

我的主程序正在动态创建一个新线程(ChildThread)。 ChildThread的Execute方法正在调用上述的LoadLibrary。

这样做,我可以继续执行我的主程序并稍等一下,以查看ChildThread是否返回非零的DLL句柄。如果几秒钟后ChildThread中的DLLhandle仍然为零,我想杀死线程并释放DLL并重试。

进一步研究,我可以在Delphi IDE中看到线程列表。最初,我的主程序下有4个线程。当我创建ChildTread时,会显示一个新的。几秒钟后(当在ChildTread中调用Execute并调用loadlibrary时)又出现了两个线程。我猜主DLL正在调用其他线程。

在此阶段,我无法访问ChildTread,因此我无法在Execute方法中使用while循环来查看其是否终止并退出线程。因为该线程中的实际代码已经挂在执行中。

问题:ChildTread挂起,但我的主程序继续。我想从主程序中杀死ChildThread(也许它启动的所有其他线程)并重试 DllHandle:= LoadLibrary(DllFileName);

我有一个调用DLL的Delphi代码。 DLL是动态链接的。在我的代码开头,我通过DllHandle启动/打开DLL:= LoadLibrary(DllFileName);如果DLL文件没有...

multithreading delphi dll loadlibrary
1个回答
1
投票

我的主程序正在动态创建一个新线程(ChildThread)。 ChildThread的Execute方法正在调用上述LoadLibrary。

© www.soinside.com 2019 - 2024. All rights reserved.