У меня есть тема, которая называется 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;