У меня есть компонент activex, созданный с помощью модели threading «both» на delphi. Он отлично работает, пока я не выполняю стресс-тест, который создает 50 или более потоков и начинает создавать activex в каждом потоке. В этом случае после некоторого времени безупречного исполнения при создании компонента возникает ошибка нарушения доступа внутри AxCmps.TActivexComponentControl.Create, даже не достигнув кода инициализации моего компонента. Конкретная точка, в которой происходит исключение, находится в TWinControl.Create.Delphi ActiveXComponentFactory Нарушение доступа к многопоточному сценарию
Кто-нибудь знает, является ли это ошибкой, или если я ошибаюсь, если несколько потоков создают экземпляр компонента с «обеими» моделью потоков?
Edit: компонент разве визуального (означает, что он является невидимым активным х)
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;
Абсолютно никакой шанс на выполнение кода, вызывающего 'TWinControl.Create' ни на одном потоке, кроме основного потока. Модель резьбы VCL запрещает это. –
Мои тестовые вызовы MyComponent.Create при выполнении потока –
Это как возможно. Вы знаете правила потока VCL? –