我写了一个VCL,将其转为OCX后,多线程同步出现了问题。
在VCL中是正常的,在OCX中就出问题了。
具体描述如下:
有一个SOCKET的辅助线程,通过synchronize(DispatchMsg)同步一个消息分发的过程,其中DispatchMsg是SOCKET的辅助线程中的一个无参数过程,其作用是将消息分发给主线程处理;
当程序运行到synchronize时,SOCKET的辅助线程就好象阻塞了,消息也没有成功地通过DispatchMsg分发给主线程去处理;
但是当使用OCX的应用程序退出时消息反而成功地分发给主线程去处理了,真是奇怪!
在VCL中是正常的,在OCX中就出问题了。
具体描述如下:
有一个SOCKET的辅助线程,通过synchronize(DispatchMsg)同步一个消息分发的过程,其中DispatchMsg是SOCKET的辅助线程中的一个无参数过程,其作用是将消息分发给主线程处理;
当程序运行到synchronize时,SOCKET的辅助线程就好象阻塞了,消息也没有成功地通过DispatchMsg分发给主线程去处理;
但是当使用OCX的应用程序退出时消息反而成功地分发给主线程去处理了,真是奇怪!
看过这篇文章,感觉还是不行,怎么解决的还是不明确
外部容器是否使用了多线程?
外部容器创建OCX的线程消息循环会不会被挂起?
DispatchMsg通过什么样的方式去分发消息给主线程,注意DispatchMsg本身就在主线程上执行。
...
在OCX里使用多线程需要非常小心,VCL里Synchronize同步机制的实现太复杂了 尽量不要使用,改用自己能比较明确的同步手段会比较好。
另外OCX里组件的COM线程模型是APARTMENT,要弄明白它的实现机理。
Synchronize不应该在OCX项目里使用。
DispatchMsg是在辅助线程里的,
如果不用synchronize的话,还有别的方法能替代吗?我也一直不明白OCX里组件的COM线程模型的区别,存在几中:apartment ,single,both ...,不知与所选择的线程模型是否有影响?
当需要主线程进行处理的话 可以使把消息SendMessage到一个主线程上创建的窗口。
因为跨线程的SendMessage是自动同步的 所以这种情况不需要进行额外的同步。通常在同一进程进行线程同步的手段是使用临界区(TCriticalSection,uses SyncObjs)。关于COM的线程模型在网上可以找到不少资料,不过如果只是在COM对象内部使用线程的话,跟线程模型的关系并不大。