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;