我有一个线程,叫做TAlertThread。线程通过触发事件与其所有者进行交互。例如,当某些数据在线程中可用时,它设置一些临时变量并调用Synchronize(UpdateAlert),从而触发适当的事件。
现在这个线程在任何标准的windows应用程序中都可以完美地工作。我的问题是,当我把线程内的ActiveX形式(战术形式)。ActiveX控件(又名COM对象)然后嵌入到Windows桌面小工具中(通过HTML/Javascript)。我也有过这样的经历,小工具不是问题。ActiveX组件在其目标中工作良好,只是线程永远不会执行。它被调用的方式和我在App中调用它的方式完全一样。这是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;
我怀疑这可能正是您在您的Delphi版本中所经历的:
- http://soft-haus.com/blog/2009/02/10/codegear-borland-activex-threading-synchronization-problems/
引用了你引用的同一篇文章:
http://edn.embarcadero.com/article/32756
我不确定这是否有帮助…但我希望它能。至少有一点:)
PS:有什么特别的原因,你有使用com activex和/或战术形式?
根据这篇文章:http://edn.embarcadero.com/article/32756 web浏览器不允许通过ActiveX线程。然而,这仍然不能解释为什么它不能工作,当我把它放在一个c#应用程序。