我有一个简单的程序,它在一个单元的“初始化”中创建一个 OmniThread 工作池,并在该单元的“最终化”中销毁同一个池。只要我们不使用 EurekaLog,它就可以正常工作。如果我们包含 EurekaLog,则会在应用程序完成期间(关闭应用程序后)引发访问冲突。这种情况每 3 到 10 次程序结束才会发生一次;所以这似乎是某种时间问题。
如果我们在“正常”应用程序流程中创建工作池(而不是在单独单元的初始化和最终确定中) ,似乎一切正常。
本单元代码如下:
unit Unit1;
interface
uses
OtlParallel;
var
_Worker: IOmniBackgroundWorker;
implementation
initialization
_Worker := Parallel.BackgroundWorker.NumTasks(10)
.Execute(
procedure(const AWorkItem: IOmniWorkItem)
begin
//
end
);
finalization
_Worker.Terminate(INFINITE);
_Worker := nil;
end.
主要应用也很简单:
uses
{$IFDEF EurekaLog}
EMemLeaks,
EResLeaks,
EDebugExports,
EDebugJCL,
EFixSafeCallException,
EMapWin32,
EAppVCL,
EDialogWinAPIMSClassic,
EDialogWinAPIEurekaLogDetailed,
EDialogWinAPIStepsToReproduce,
ExceptionLog7,
{$ENDIF EurekaLog}
Vcl.Forms,
Unit1 in 'Unit1.pas';
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.Run;
end.
访问冲突的调用堆栈是:
:5653e4c4
OtlTaskControl.TOmniTask.Execute
OtlThreadPool.TOTPWorkerThread.ExecuteWorkItem($393A160)
OtlThreadPool.TOTPWorkerThread.Execute
System.Classes.ThreadProc($3976800)
EThreadsManager.NakedBeginThreadWrapper(???)
:76ee6359 KERNEL32.BaseThreadInitThunk + 0x19
:77628944 ntdll.RtlGetAppContainerNamedObjectPath + 0xe4
:77628914 ntdll.RtlGetAppContainerNamedObjectPath + 0xb4
我使用 OTL 和 EurekaLog 版本 7.9.1.4 update 1 hot-fix 4 的最新 master checkout。
我们创建和销毁工作池的方式是否正确?如果是这样,如果它们一起使用,是否有人熟悉 OTL/EurekaLog 中的问题?