我必须使用一个没有源的库,它也不处理异常。每当其中发生异常时,实际上包含的许多析构函数都不会返回。在应用程序中,我在异常处理程序中包含了一个标志,以检测 DLL 的错误状态。
- 我需要一些东西,以便我的程序在尝试销毁包含的对象时不会在销毁时卡在 DLL 中,因为析构函数永远不会返回或抛出异常。
或者
- 当这种情况出现时,我是否应该忽略破坏并希望操作系统清理僵尸?
我必须使用一个没有源的库,它也不处理异常。每当其中发生异常时,实际上包含的许多析构函数都不会返回。在应用程序中,我在异常处理程序中包含了一个标志,以检测 DLL 的错误状态。
或者
这两种选择都是可能的。
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 和所有用户界面的东西都出来了,需要在主线程(即程序本身)中处理。