与大家分享一下://这几天接了一个单子,是做一个客服系统的客服端,服务器端与用户端都是现成的.之前的客服端比较"卡",因为与服务器的通讯是采用同步POST与GET方式同网页交互.如果网速不理想或服务器响应不及时,那么在提交过程中当前线程会挂起.由于普通EXE工程中UI与代码都是在同一线程里的,所以提交时整个程序就卡了.....异步的话,整个工程结构又要有大改变.于是我对此工程进行了多线程改造,使用ActiveX EXE的单元模型线程来工作.单元线程虽然在线程间调度的开销比较大,但是我又不是大量地使用它,因此在当前条件下开销不是问题.经过改造后,工程本身结构没有大的改变,却拥有非常爽的界面,真的很爽~~~ 不过后来编译后,又有一个问题来了:程序不能正确退出,必须结束进程.这算哪门子问题?我把所有处于单独线程的对象都正确的释放了啊!弄了一个晚上,都没有结果.试过遍历Forms集合,卸载所有窗体;而窗体里每个对象的释放也都是正确的.可没用.我甚至在程序里调用ExitProcess,仍然没用.最终在任务管理器里看,线程总是还有那么几个多余的.真的是怪了!!后来到了两点左右,肚子也饿了,就啃了点饼.啃着啃着,突然想到,Forms集合是不是没用了?因为这是"单元",当一个单元创建后,在别的单元里创建的公共对象,比如将某窗体Show出来了,那么在本单元内,应该仍然是不可见的!有思路了,就马上改代码,把那个For Each In Forms的遍历循环改成手工UNLOAD每一个窗体.编译,运行,退出---------------哈!行了!原来,在创建单元时,是把当前的环境"复制"一份到单元里面;因此当一个单元创建成功后,单元外的环境如果改变了,对于已经创建的单元来说,是没有改变的!怪不得MSDN里也说,"每个线程有一份自己的全局数据副本,这意味着不能使用全局数据在不同线程的对象之间进行通讯".这个问题,应该算是弄明白了吧:)收获不小. PS:大家觉得VB6的这种多线程的优点在哪?缺点在哪?

