现在处于需要,使用了一个VC开发的多线程网络接口DLL,其中任何一个线程都与最初VB调用的进行初始化的线程不在同一个线程上下文中,但是,当网络上有动作的时候,该线程却要回调VB中的方法,据我所知,VB不是线程安全的,那么我这样回调会有什么问题么?如果必须进行回调该怎么办?做一个COM封装起来么?还是怎么样?哪位达人解释一下?

解决方案 »

  1.   

    我在这方面认识还很浅,所以这里只是谈谈我粗浅的个人想法,希望能够有高高手来指正 ^_^简单的说,如果同时有多个线程要操作一个对象或属性或变量,肯定会出现问题。所以必须要有一定的保证一个时间只有一个线程获得操作权,这一点应该可以用信号或者自定义的全局标志来做到。
    另外,对于多线程回调,举个例子。在前1、2个月这里也有一位兄弟用到了多线程回调的东西。他在VC创建的线程中回调了VB的一个函数,而在VB函数里呢用到了复杂的控件ListView,于是产生了问题,我倒腾了好几天,最终使用全局对象变量大致上解决了这个问题。问题产生在VB调用TlsGetValue函数的时候返回了0(这是我用SoftIce跟踪到的),我在想这是否是因为VB函数在不同的线程环境中调用TlsGetValue,然后返回了存在于VB线程中,而不存在当前活动线程的本地线程存储信息。好了,例子完了,我都不知道我举这个例子干什么了,呵呵 ^_^ps. 那个帖子我找了半天,苦于这边网速太慢……所以,呵呵,放弃了
      

  2.   

    恩,是这样的,多线程环境下一般来说要解决同步问题都是采用锁的形式,锁一般我比较常用的包括临界区和Event,但是这两个在VB中都没法用,或者说,用了也没什么用,因为我需要回调VB中的函数,而回调本身这个操作是发生在DLL中的线程的环境中的,很显然,一般情况下这都会出现问题,除非在回调函数中访问的控件可以自同步,所以很头疼。各位达人,有人作过类似的东西的么?
      

  3.   

    提供一些信息参考
    COM中的物理线程是经过包装的,所以如果有win32的线程试图直接去访问一个COM对象,会导致应用程序的崩溃。如果需要跨线程与COM对象交互,就必须首先调用COM库函数关联到COM对象的套间(Apartment),另外还需要提供列集(Mashal)的支持。最后,VB对象要么是单线程的(Single Threaded),要么是单元线程的(STA),这个可以从VB ActiveX Dll工程的编译选项里看到。而且由于STA的VB COM对象使用了TLS,所以就表现出一种线程亲和力(Thread Affinity),举例说明:所有声明在标准模块里的“全局变量”,实际上真正的作用域只是在本线程以内。