我在delphi上使用线程模型“both”创建了一个activex组件。它完美运行,直到我执行压力测试,创建50个或更多线程并开始在每个线程上创建activex。在完成执行一段时间之后的这种情况下,在AxCmps.TActivexComponentControl.Create内创建组件时会发生访问冲突错误,甚至没有到达我的组件初始化代码。发生异常的具体点是在TWinControl.Create上。
有没有人知道这是一个错误,还是我通过让多个线程创建一个具有“两个”线程模型的组件实例而做错了?
编辑:组件不是可视的(意味着它是一个不可见的活动x)
Edit2:如果我用一个临界区包装创建和释放组件,那么问题就不会发生
线程代码:
Coinitialize(nil);
try
for _j := 1 to LOOPS do
begin
try
CS.Enter;
_comp := MyComp.Create(nil);
CS.Leave;
try
CallMethods; //not synchronized
finally
CS.Enter;
_comp.Free;
CS.Leave;
end;
except
on E: Exception do
LogErrors(E);
end;
end;
finally
Couninitialize;
end;
答案 0 :(得分:0)
将我的组件的实现从TActiveXComponent更改为TAutoObject并更改相应的工厂后,在我的测试中停止发生访问冲突。我没有使用自动生成的包装类TMyComponent.Create,而是调用了CoMyComponent.Create。唯一的问题是,我无法通过界面挂钩事件。