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