VB6里面多线程工程的正常退出问题

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

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

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

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

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

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

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

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

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

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

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

可没用.

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

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

真的是怪了!!

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

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

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

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

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

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

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

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

收获不小.

评论: 0 | 引用: 0 | 查看次数: 1208