0

我必须使用一个没有源的库,它也不处理异常。每当其中发生异常时,实际上包含的许多析构函数都不会返回。在应用程序中,我在异常处理程序中包含了一个标志,以检测 DLL 的错误状态。

  • 我需要一些东西,以便我的程序在尝试销毁包含的对象时不会在销毁时卡在 DLL 中,因为析构函数永远不会返回或抛出异常。

或者

  • 当这种情况出现时,我是否应该忽略破坏并希望操作系统清理僵尸?
4

1 回答 1

0

这两种选择都是可能的。

1-尝试销毁对象
如果您想推测性地调用DLL中的例程,则必须将其放在单独的线程中。使平均线程进入睡眠状态,如果调用未在规定时间内返回,则假定它挂起。

2- 结束程序
Windows 将清除程序在终止时使用的所有内存和 GDI 对象。
如果您有打开的文件,其中数据尚未被清除,则在那里丢失数据,因此根据应用程序的性质,这可能是一个坏主意。

以下是如何在单独的线程中进行清理:

interface

....

TCleanUpThread = class(TThread)
  procedure Execute; override;
end;

implementation

procedure TCleanUpThread.Execute;
var
  Status: integer;
begin
  Status:= FirstDllCleanUp;
  LogProgress('first cleanup is done, statuscode: '+IntToStr(Status));
  Status:= SecondDllCleanUp;
  LogProgress('Second cleanup is done, statuscode: '+IntToStr(Status));
  ....
end;

procedure TForm1.TryCleanup;
const
  StartNow = false;
var
  CleanUpThread: TCleanUpThread;
begin
  CleanUpThread:= TCleanUpThread.Create(StartNow);
  Sleep(1000); // wait a while to see if clean exit occurs
  if not(CleanUpThread.Terminated) then begin
    //Take measures if needed, depending on the logged data.
  end;
end; //Continue with the shutdown from here.  

警告
请注意,您不能调用synchronize,否则您的线程将不再并行运行。另请注意,您不能在代码中添加更多线程不安全调用。所有 GDI 和所有用户界面的东西都出来了,需要在主线程(即程序本身)中处理。

于 2014-01-29T17:06:28.177 回答