【分享】VB6里面多线程工程的正常退出问题
与大家分享一下:
//
这几天接了一个单子,是做一个客服系统的客服端,服务器端与用户端都是现成的.
之前的客服端比较"卡",因为与服务器的通讯是采用同步POST与GET方式同网页交互.如果网速不理想或服务器响应不及时,那么在提交过程中当前线程会挂起.
由于普通EXE工程中UI与代码都是在同一线程里的,所以提交时整个程序就卡了.....
异步的话,整个工程结构又要有大改变.
于是我对此工程进行了多线程改造,使用ActiveX EXE的单元模型线程来工作.
单元线程虽然在线程间调度的开销比较大,但是我又不是大量地使用它,因此在当前条件下开销不是问题.
经过改造后,工程本身结构没有大的改变,却拥有非常爽的界面,真的很爽~~~
不过后来编译后,又有一个问题来了:程序不能正确退出,必须结束进程.
这算哪门子问题?我把所有处于单独线程的对象都正确的释放了啊!
弄了一个晚上,都没有结果.
试过遍历Forms集合,卸载所有窗体;而窗体里每个对象的释放也都是正确的.
可没用.
我甚至在程序里调用ExitProcess,仍然没用.
最终在任务管理器里看,线程总是还有那么几个多余的.
真的是怪了!!
后来到了两点左右,肚子也饿了,就啃了点饼.
啃着啃着,突然想到,Forms集合是不是没用了?
因为这是"单元",当一个单元创建后,在别的单元里创建的公共对象,比如将某窗体Show出来了,那么在本单元内,应该仍然是不可见的!
有思路了,就马上改代码,把那个For Each In Forms的遍历循环改成手工UNLOAD每一个窗体.
编译,运行,退出---------------哈!行了!
原来,在创建单元时,是把当前的环境"复制"一份到单元里面;因此当一个单元创建成功后,单元外的环境如果改变了,对于已经创建的单元来说,是没有改变的!
怪不得MSDN里也说,"每个线程有一份自己的全局数据副本,这意味着不能使用全局数据在不同线程的对象之间进行通讯".
这个问题,应该算是弄明白了吧:)
收获不小.
PS:
大家觉得VB6的这种多线程的优点在哪?缺点在哪?
[解决办法]
学习
[解决办法]
优点:稳定 缺点:占用资源太多
[解决办法]
你把For Each In Forms的遍历循环改成手工UNLOAD每一个窗体,有点不可思议。本质上是没有区别,这里面肯定有名堂!
至于优点:就是速度快,但不稳定;缺点是占用资源太多。
WMP控件就是一个多线程的,用WMP播放比用MCI命令播放占用的资源明显多得多!
[解决办法]
多线程通信需要做好线程同步,全局变量保护等操作...
[解决办法]
看了下 你们说的,我想开销大概就是老马说的'全局'副本吧
[解决办法]
我来接分的
[解决办法]
我看了,CPU开销很高,50%以上,跟没用doevents有关。
[解决办法]
jf
[解决办法]
还没正儿八经搞过多线程呢,向老马学习!
[解决办法]
[解决办法]
顶一个
[解决办法]
[解决办法]
多线程的问题还没整过,学习
[解决办法]
老马我有几个问题:
1.怎么在你这个程序中加入MDI窗体
2.怎么定义带有WITHEVENTS对像数组
[解决办法]
我做过一个完整的这类系统(资讯通)
全部工程只有二部份组成
1.客户端:是一个飘浮旗帜广告,由js完成,利用ajax与MS-SQL2000进行联系,这样做的优势在于软件不管卖给谁,都与购者买网站无关,当然了,如果他的web不支持ajax那就....... 客户端脚本由服务器端配置好数据库IP后自动生成!放到网站上去就成 :)
2.服务端:由纯VB6.0完成,利用到了多线程来监听99999端口数据流量,当有数据流量时即与数据库发生关联,读取即时数据到UI
实际出售时,客户将只拿到一个服务器端,以及一本说明书.
[解决办法]
老马的整个过程,一直在消耗内存,如果可以的话,你可以将你的生成代码,用循环来做看看可以创建多少个线程
------解决方案--------------------
UP
[解决办法]
哇!最近就研究多线程了,上次有关多线程的小问题还多亏老马帮助,在我眼中,此贴更是石破天惊啊!
谁说VB不如人,那要看用的是什么人
[解决办法]
嘿嘿,刚开始vb很多都看不懂!
[解决办法]
[解决办法]
[解决办法]
奇怪哦,怎么我刚学VB的时候很多人说VB不能做多线程的,所以一直没去关注VB在多线程方面的东西
[解决办法]
学习
[解决办法]
学习
[解决办法]
哇! 你们好厉害啊! 我都不会
[解决办法]
你们教教我啊!
[解决办法]
不懂,up
[解决办法]
jf
[解决办法]
好文章,我顶了!
[解决办法]
我来学习
[解决办法]
学习中
[解决办法]
好贴,收藏
[解决办法]
学习中
[解决办法]
我还没做过,多线程的学习
[解决办法]
很难
[解决办法]
傲气
[解决办法]
顶呀
[解决办法]
嗯,支持一下,还是不错的。多谢分享!!
[解决办法]
看的不是很懂!高手很多啊!
[解决办法]
学习了, VB6.0支持多线程通信吗????
[解决办法]
[color=#FF6600][/color]第一次看到,关于VB的多线程问题,狂汗,学习中。。。。
[解决办法]
xuexi
[解决办法]
好贴了
强顶
[解决办法]
对这方面不是很懂UP下!
[解决办法]
老马,看着这么多渴望学习VB多线程知识的眼睛,
能否麻烦你出一篇文章,给介绍介绍VB中多线程的使用。。
谢谢!!!
因为我也不会。。很想学习!!!!
[解决办法]
我是自己写了一个函数 ~ 在丢弃对一个对象的引用前调用
卸载所有该对象调用的窗体对象
------解决方案--------------------
学习了。。。强人啊~
[解决办法]
学习一下啊
[解决办法]
[解决办法]
我在VB6里面是用Timer控件数组来模拟多线程的。
[解决办法]
太复杂了。
[解决办法]
[解决办法]
我本人没有实现过多线程,也没看过VB真正实现稳定[color=#FF0000][/color]的多线程。
[解决办法]
还有分没?呵呵,纯粹来学习+接分