与大家分享一下://这几天接了一个单子,是做一个客服系统的客服端,服务器端与用户端都是现成的.之前的客服端比较"卡",因为与服务器的通讯是采用同步POST与GET方式同网页交互.如果网速不理想或服务器响应不及时,那么在提交过程中当前线程会挂起.由于普通EXE工程中UI与代码都是在同一线程里的,所以提交时整个程序就卡了.....异步的话,整个工程结构又要有大改变.于是我对此工程进行了多线程改造,使用ActiveX EXE的单元模型线程来工作.单元线程虽然在线程间调度的开销比较大,但是我又不是大量地使用它,因此在当前条件下开销不是问题.经过改造后,工程本身结构没有大的改变,却拥有非常爽的界面,真的很爽~~~ 不过后来编译后,又有一个问题来了:程序不能正确退出,必须结束进程.这算哪门子问题?我把所有处于单独线程的对象都正确的释放了啊!弄了一个晚上,都没有结果.试过遍历Forms集合,卸载所有窗体;而窗体里每个对象的释放也都是正确的.可没用.我甚至在程序里调用ExitProcess,仍然没用.最终在任务管理器里看,线程总是还有那么几个多余的.真的是怪了!!后来到了两点左右,肚子也饿了,就啃了点饼.啃着啃着,突然想到,Forms集合是不是没用了?因为这是"单元",当一个单元创建后,在别的单元里创建的公共对象,比如将某窗体Show出来了,那么在本单元内,应该仍然是不可见的!有思路了,就马上改代码,把那个For Each In Forms的遍历循环改成手工UNLOAD每一个窗体.编译,运行,退出---------------哈!行了!原来,在创建单元时,是把当前的环境"复制"一份到单元里面;因此当一个单元创建成功后,单元外的环境如果改变了,对于已经创建的单元来说,是没有改变的!怪不得MSDN里也说,"每个线程有一份自己的全局数据副本,这意味着不能使用全局数据在不同线程的对象之间进行通讯".这个问题,应该算是弄明白了吧:)收获不小. PS:大家觉得VB6的这种多线程的优点在哪?缺点在哪?
解决方案 »
- 如何搜索纯真IP(快速)
- StrComp与Instr的区别??
- vb6中的combol控件,怎么才能使它只能选择不能输入
- 我在调用DLL文件里,运行一段时间后提示_实时错误'91',对象变量或WITH块变量未设置,,正确就结贴
- 如何取得局域网内的一台主机的时间
- 如何在"任务管理器"的"应用程序"页面里面把自己的程序隐藏起来?(不需要"隐藏进程")
- 极为简单的语法问题(withEvents和Event关键字的用法——今日结贴)
- ◥◣想◢◤ 再见了C#版的朋友们 ◥◣吐◢◤
- VB 高手都那去了????????????????
- 如何做带ID的帮助
- 那位大侠帮把利用WebBrowser实现的功能改为直接操作IE来实现
- VB6的VScrollbar不灵!
我不知道,没整过多线程的,就用DoEvents了几次,惭愧惭愧...
至于优点:就是速度快,但不稳定;缺点是占用资源太多。
WMP控件就是一个多线程的,用WMP播放比用MCI命令播放占用的资源明显多得多!
//
区别可大了,HOHO.注意COM的单元模型......就是没注意这个单元模型,才浪费了这么多时间.现在倒是想通了.速度快,倒不一定,线程运行的速度还是一样的,只是有可能因为可以多线程工作后,能从流程上进行优化从而达到整体运行效率提高的效果.//优点:稳定 缺点:占用资源太多
//
关于资源占用太多,你们都提到了,于是我刚刚做了一个测试.生成1024个线程后,内存占用达到了51M左右,虚拟内存也增加到49M左右;而之前是19M/13M.貌似并不是很夸张.要知道多线程一般来说,我认为主要是解决UI挂起的问题的....利用多线程的流程优化,那是另一回事了.我觉得主要应该是线程间的调度的开销问题.不过呢,即使MSDN里这样说,"几乎和进程间调度一样慢",可是在常规应用中真的感觉不出来.这不是在写服务器级软件......所以我认为,常规软件里面这两点根本就不会成为问题的....欢迎大家继续跟进.......
//
做死循环的话,就算一个线程也是一样那是在线程里面如何工作的问题了,就看自己怎么搞了,HOHO.
有什么解决方法或者是什么原因?
谢谢
1.怎么在你这个程序中加入MDI窗体
2.怎么定义带有WITHEVENTS对像数组
全部工程只有二部份组成
1.客户端:是一个飘浮旗帜广告,由js完成,利用ajax与MS-SQL2000进行联系,这样做的优势在于软件不管卖给谁,都与购者买网站无关,当然了,如果他的web不支持ajax那就....... 客户端脚本由服务器端配置好数据库IP后自动生成!放到网站上去就成 :)
2.服务端:由纯VB6.0完成,利用到了多线程来监听99999端口数据流量,当有数据流量时即与数据库发生关联,读取即时数据到UI实际出售时,客户将只拿到一个服务器端,以及一本说明书.
多线程工程不支持MDI窗体......细节不清楚....带事件的对象数组,貌似没办法直接定义.你可以先定义为一般的对象数组,再在实例化后传入另一个类,那个类里面声明好这种对象带事件的处理代码等,即可.
http://topic.csdn.net/u/20070709/02/9a9af8f5-fe32-49c0-a863-c320c8b09b6a.html
.........这个帖子里我们完全是一路汗下来的............汗~~~不过当时没有老王的这个插件,还发不了表情.在这里要表扬一下可爱的清洁工同学:您辛苦了~~~~HOHOHOHO
能否麻烦你出一篇文章,给介绍介绍VB中多线程的使用。。
谢谢!!!
因为我也不会。。很想学习!!!!
-------------------------------------------------------------------------------------------------
另外,VB6.0完全是可以完成多线程的.
为什么有这么多人在研究这个问题,其问题关键不是,能不能做
而是如何做的更稳定.
因为VB6.0语言自身的问题,多线程的稳定被视为一种不能完成
的使命!!
刚才看到一篇关于内存溢出的贴子,感觉写的还是蛮好的:)