现在处于需要,使用了一个VC开发的多线程网络接口DLL,其中任何一个线程都与最初VB调用的进行初始化的线程不在同一个线程上下文中,但是,当网络上有动作的时候,该线程却要回调VB中的方法,据我所知,VB不是线程安全的,那么我这样回调会有什么问题么?如果必须进行回调该怎么办?做一个COM封装起来么?还是怎么样?哪位达人解释一下?
解决方案 »
- 麻烦大家帮我看看我自己弄的qq申请程序
- 如何禁止点击WebBrowser中网页的某些链接.
- 【问】如何在菜单弹出前分列呢?
- 如何在程序中直接连接扫描仪???
- 菜鸟问一个关于文件操作的问题
- 高分请教,窗体的状态问题,分不够可以再加。只要问题解决,再给二三百分都可以。
- 要使DataGrid的列宽不能改变,谁知道如何用程序实现呢?
- 关于datagrid控件的问题?
- VB与Excel的导入与导出问题?
- 将一个字符串通过写文件的方式写入 a.bat 文件中,但它将字符串的双引号都写入去了,请问如何只写入字符串的内容而不写入双引号?
- 一个比较高深的问题
- 为什么我的问题老是得不到大家重视?55555555。。。。。
另外,对于多线程回调,举个例子。在前1、2个月这里也有一位兄弟用到了多线程回调的东西。他在VC创建的线程中回调了VB的一个函数,而在VB函数里呢用到了复杂的控件ListView,于是产生了问题,我倒腾了好几天,最终使用全局对象变量大致上解决了这个问题。问题产生在VB调用TlsGetValue函数的时候返回了0(这是我用SoftIce跟踪到的),我在想这是否是因为VB函数在不同的线程环境中调用TlsGetValue,然后返回了存在于VB线程中,而不存在当前活动线程的本地线程存储信息。好了,例子完了,我都不知道我举这个例子干什么了,呵呵 ^_^ps. 那个帖子我找了半天,苦于这边网速太慢……所以,呵呵,放弃了
COM中的物理线程是经过包装的,所以如果有win32的线程试图直接去访问一个COM对象,会导致应用程序的崩溃。如果需要跨线程与COM对象交互,就必须首先调用COM库函数关联到COM对象的套间(Apartment),另外还需要提供列集(Mashal)的支持。最后,VB对象要么是单线程的(Single Threaded),要么是单元线程的(STA),这个可以从VB ActiveX Dll工程的编译选项里看到。而且由于STA的VB COM对象使用了TLS,所以就表现出一种线程亲和力(Thread Affinity),举例说明:所有声明在标准模块里的“全局变量”,实际上真正的作用域只是在本线程以内。