2013-10-03 1 views
1

У меня есть компонент 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; 
+1

Абсолютно никакой шанс на выполнение кода, вызывающего 'TWinControl.Create' ни на одном потоке, кроме основного потока. Модель резьбы VCL запрещает это. –

+0

Мои тестовые вызовы MyComponent.Create при выполнении потока –

+0

Это как возможно. Вы знаете правила потока VCL? –

ответ

0

После изменения реализации моего компонента от TActiveXComponent к TAutoObject и изменения соответствующего завода, нарушение прав доступа происходит в остановил моих тестах. Вместо использования автоматически созданного класса-оболочки TMyComponent.Create я вызываю CoMyComponent.Create. Единственная проблема: я не могу перехватывать события через интерфейс.

 Смежные вопросы

  • Нет связанных вопросов^_^