1

Delphi でスレッド モデル「両方」を使用して作成されている 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;
4

1 に答える 1

0

コンポーネントの実装を TActiveXComponent から TAutoObject に変更し、対応するファクトリを変更した後、テストでアクセス違反が発生しなくなりました。自動生成されたラッパー クラス TMyComponent.Create を使用する代わりに、CoMyComponent.Create を呼び出しました。唯一の問題は、インターフェイスを介してイベントをフックできないことです。

于 2013-10-04T16:54:47.333 に答える