У меня есть поток под названием 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;