求助——vba如何实现并行程序设计
问题基于这样的一个需求 我的一个数据处理的程序,处理数据需要相当长的时间,所以给程序添加了显示运行进度的窗体,进度用prograssbar实现了 现在我想在加个计时的功能 就是显示程序已经运行的时间 并结合运行进度和已运行时间 估算剩余时间 就像压缩的程序那样
问题就在对程序进行运行计时,一开始是想通过一个计时函数timecounter()实现,其中用DOENVENT 使得当窗体加载后 窗体上显示的时间正常 (这是主程序没有运行的时候) 因为窗体显示 不占用系统 所以doenvet 到了程序中设计的1秒时间后 自动返回 然后在下一个循环 总而言之 计时正常 但是一旦主程序运行了 因为程序运行要很久 一旦计时程序转让了控制权 主程序不会主动让出控制权在运行结束之前 所以计时就失败了
函数如下
Sub time_Counter()' 使用前要初始化 Costtime 和 打开计时器开关 TurnOff_clock' 使用完 要关闭计时器开关'Costtime 计数器'TurnOff_clock 计时开关Dim tempN As IntegerDim lastTimee As String PauseTime = 1 ' 设置暂停时间。 While TurnOff_clock <> 0 Start = Timer '---------------------------------晶振 Do While Timer < Start + PauseTime DoEvents ' 将控制让给其他程序。 Loop '---------------------------------晶振 '---------------------------------表盘 Costtime = Costtime + 1 If Costtime >= 60 Then Timee = Costtime \ 60 & ":" & Format(Costtime Mod 60, "00") Else Timee = "0:" & Format(Costtime, "00") End If formain.Labpast.Caption = "已运行:" & Timee 'timee 为计时输出变量 formain1.Label3.Caption = "已运行:" & Timee 'timee 为计时输出变量 '-------------------------计算剩余时间 tempN = (Costtime / (formain.gloProgressBar.Value + 1)) * 100 If tempN >= 60 Then lastTimee = tempN \ 60 & ":" & Format(tempN Mod 60, "00") Else lastTimee = "0:" & Format(tempN, "00") End If formain.Lablast.Caption = "估计剩余:" & lastTimee WendEnd Sub
While httpRequester.ReadyState <> 4 在这里刷新时间 DoEventsWend
[解决办法]
1. 多线程 win32dll 主要有 CreateThread , CloseHandler, GetCurrentThread 等等,涉及到很多,没有基础的话需要费时间研究了;所以不建议您采用这个办法,网上能找到例子的话,能快速理解的话也可以试试;
2. 这种办法相对简单点,首先将你的工程改为 ActiveX Exe 工程,然后建立两个类,一个类是你那个主处理程序,另一个类是你那个测时间的程序,再由每一个类去管理具体的窗体,最后再建一个 SUB MAIN ,里面实例化你那两个类,这样这个系统中会比以往多出至少一个线程的;(注:类的 Instancing=5)
[解决办法]
While httpRequester.ReadyState <> 4 在这里更新时间 DoEventsWend
[解决办法]
哇,VBA也玩多线程!要玩多线程用VB6吧。看看API区,我写了个DLL还可以用,但线程同步要自己处理,特别是同时访问控件时,要特别注意,甚至有些控件就算做了线程同步,还是不太稳定。
[解决办法]
TNND,昨天的回复掉帧了!
While httpRequester.ReadyState <> 4 这里刷新事件,间隔应该够短了吧 DoEventsWend