当前位置: 首页 > 知识库问答 >
问题:

Delphi COM对象多线程

徐飞龙
2023-03-14

我已经编程一段时间了,关于COM/ActiveX对象,我面临着非常奇怪的问题,这些问题显然超出了我的知识范围。给你。我的软件使用后期绑定与COM对象进行通信。由于这些COM对象与硬件(例如scientific camera)进行通信,我选择将所有调用串联到一个专用线程中。这允许主线程与用户交互。因此,我将消息从主用户线程(或任何其他线程)发送到专门处理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/Server来说却失败了,尤其是用Visual Basic编写的,我在进程浏览器中注意到,尽管我上面做了什么,但ActiveX代码还是执行到了主线程中!结果导致-主线程保持-主线程内存损坏(例如大数组)...==我的应用程序崩溃

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

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

共有2个答案

段曦
2023-03-14

CreateOLEObject在内部使用CoCreateInstance,并通过将dwClsContext作为CLSCTX\u LOCAL\u服务器传递,应强制COM将任何DLL加载到特定的dllhost中。exe。我这里没有自己尝试的工具,但有了额外的包装,这可能会解决您的问题。

另请参见此问题。

鄢承运
2023-03-14

因为COM对象被分发到主胎面中,所以使用CoLaunalizeEx(nil,COINIT_MULTITHREADED)比使用CoLaunalizeEx(nil,<--plhd--0/>)更好。

 类似资料:
  • 现在我的问题是:关键字对这种情况有用吗?

  • 我已经面临这个问题很多天了,请帮我解决。我正在使用线程同步实现生产者-消费者示例。我在这个传统节目中做了一些调整。我没有只使用一个队列对象,而是使用了两个队列对象。但程序不起作用。。(PS-我知道我可以通过只使用队列的一个对象来让这个程序工作,但如果我想使用两个队列对象呢??) 类队列{ } 类生产者实现Runnable{ } 类消费者实现可运行{ } 公共类测试队列{ }

  • 如果我有多个线程,每个线程使用injector获取EntityManager对象,每个线程使用em对象选择其他类对象的列表。准备好在for循环中使用。 如果一个线程首先完成并调用clear(),这会影响其他线程吗?比如for循环会有异常? 谢谢你。

  • 本文向大家介绍.net面向对象之多线程(Multithreading)及 多线程高级应用,包括了.net面向对象之多线程(Multithreading)及 多线程高级应用的使用技巧和注意事项,需要的朋友参考一下 在.net面向对象程序设计阶段在线程资源共享中的线程安全和线程冲突的解决方案;多线程同步,使用线程锁和线程通知实现线程同步,具体内容介绍如下: 1、 ThreadStatic特性 特性:[

  • 问题内容: 我有一个对象,其内部可变状态正在由一个或多个线程不断更新。对象已同步,目标是从另一个线程定期保存其状态(通过序列化): 问题: 在这种情况下,序列化安全吗? 它是如何工作的?也就是说,执行序列化是否会阻塞直到不再有线程运行? 如果同步不使用固有锁,而是使用其他锁怎么办? 问题答案: 在这种情况下,序列化安全吗? 否。正如@Tom Hawtin所说,您将需要执行自己的锁定,以确保在序列化

  • 我正在开发利用RxJava、realm和改进的应用程序。 我需要创建非常具体的数据处理链。我需要在io调度程序上执行改装调用,然后在我的自定义单线程领域调度程序上处理提供的数据,然后将结果推送到主线程调度程序上的ui。我试图通过使用多个组合来实现这一点,包括观察(observeOn)和订阅(subscribeOn),但我无法让中间部分在调度程序(scheduler)上执行。 我的目标是这样的