multithreading - Delphi COM 对象多线程

标签 multithreading delphi com

我已经编程了一段时间,关于 COM/ActiveX 对象,我面临着非常奇怪的问题,这显然超出了我的知识范围。 这里是。 我的软件使用后期绑定(bind)与 COM 对象通信。 由于这些 COM 对象与硬件(例如科学相机)通信,因此我选择将所有调用序列化到专用线程中。这允许主线程与用户交互。 因此,我将消息从主用户线程(或任何其他线程)发送到专门处理 activeX 的线程。

这是它的样子

<小时/>

procedure MythreadActiveX.execute;
begin

  CoInitialize(nil);
  Try

  ComObject       :=CreateOLEObject(COMID);

  While not Terminated do
  Begin

  If PeekMessage(Msg,0,0,0,PM_REMOVE) then 
    Begin
     TranslateMessage(Msg); 
     DispatchMessage (Msg); 
    end;

    If (FEvent.WaitFor(TimOutMs)=wrSignaled) then   // Wait for command
    Begin

      FEvent.ResetEvent;

      Try

      Case COM_Order of
          Oder1:Begin
                 .........
                end    
          Oder2:Begin
                 .........
                end    
      end;

      FEventComplete.SetEvent;

    end;
   end; 

   CoUnInitialize;
end;

这对大多数 COM 服务器来说都是一种魅力,但对其他 COM DLL/服务器来说却失败了,特别是用 Visual Basic 编写的,我注意到进程资源管理器中的 ActiveX 代码被执行到主线程中,尽管我做了什么多于 ! 结果导致 - 主线程保持不变 - 主线程内存损坏(例如大数组)...==我的应用程序崩溃

是什么原因造成的?这与 ActiveX 线程模型有关吗? 我想理解并更正我的代码以应对这种情况(在这种情况下,COM 应在主线程中运行......)

谢谢 (因为我花了时间在这上面,所以我准备提供更多信息以便理解)

最佳答案

使用 CoInitializeEx(nil,COINIT_MULTITHREADED) 比 CoInitialize 更好...因为 COM 对象被分派(dispatch)到主线程中。

关于multithreading - Delphi COM 对象多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18348867/

相关文章:

android - 想要延迟 1 秒显示数字

delphi - 如何修改Delphi TDBGrid中的单元格值

c++ - IShellDisptach:为什么 FolderItemVerbs::Release() + CoUninitialize() 会崩溃?

excel - 使用 VBScript 以独占模式打开 Excel 文件

c# - 无法创建具有复杂编程链的 ADODB.Connection

c# - BlockingCollection 在 10 秒内不会重试

c# - 来自后台 worker 冲突的查询?

c++ - 多线程应用程序中无锁队列的访问冲突

delphi - 虚拟字符串树 - 当父节点隐藏时显示子节点

delphi - 如何将一个类实例的属性复制到同一类的另一个实例?