读书人

vba怎么实现并行程序设计

发布时间: 2012-02-07 17:45:36 作者: rapoo

求助——vba如何实现并行程序设计
问题基于这样的一个需求 我的一个数据处理的程序,处理数据需要相当长的时间,所以给程序添加了显示运行进度的窗体,进度用prograssbar实现了 现在我想在加个计时的功能 就是显示程序已经运行的时间 并结合运行进度和已运行时间 估算剩余时间 就像压缩的程序那样

问题就在对程序进行运行计时,一开始是想通过一个计时函数timecounter()实现,其中用DOENVENT 使得当窗体加载后 窗体上显示的时间正常 (这是主程序没有运行的时候) 因为窗体显示 不占用系统 所以doenvet 到了程序中设计的1秒时间后 自动返回 然后在下一个循环 总而言之 计时正常 但是一旦主程序运行了 因为程序运行要很久 一旦计时程序转让了控制权 主程序不会主动让出控制权在运行结束之前 所以计时就失败了

函数如下

VB code
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



如何实现对程序运行计时呢??? 是vba 没有timer控件 只有timer函数
算是并行的程序设计虽然相互之间不用交互只有触发和终止的关系,VB中如何并行程序设计呢

[解决办法]
事实上并需要timer
你所谓的主程序应该是就是应该就是过程或者函数,运行时间很长,意味着,你的函数体里有循环次数很多的循环,你只要在循环体里面加入,以下代码假设你的循环为for循环

for....

......
progressbar1.value=progressbar1.value+delta'进度增加值,假设使用进度条显示进度
doevents
next

就能得到需要的效果
[解决办法]
这和单步的运行时间有什么关系?
计时部分先记下开始时间;然后每次更新进度时再取一下当前时间,就可以计算经过时间了、结合进度比率可以计算剩余时间。这不就全了!
[解决办法]
用timer控件就可以实现了

假设你的循环

for
Text1.text = now
..

next

每次循环时间都不固定

timer控件里头可以可以根据Text1.text的变化, 来递增时间, 下面是个例子


text1,command1,text2,timer1
text1是你的循环里头的那个时间
command1是你的循环不固定时间控制
text2是你需要不断显示的准确时间

Private Sub Command1_Click()
Text1.Text = Time
End Sub

Private Sub Text1_Change()
Text2.Text = Text1.Text
Timer1.Interval = 1000
End Sub

Private Sub Timer1_Timer()
Text2.Text = TimeValue(Text2.Text) + TimeValue("00:00:01")
End Sub





[解决办法]
楼主:想要的是标准的多线程了。。。

任何其他的类似 Timer 的东西,都无法实现你想要的,它们只能近似模拟出效果而已,无论再怎么做,它们都不是实际意义上的多线程!

看了你的要求和回贴,感觉你要的就是纯粹的多线程!VB6 做多线程也还可以,VBA 不知道能不能做了。。。应该是可以吧!

总之,两种途径:1、直接调用多线程 WIN32DLL;2、使用 VB 自身的 ACTIVEX DLL 工程;
[解决办法]
把刷新进度的步骤分得更细点,只要每个间隔在0.5秒以下,进度就很平滑了。
这是最简单的方案。
[解决办法]
我的方案就是最简单最好的, 都看不到么, 只要你的tiemr开始运行, 就会永远的1秒一次的准确的跳动下去


[解决办法]
VB code
While httpRequester.ReadyState <> 4  在这里刷新时间  DoEventsWend 


[解决办法]
1. 多线程 win32dll 主要有 CreateThread , CloseHandler, GetCurrentThread 等等,涉及到很多,没有基础的话需要费时间研究了;所以不建议您采用这个办法,网上能找到例子的话,能快速理解的话也可以试试;

2. 这种办法相对简单点,首先将你的工程改为 ActiveX Exe 工程,然后建立两个类,一个类是你那个主处理程序,另一个类是你那个测时间的程序,再由每一个类去管理具体的窗体,最后再建一个 SUB MAIN ,里面实例化你那两个类,这样这个系统中会比以往多出至少一个线程的;(注:类的 Instancing=5)
[解决办法]

VB code
While httpRequester.ReadyState <> 4  在这里更新时间  DoEventsWend
[解决办法]
哇,VBA也玩多线程!要玩多线程用VB6吧。看看API区,我写了个DLL还可以用,但线程同步要自己处理,特别是同时访问控件时,要特别注意,甚至有些控件就算做了线程同步,还是不太稳定。
[解决办法]
TNND,昨天的回复掉帧了!
VB code
While httpRequester.ReadyState <> 4  这里刷新事件,间隔应该够短了吧  DoEventsWend 

读书人网 >VB

热点推荐