我必须使用没有源的库,它也不处理异常。每当在其中发生异常时,实际上包含的许多析构函数都不会返回。在应用程序中,我在异常处理程序中包含一个标志来检测DLL的错误状态。
OR
答案 0 :(得分: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和所有用户界面的东西都已经出来了,那些需要在主线程中处理(即程序本身)。