电脑爱好者,提供IT资讯信息及各类编程知识文章介绍,欢迎大家来本站学习电脑知识。 最近更新 | 联系我们 RSS订阅本站最新文章
电脑爱好者
站内搜索: 
当前位置:首页>> VB编程>>VB用线程解决用户界面响应的思路:

VB用线程解决用户界面响应的思路

来源:www.cncfan.com | 2006-12-12 | (有2791人读过)

forjie问:
以下是引用片段:
我的程序需要大的数据量的运算(运算一次可能要10个小时左右)。在程序中有doevents在一定时候释放控制权,可以让用户看到执行状态,不至于让他们觉得程序死机了,但是问题是,当执行计算机的程序进入无人职守状态时(比如夜里),因为没人动计算机,所以在执行完doevents后好像就不再返回控制权了,直到第二天早上有人去动一下计算机(哪怕移动一下鼠标),程序才继续运算下去。这是为什么?郁闷。
AgedBOY答:
以下是引用片段:
我有好方法!  
  首先把你的那段计算程序,想办法写到一个函数里。注意,不一定要写到一个函数里,多个也行,但当然得有一个“启动”函数。而且不能在类里或者窗体里,一定要在模块里,即全局函数。  
   
  这“启动”函数必须声明如下,顺便定义一个长整变量哦:    
          Declare   函数名(参数   As   Long)   As   Long  
          Dim   h   as   Long  
  然后调用CreateThread(0,0,AddressOf(函数名),参数,0,h)即可!  
  “参数”是可选的,没有的话就给它0。但是“启动函数”里的那个“参数”一定得要,用不用两可。  
   
  只要你的函数别有运行错误,并尽量少频繁使用全局变量,这个方法应该能够帮助你的。  
   
  这个方法实际只不过是创建子线程罢了,如果想深入了解,去看看关于线程的书。
__________________

先生,您怎么不明白我的心?您的意思不就是:如果不用DoEvents,则修改Label等于没修改,而用了,就想让它修改起作用吗?  
   
  这是一个经典的“用线程解决用户界面响应”的问题。我说的方法几乎是最职业的方法,它并不高深,很通俗,很常用,很标准,程序员都(2   声)知道。  
   
  您只须把那个计算函数定义成模块里的全局函数——其实其他代码几乎不用动——只是把“label1="title   detail"”改成“form1.label1="title   detail"”即可!(假设窗体叫form1)  
   
  当按我说的调用CreateThread时,函数立即投入运行,并且是和您的窗体(指主程序)并发执行!而且用户界面,即那个窗体,完全不会迟钝或者锁死,永无电源管理问题,您的程序的层次上升800个百分点,老板开始佩服您,加薪…………
____________________
另外,不要误认为DoEvents是用来刷新界面用的,它只是把当前正在运行的程序暂时打断,把CPU让给操作系统,这时操作系统再利用施舍到的CPU来刷新您的界面。  
  这样的做法,其实是让Win9x/NT/2K...回归成了Win3.1,因为Win3.1时代就是这么做的。  
  不过话说回来,DoEvents自有它简洁的一面,假如您只是想刷新一个Label,再没有其他追求,那么应该说DoEvents不失为一个好方法,而我说的方法有些夸张了。  
  我目前位置还没有遇到过DoEvents不返回控制权的情况,这……兄弟我说了这么多好象也没解决问题,您就当是唠嗑吧,买卖不成仁义在。  
  呵呵,先生,您自己决定吧。
VB编程热门文章排行
网站赞助商
购买此位置

 

关于我们 | 网站地图 | 文档一览 | 友情链接| 联系我们

Copyright © 2003-2024 电脑爱好者 版权所有 备案号:鲁ICP备09059398号