多线程场景下的Delphi ActivexComponentFactory访问冲突

时间:2013-10-03 12:23:51

标签: multithreading delphi activex access-violation

我在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;

1 个答案:

答案 0 :(得分:0)

将我的组件的实现从TActiveXComponent更改为TAutoObject并更改相应的工厂后,在我的测试中停止发生访问冲突。我没有使用自动生成的包装类TMyComponent.Create,而是调用了CoMyComponent.Create。唯一的问题是,我无法通过界面挂钩事件。