Delphi - Поток не выполняется в форме ActiveX - но выполняется в другом месте - PullRequest
5 голосов
/ 29 октября 2011

У меня есть тема, которая называется TAlertThread. Поток взаимодействует со своим владельцем, вызывая события. Например, когда определенные данные доступны внутри потока, он устанавливает некоторые временные переменные и вызывает Synchronize (UpdateAlert), который, в свою очередь, вызывает соответствующее событие.

Теперь поток отлично работает в любом стандартном приложении Windows. Моя проблема, когда я помещаю этот поток в форму ActiveX (TActiveForm). Элемент управления ActiveX (он же COM-объект) затем внедряется в гаджет рабочего стола Windows (через HTML / Javascript). У меня тоже есть опыт с этим, гаджет не проблема. Компонент ActiveX прекрасно работает по назначению, за исключением того, что поток никогда не выполняется. Он даже называется точно так же, как я назвал его из приложения.

Это какое-то ограничение в ActiveX, блокирующее выполнение потоков? Я бы так не думал, потому что другие вещи, которые требуют внутренних потоков (например, TADOConnection), работают. Я на самом деле правильно называю CoInitialize и CoUninitialize соответственно. Опять же, прекрасно работает в приложении, но не работает вообще в ActiveX.

Вот как я называю эту тему ...

procedure TRMPDashXS.ExecThread;
begin
  //Thread created suspended
  lblStatus.Caption:= 'Executing Thread...'; 
  fThread:= TAlertThread.Create(fConnStr); //fConnStr = connection string
  fThread.Priority:=      tpIdle;
  fThread.OnConnect:=     Self.ThreadConnected;
  fThread.OnDisconnect:=  Self.ThreadDisconnected;
  fThread.OnBegin:=       Self.ThreadStarted;
  fThread.OnFinish:=      Self.ThreadFinished;
  fThread.OnAlert:=       Self.ThreadAlert;
  fThread.OnAmount:=      Self.ThreadAmount;
  fThread.Resume; //Execute the thread
end;

Ответы [ 2 ]

7 голосов
/ 30 октября 2011

Я подозреваю, что это может точно описать то, что вы испытываете в вашей версии Delphi:

Я не уверен, поможет ли это ... но я надеюсь, что это поможет.По крайней мере, немного:)

PS: Есть ли какая-то конкретная причина, по которой у вас есть для использования Com / ActiveX и / или TActiveForm?

0 голосов
/ 30 октября 2011

Согласно этой статье здесь: http://edn.embarcadero.com/article/32756 веб-браузеры не поддерживают многопоточность через ActiveX. Однако это все еще не объясняет, почему это не работает, когда я помещаю это в приложение C #.

...