我写了一个VCL,将其转为OCX后,多线程同步出现了问题。
在VCL中是正常的,在OCX中就出问题了。
具体描述如下:
有一个SOCKET的辅助线程,通过synchronize(DispatchMsg)同步一个消息分发的过程,其中DispatchMsg是SOCKET的辅助线程中的一个无参数过程,其作用是将消息分发给主线程处理;
当程序运行到synchronize时,SOCKET的辅助线程就好象阻塞了,消息也没有成功地通过DispatchMsg分发给主线程去处理;
但是当使用OCX的应用程序退出时消息反而成功地分发给主线程去处理了,真是奇怪!

解决方案 »

  1.   

    http://blog.csdn.net/formiss/archive/2007/04/10/1559127.aspx 线程处理过程分析,
    看过这篇文章,感觉还是不行,怎么解决的还是不明确
      

  2.   

    看起来就是主线程的消息处理循环被阻塞了 原因可能会比较复杂,比如
    外部容器是否使用了多线程?
    外部容器创建OCX的线程消息循环会不会被挂起?
    DispatchMsg通过什么样的方式去分发消息给主线程,注意DispatchMsg本身就在主线程上执行。
    ...
    在OCX里使用多线程需要非常小心,VCL里Synchronize同步机制的实现太复杂了 尽量不要使用,改用自己能比较明确的同步手段会比较好。
    另外OCX里组件的COM线程模型是APARTMENT,要弄明白它的实现机理。
      

  3.   

    刚看了你链接的文章,这样说来就一个原因很明确了
    Synchronize不应该在OCX项目里使用。
      

  4.   

    to graycarl(gray)谢谢你的回复!DispatchMsg中调用的是dispatch(),dispatch将消息分发给另一个对象去处理,
    DispatchMsg是在辅助线程里的,
    如果不用synchronize的话,还有别的方法能替代吗?我也一直不明白OCX里组件的COM线程模型的区别,存在几中:apartment ,single,both ...,不知与所选择的线程模型是否有影响?
      

  5.   

    to graycarl(gray) 那OCX里通过什么方法解决多线程的同步问题呢?OCX终究应该还是可以处理多线程的吧
      

  6.   

    TObject.dispatch并不能将消息派发到另一个线程上执行
    当需要主线程进行处理的话 可以使把消息SendMessage到一个主线程上创建的窗口。
    因为跨线程的SendMessage是自动同步的 所以这种情况不需要进行额外的同步。通常在同一进程进行线程同步的手段是使用临界区(TCriticalSection,uses SyncObjs)。关于COM的线程模型在网上可以找到不少资料,不过如果只是在COM对象内部使用线程的话,跟线程模型的关系并不大。