社区
COM/DCOM/COM+
帖子详情
*****看来VB6.0也能有安全的多线程*****
Gutta
2006-06-25 02:21:10
在ActiveX EXE工程属性中选择 每个对象对应一个线程
我现在写了一个类用于处理文件的类(用Timer来实现异步).
在客户程序中,要同时处理4个文件,然后生成了处理文件类的四个实例,那么就是在ActiveX EXE进程中开了四个线程,经过测试程序运行非常稳定,但是我比较困惑的是"VB6.0"中不能实现安全的自由线程,但是像我所说的多线程是安全可靠的吗???
请指教~~!!
...全文
1100
21
打赏
收藏
*****看来VB6.0也能有安全的多线程*****
在ActiveX EXE工程属性中选择 每个对象对应一个线程 我现在写了一个类用于处理文件的类(用Timer来实现异步). 在客户程序中,要同时处理4个文件,然后生成了处理文件类的四个实例,那么就是在ActiveX EXE进程中开了四个线程,经过测试程序运行非常稳定,但是我比较困惑的是"VB6.0"中不能实现安全的自由线程,但是像我所说的多线程是安全可靠的吗??? 请指教~~!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
21 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
hbjmdx008
2006-08-07
打赏
举报
回复
学习
Gutta
2006-07-21
打赏
举报
回复
开销大有什么关系,现在的计算机又不是64M内存,赛扬133的CPU。
DLL是进程内部件,是不能用定时器来实现模拟的多任务并行操作的,而ActiveX EXE则刚刚好弥补了这个不足,有一点就是费点资源而已,不过对于现在的计算机来说也没有什么关系了。
楼主可以去看看Access这个数据库软件,微软就用多了这个ActiveX EXE的东西,一打开一个表,一打开一个数据库都是一个新的进程(可以在任务管理器中看到),当然我这个系统不能和它相比,不过我只是想说用这个技术也是很普遍的,所以上楼的先搞清楚怎么实现,然后再来进行优化把开销给尽量减小才是上策。
要是在公司做项目的时候,做不出来就很可能要走人了,所以这是生存问题,不是口舌之争。
qjwxsd
2006-07-07
打赏
举报
回复
进程的开销比线程大多了,以前看过一个在DLL里用定时器实现的代码,我也试了一下,结果不行,盼大侠指点。
qjwxsd
2006-07-07
打赏
举报
回复
DLL里面不能写都是扯蛋@
qjwxsd
2006-07-07
打赏
举报
回复
看是看了N多这样的帖子了
VBToy
2006-07-04
打赏
举报
回复
mark
VirtualDesktop
2006-07-04
打赏
举报
回复
《Advance Visual Basic》
一笑拔剑
2006-06-30
打赏
举报
回复
楼上的想法不错
具体代码能欣赏么?
RayLynn
2006-06-30
打赏
举报
回复
呵呵,你说的方法我就正在用了。
我的思路是这样:
1、建立一个ActiveX EXE工程,将工程属性的线程模块设置成“每个对象对应一个线程”
2、其次将新建一个操作类,继承(将模块做为属性)我另外设计的一个将Timer封装起来的虚拟线程模块。
3、在应用时使用 CreateObject() 方法来创建该对象。即可`
这种方法可以建立非常稳定高效的多线程程序,只不过多了一个进程而已。
重复创建对象可以新建多个线程。在线程查看器中可以非常清楚的看到活动状况`
Gutta
2006-06-30
打赏
举报
回复
好好好,只要稳定就好,多了一个进程关系不大。
谢谢
Tiger_Zhao
2006-06-29
打赏
举报
回复
推荐一本书 《Advance Visual Basic》(有中文版),里面有许多 VB6 “不可能”的功能实现。
一笑拔剑
2006-06-28
打赏
举报
回复
那个和共享资源是一回事么?
要写个vb的多线程分块下载就知道了
呵呵
viena
2006-06-28
打赏
举报
回复
//"VB6.0"中不能实现安全的自由线程
毫无疑问
自由线程是各线程可以共享资源的,而VB中只能有互相隔绝的单元线程
迈克揉索芙特
2006-06-28
打赏
举报
回复
to 维也纳老大:
在窗体内声明模块级的整形变量,第1个线程负责循环累加,第2个线程负责循环把结果列出来。
这就是您说的共享资源吧?共享了一个变量嘛。VB可以做到。
迈克揉索芙特
2006-06-28
打赏
举报
回复
如果能力过硬,vb是可以写出稳定的多线程。
一笑拔剑
2006-06-28
打赏
举报
回复
timer只是模拟多线程
和真正的多线程是有区别的
一笑拔剑
2006-06-28
打赏
举报
回复
多线程vb只能靠api达到
呵呵
当然相对要烂一点了
:)
Gutta
2006-06-28
打赏
举报
回复
尽管比较复杂,慢慢看。
总之,多进程实现还是比较稳定最重要。
迈克揉索芙特
2006-06-26
打赏
举报
回复
COM组件中的线程模式
1、提及COM的线程模式,实际上指的是两个方面,一个是客户程序的线程模式,一个是组件所支持的线程模式。客户程序的线程模式只有两种,单线程公寓(STA)和多线程公寓(MTA)。组件所支持的线程模式有四种:Single(单线程)、Apartment(STA)、Free(MTA)、Both(STA+MTA)。
2、公寓只是个逻辑上的概念。一个STA只能包含一个线程,一个MTA可以包含多个线程。一个进程可以包含多个STA,但只能有一个MTA。MTA中各线程可以并行的调用本公寓内实例化的组件,而不需要进行调度。跨公寓调用组件实例必须要进行调度。(除非使用了自由线程调度器)。
3、客户程序的线程是在调用CoInitializeEx()时决定客户线程的类型的。如果以参数 COINIT_APARTMENTTHREADED调用,则会创建一个STA公寓,客户线程包含在这个公寓里。如果以参数COINIT_MULTITHREADED调用,则创建一个MTA公寓,把线程加入到这个MTA中;如果进程内已经有了一个MTA,则不创建新的MTA,只把线程加入到已有的MTA。注意每个线程都必须调用CoInitializeEx()才能使用COM组件。
4、线程最重要的是同步问题。STA是通过窗口消息队列来解决这个问题的。当客户线程以 COINIT_APARTMENTTHREADED调用CoInitializeEx()时,将为会该STA创建一个具有 OleMainThreadWndClass窗口类的隐含窗口。所有对在这个公寓中建立的COM对象方法的调用都将都放到这个隐含窗口的消息队列中。所以每一个与STA相关联的线程必须用 GetMessage、DispatchMessage或类似方法来分派窗口消息。MTA内各线程可并行调用同一个组件对象的实例,从而不保证安全性,所以实现同步访问的责任就落在了组件身上。注意,STA的同步是公寓级的,就是说对公寓内不同组件的访问都要放到同一个消息队列中,对一个实例的方法调用会影响对其他实例的调用,所以并发程度很低。
5、在不同公寓间传递接口指针必须要经过调度。这主要还是为了同步对组件的调用。通过CoMarshalInterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream实现。很简单。
6、Single型组件很特殊,它只能在一个单一的线程中执行。首先要说明的是一个进程中第一个以COINIT_APARTMENTTHREADED调用CoInitializeEx()的线程被称作是主STA。每次用CoCreateInstance()创建的Single型组件实际上都是创建在了这个主STA中,而不管是谁调用了CoCreateInstance()这个函数。所有对这个Single组件方法的调用都必须要通过这个主STA。
7、若STA创建STA型组件,是直接创建,直接调用。
若STA创建MTA型组件,系统为组件创建一个MTA,STA通过代理访问组件。
若STA创建Both型组件,是直接创建,直接调用。
若MTA创建STA型组件,系统为组件创建一个STA,MTA通过代理访问组件。
若MTA创建MTA型组件,是直接创建,直接调用。
若MTA创建Both型组件,是直接创建,直接调用。
可见如果客户程序和组件都支持同样的线程模式,那么COM就允许客户程序直接调用对象,这样将产生最佳性能。
8、Both型组件已经很好了,无论是STA还是MTA都可以直接创建调用它。但跨公寓的调用仍然要经过代理。为了更进一步以获得最佳性能,可以使用自由线程调度器(FTM)。注意其它类型的组件也可以使用FTM,只是由Both使用FTM可获得是最佳效果。FTM实现了接口IMarshal,当调度那两个调度接口指针的函数时,这两个函数(见5)内部调用IMarshal内的相关函数,并判断如果调度发生在一个进程内的公寓之间则直接返回接口指针;
如果调度发生在进程之间或者远程计算机间,则调用标准的调度器,并返回指向代理对象的指针。所以可见使用FTM,即使是公寓之间也不用调度接口指针了!!
9、FTM虽然好,但使用FTM的组件必须遵守某些限制:使用FTM的对象不能直接拥有没有实现FTM的对象的接口指针;使用FTM的对象不能拥有其他公寓对象代理的引用。
10、全局接口表(GIT)。作用范围是进程内。可以把接口指针存进表中,然后在别的公寓内把其取出,GIT自动执行公寓间的调度,所以很方便。GIT是通过IGlobalInterfaceTable访问的。通过创建CLSID为CLSID_StdGlobalInterfaceTable的对象可调用它。
迈克揉索芙特
2006-06-26
打赏
举报
回复
你说的并不是真正的多线程,是多进程。算是可靠的。
其实,vb可以实现真正的多线程,但是很不稳定。
不过,通过一些技巧,是可以实现安全多线程的。
偶正在研究,受IDE环境影响,在在设计状态肯定是不稳定的,能够在编译后稳定的运行并退出,目前基本可行。
简要分析
VB
6.0和
VB
.NET区别
现在随着
VB
.NET的发展,大部分人都放弃使用
VB
6.0而选择
VB
.NET,下面我们就来研究一下
VB
6.0和
VB
.NET的区别。
VB
.NET是微软公司在2002年推出的一种开发基于.Net平台应用程序的开发语言,也是微软公司极力推荐的一种开发.Net平台应用程序的开发语言。首先还是让我们来简单了解一下
VB
.NET和其前一个版本,也是目前世界上拥有最多使用者的开发语言--
VB
6.0的主要区别。 ...
如何在
VB
6里面实现稳定的多
线
程 -- 转载
如何在
VB
6里面实现稳定的多
线
程 转载自: http://www.m5home.com/bak_blog/article/54.html 作者:admin 日期:2008-02-25 字体大小: 小 中 大 微软官方给出的方案在MSDN里面有说,就是使用ActiveX EXE那种"单元
线
程模型". 我也曾经试过,的确可以实现"多
线
程",只是由于要多一个EXE,比较麻烦,后来就没有深入...
如何在
VB
6里面实现稳定的多
线
程-----受人启发而写
微软官方给出的方案在MSDN里面有说,就是使用ActiveX EXE那种"单元
线
程模型".我也曾经试过,的确可以实现"多
线
程",只是由于要多一个EXE,比较麻烦,后来就没有深入了.结果一次无意中在
VB
GOOD中看到一段代码,才打通了一个关节:为什么不直接使用ActiveX EXE写程序呢?!那段代码里面,是直接使用这种工程类型,然后在工程内使用CreateObject来生成一个新对象,
vb
和
vb
.net的区别
现在随着
VB
.NET的发展,大部分人都放弃使用
VB
6.0而选择
VB
.NET,下面我们就来研究一下
VB
6.0和
VB
.NET的区别。
VB
.NET是微软公司在2002年推出的一种开发基于.Net平台应用程序的开发语言,也是微软公司极力推荐的一种开发.Net平台应用程序的开发语言。首先还是让我们来简单了解一下
VB
.NET和其前一个版本,也是目前世界上拥有最多使用者的开发语言--
VB
6.0的主要区别。
VB
6.0和
VB
.NET的主要区别简介: 虽然说
VB
.NET是
VB
6.0的后继版本,但在我看来
VB
.NET除了
浅谈
VB
6逆向工程
前言
VB
的编译有两种方式,一种是P-Code方式,一种是本机代码。P_Code方式是
VB
从早期版本保留下来的,也是比较难逆向的一种。而本机代码方式编译的程序已经 和VC很接近了。这里只探讨以本机代码方式编译的程序。由于微软在
VB
的实现方面 的资料很少,使人觉得
VB
的逆向比较难。其实掌握一些规律,
VB
的程序还是很容易 入门的。 这里所提到的知识都是个人的经验,没有什么官方的资料
COM/DCOM/COM+
863
社区成员
3,659
社区内容
发帖
与我相关
我的任务
COM/DCOM/COM+
VB COM/DCOM/COM+
复制链接
扫一扫
分享
社区描述
VB COM/DCOM/COM+
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章