【分享】VB6里面多线程工程的正常退出问题

嗷嗷叫的老马 2009-02-27 02:36:46
加精
与大家分享一下:

//

这几天接了一个单子,是做一个客服系统的客服端,服务器端与用户端都是现成的.

之前的客服端比较"卡",因为与服务器的通讯是采用同步POST与GET方式同网页交互.如果网速不理想或服务器响应不及时,那么在提交过程中当前线程会挂起.

由于普通EXE工程中UI与代码都是在同一线程里的,所以提交时整个程序就卡了.....

异步的话,整个工程结构又要有大改变.

于是我对此工程进行了多线程改造,使用ActiveX EXE的单元模型线程来工作.

单元线程虽然在线程间调度的开销比较大,但是我又不是大量地使用它,因此在当前条件下开销不是问题.

经过改造后,工程本身结构没有大的改变,却拥有非常爽的界面,真的很爽~~~

不过后来编译后,又有一个问题来了:程序不能正确退出,必须结束进程.

这算哪门子问题?我把所有处于单独线程的对象都正确的释放了啊!

弄了一个晚上,都没有结果.

试过遍历Forms集合,卸载所有窗体;而窗体里每个对象的释放也都是正确的.

可没用.

我甚至在程序里调用ExitProcess,仍然没用.

最终在任务管理器里看,线程总是还有那么几个多余的.

真的是怪了!!

后来到了两点左右,肚子也饿了,就啃了点饼.

啃着啃着,突然想到,Forms集合是不是没用了?

因为这是"单元",当一个单元创建后,在别的单元里创建的公共对象,比如将某窗体Show出来了,那么在本单元内,应该仍然是不可见的!

有思路了,就马上改代码,把那个For Each In Forms的遍历循环改成手工UNLOAD每一个窗体.

编译,运行,退出---------------哈!行了!

原来,在创建单元时,是把当前的环境"复制"一份到单元里面;因此当一个单元创建成功后,单元外的环境如果改变了,对于已经创建的单元来说,是没有改变的!

怪不得MSDN里也说,"每个线程有一份自己的全局数据副本,这意味着不能使用全局数据在不同线程的对象之间进行通讯".

这个问题,应该算是弄明白了吧:)

收获不小.

PS:

大家觉得VB6的这种多线程的优点在哪?缺点在哪?
...全文
2425 80 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
80 条回复
切换为时间正序
请发表友善的回复…
发表回复
wskjtgdn 2011-07-16
  • 打赏
  • 举报
回复
有人发个例上来研究呀
jessezappy 2011-06-12
  • 打赏
  • 举报
回复
老马又整多线程了啊.
上次我的多线程项目界面卡住的问题我发现是因为多个线程同时访问数据库,差点把数据库服务器干死了弄的.
不过线程间通讯目前还是不理想.所以尽量减少线程间的事件通讯的数据量.
老马这次这个例子值得学习.
苦苦的潜行者 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 m60a1 的回复:]
我做过一个完整的这类系统(资讯通)


全部工程只有二部份组成
1.客户端:是一个飘浮旗帜广告,由js完成,利用ajax与MS-SQL2000进行联系,这样做的优势在于软件不管卖给谁,都与购者买网站无关,当然了,如果他的web不支持ajax那就....... 客户端脚本由服务器端配置好数据库IP后自动生成!放到网站上去就成 :)
2.服务端:由纯VB6.0完成,利用到了多线程来监听999……
[/Quote]

够狠!!!
熊孩子开学喽 2011-04-28
  • 打赏
  • 举报
回复
哈,还没结贴啊, 偶来鞭尸.
嗷嗷叫的老马 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 75 楼 piaofeng914 的回复:]
老马兄:
我想:通过串口通信,实现实时监测外部数据。当外部数据,出现错误或异常时,系统进行相应的处理。
这种监测,是在系统运行过程中,一直进行检测,但不能占用太多的系统资源,同时还能进行其他操作。怎么实现呢?是在vb6.0环境下的……
望给出解答,我对这方面了解不多,但是,现在急着要使用……所有,请教你!!!
[/Quote]
用MSCOMM控件吧,有事件的.
piaofeng914 2009-07-20
  • 打赏
  • 举报
回复
老马兄:
我想:通过串口通信,实现实时监测外部数据。当外部数据,出现错误或异常时,系统进行相应的处理。
这种监测,是在系统运行过程中,一直进行检测,但不能占用太多的系统资源,同时还能进行其他操作。怎么实现呢?是在vb6.0环境下的……
望给出解答,我对这方面了解不多,但是,现在急着要使用……所有,请教你!!!
bj0629 2009-07-09
  • 打赏
  • 举报
回复
我也看到过vb做多线程不稳定的说法。多年前做50台数控设备的串口联网项目,我是将50个vb通讯程序一起运行起来,再用dde和主软件界面通讯。稳定运行没问题。就是在win98下内存要用1G,后来改用win2000内存占用下来了,就是cpu占用90%。虽然你的文章我现在的水平还看不懂,不过还是要先顶一下的!
嗷嗷叫的老马 2009-06-21
  • 打赏
  • 举报
回复
用的人太少了

所以真正下工夫研究的人不多

多线程实现机制不同,使用上的限制也不同了.

VB6里就要使用VB6的办法.....
qingye2008 2009-06-19
  • 打赏
  • 举报
回复
vb支持多线程,类似于vb也支持指针,两者一样糟糕.....不如用其他的语言实现
gentlebrother 2009-06-04
  • 打赏
  • 举报
回复
mark
嗷嗷叫的老马 2009-04-05
  • 打赏
  • 举报
回复
结帖了....
嗷嗷叫的老马 2009-03-31
  • 打赏
  • 举报
回复
还没结帖呢....

这里没有平均给分,我要点得头晕- -!
verywzm 2009-03-29
  • 打赏
  • 举报
回复
还有分没?呵呵,纯粹来学习+接分
嗷嗷叫的老马 2009-03-29
  • 打赏
  • 举报
回复
不知道楼上兄台所说的稳定是指什么条件下的稳定?
VBAdvisor 2009-03-29
  • 打赏
  • 举报
回复
我本人没有实现过多线程,也没看过VB真正实现稳定的多线程。
wsq279024988 2009-03-17
  • 打赏
  • 举报
回复
学习一下啊
shiye1987 2009-03-17
  • 打赏
  • 举报
回复
学习了。。。强人啊~
zzyong00 2009-03-17
  • 打赏
  • 举报
回复
[Quote=引用 63 楼 zhao4zhong1 的回复:]
我在VB6里面是用Timer控件数组来模拟多线程的。
[/Quote]
哪是不可能的
kxscr 2009-03-17
  • 打赏
  • 举报
回复
我是自己写了一个函数 ~ 在丢弃对一个对象的引用前调用
卸载所有该对象调用的窗体对象
用户 昵称 2009-03-17
  • 打赏
  • 举报
回复
太复杂了。
加载更多回复(57)

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