我遇到了以下问题:当从多个线程并行调用DLL函数时,我得到"EAggregateException:出现一个或多个错误“。
最小的DLL示例如下:
library MyDLL;
uses
System.SysUtils;
procedure MyUpper(const ASource: WideString; out AResult: WideString); stdcall;
begin
AResult := String(ASource).ToUpper;
end;
exports
MyUpper;
end.使用它的应用程序:
program MyEXE;
uses
System.SysUtils,
System.Threading;
procedure MyUpper(const AText: WideString; out AResult: WideString); stdcall; external 'MyDLL.dll';
procedure Test;
var
LLoop: TParallel.TLoopResult;
LSync: IReadWriteSync;
begin
LSync := TSimpleRWSync.Create;
LLoop := TParallel.&For(1, 100000,
procedure (AIndex: Integer)
var
LResult: WideString;
begin
MyUpper(AIndex.ToString, LResult);
end);
Writeln('Completed: ', LLoop.Completed);
end;
begin
try
Test;
except
on E: Exception do
Writeln(E.ClassName + ': ' + E.Message);
end;
Readln;
end.如果在EXE中,我编写了以下代码:
AResult := ASource;则执行成功。但是一旦我使用了任何隐式/显式字符串转换,它就会失败。这怎么可能呢?每个线程将此方法作为常规方法与其本地堆栈一起调用,并且没有共享变量(至少是可见的)。
我不使用任何共享内存管理器,因为我将使用来自不同编程语言的DLL。
我做错了什么?
提前谢谢你。
发布于 2018-01-09 20:46:57
如果假设在多线程环境中使用DLL,则在库的初始化部分中放入以下代码行:
IsMultiThread := True;https://stackoverflow.com/questions/48168154
复制相似问题