解决方案 »

  1.   

    学习
    我不知道,没整过多线程的,就用DoEvents了几次,惭愧惭愧...
      

  2.   

    你把For Each In Forms的遍历循环改成手工UNLOAD每一个窗体,有点不可思议。本质上是没有区别,这里面肯定有名堂!
    至于优点:就是速度快,但不稳定;缺点是占用资源太多。
    WMP控件就是一个多线程的,用WMP播放比用MCI命令播放占用的资源明显多得多!
      

  3.   

    //本质上是没有区别
    //
    区别可大了,HOHO.注意COM的单元模型......就是没注意这个单元模型,才浪费了这么多时间.现在倒是想通了.速度快,倒不一定,线程运行的速度还是一样的,只是有可能因为可以多线程工作后,能从流程上进行优化从而达到整体运行效率提高的效果.//优点:稳定  缺点:占用资源太多
    //
    关于资源占用太多,你们都提到了,于是我刚刚做了一个测试.生成1024个线程后,内存占用达到了51M左右,虚拟内存也增加到49M左右;而之前是19M/13M.貌似并不是很夸张.要知道多线程一般来说,我认为主要是解决UI挂起的问题的....利用多线程的流程优化,那是另一回事了.我觉得主要应该是线程间的调度的开销问题.不过呢,即使MSDN里这样说,"几乎和进程间调度一样慢",可是在常规应用中真的感觉不出来.这不是在写服务器级软件......所以我认为,常规软件里面这两点根本就不会成为问题的....欢迎大家继续跟进.......
      

  4.   

    我看了,CPU开销很高,50%以上,跟没用doevents有关。
      

  5.   

    这个通讯问题,在VB6里好象相对简单点~~~我可以直接利用对象的封装,让各个线程间直接以事件方式通知,而不需要使用全局变量(反正它也用不好....)只要封装得合适,简直是太方便了,哈哈.//CPU开销很高
    //
    做死循环的话,就算一个线程也是一样那是在线程里面如何工作的问题了,就看自己怎么搞了,HOHO.
      

  6.   

    请教一下,我写的ActiveX EXE,在调用时显示里面的模态窗体时,总是不显示在最前面(顶层),
    有什么解决方法或者是什么原因?
    谢谢
      

  7.   

    模态窗体应该处于当前线程的最顶级,但不是系统的顶层.....想到顶层,你可以用SetWindowlong添加一个topmost样式.
      

  8.   

    老马我有几个问题:
    1.怎么在你这个程序中加入MDI窗体
    2.怎么定义带有WITHEVENTS对像数组
      

  9.   

    我做过一个完整的这类系统(资讯通)
    全部工程只有二部份组成
    1.客户端:是一个飘浮旗帜广告,由js完成,利用ajax与MS-SQL2000进行联系,这样做的优势在于软件不管卖给谁,都与购者买网站无关,当然了,如果他的web不支持ajax那就....... 客户端脚本由服务器端配置好数据库IP后自动生成!放到网站上去就成 :)
    2.服务端:由纯VB6.0完成,利用到了多线程来监听99999端口数据流量,当有数据流量时即与数据库发生关联,读取即时数据到UI实际出售时,客户将只拿到一个服务器端,以及一本说明书.
      

  10.   


    多线程工程不支持MDI窗体......细节不清楚....带事件的对象数组,貌似没办法直接定义.你可以先定义为一般的对象数组,再在实例化后传入另一个类,那个类里面声明好这种对象带事件的处理代码等,即可.
      

  11.   


    http://topic.csdn.net/u/20070709/02/9a9af8f5-fe32-49c0-a863-c320c8b09b6a.html
      

  12.   

    奇怪哦,怎么我刚学VB的时候很多人说VB不能做多线程的,所以一直没去关注VB在多线程方面的东西
      

  13.   

    说VB不能支持多线程的多半没有去深入了解VB.....最终传来传去,VB成了一个真正的"完全不支持多线程"的语言了
      

  14.   


    .........这个帖子里我们完全是一路汗下来的............汗~~~不过当时没有老王的这个插件,还发不了表情.在这里要表扬一下可爱的清洁工同学:您辛苦了~~~~HOHOHOHO
      

  15.   

    老马,看着这么多渴望学习VB多线程知识的眼睛,
    能否麻烦你出一篇文章,给介绍介绍VB中多线程的使用。。
    谢谢!!!
    因为我也不会。。很想学习!!!!
      

  16.   

    端口我只是随便举了一个,别介意哈:)
    -------------------------------------------------------------------------------------------------
    另外,VB6.0完全是可以完成多线程的.
    为什么有这么多人在研究这个问题,其问题关键不是,能不能做
    而是如何做的更稳定.
    因为VB6.0语言自身的问题,多线程的稳定被视为一种不能完成
    的使命!!
    刚才看到一篇关于内存溢出的贴子,感觉写的还是蛮好的:)
      

  17.   

    我在VB6里面是用Timer控件数组来模拟多线程的。
      

  18.   

    vb支持多线程,类似于vb也支持指针,两者一样糟糕.....不如用其他的语言实现
      

  19.   

    用的人太少了所以真正下工夫研究的人不多多线程实现机制不同,使用上的限制也不同了.VB6里就要使用VB6的办法.....
      

  20.   

    我也看到过vb做多线程不稳定的说法。多年前做50台数控设备的串口联网项目,我是将50个vb通讯程序一起运行起来,再用dde和主软件界面通讯。稳定运行没问题。就是在win98下内存要用1G,后来改用win2000内存占用下来了,就是cpu占用90%。虽然你的文章我现在的水平还看不懂,不过还是要先顶一下的!