当前位置: 首页>>
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不返回控制权的情况,这……兄弟我说了这么多好象也没解决问题,您就当是唠嗑吧,买卖不成仁义在。 呵呵,先生,您自己决定吧。 |
|
|
|
|