使用多线程vba更新tempvar

时间:2017-09-01 05:10:15

标签: multithreading vba ms-access

我编写了多线程函数,可以创建主Access数据库文件的多个副本。然后每个副本运行一个指定的循环函数“RunForVBA”。循环迭代的总数除以访问副本的数量,每个副本运行总循环计数的一部分。这非常有效,但我试图整理一个进度条窗体,跟踪所有线程的总进度。每个副本都会更新每个循环迭代的主进度条形式。

我试图在主数据库中使用TempVar来记录总计数器并将进度条引用到此tempvar。这种工作但是每个实例中的每个循环都没有更新tempvar。我不知道为什么它只是部分起作用。

代码如下

    Dim para As clsMultiThread
    Dim lloop As Long

    lloop = 600

    Debug.Print "lets go!!"

    Set para = New clsMultiThread
    DoCmd.OpenForm "ProgressBar"

    Call Forms("ProgressBar").SetProgressBarParameters("Testing ProgressBar Again", "Message: It kind of works!!", lloop)
    Call para.SetThreads(12)
    Call para.MultiThreadLoop("RunForVBA", 1, lloop)

    Debug.Print TempVars("ProgressBarCounter").value
    DoCmd.Close ObjectType:=acForm, ObjectName:="ProgressBar"

多线程函数运行“RunForVBA”

代码如下:

Sub RunForVBA(seqFrom As Long, seqTo As Long)

    Dim lTimer As Long
    Dim i, iInc As Integer
    Dim x As Double

    Dim appAccess As Access.Application
    Dim tvProgBarCtr As TempVar

    Set appAccess = New Access.Application
    Set appAccess = GetObject(, "Access.Application")

    Set tvProgBarCtr = appAccess.TempVars("ProgressBarCounter")

    lTimer = GetTickCount

    For i = seqFrom To seqTo
        tvProgBarCtr.value = tvProgBarCtr.value + 1
        DoEvents
        Sleep (400)
    Next i

    Set appAccess = Nothing

End Sub    

我试过改变睡眠时间,改变线程数等等。是否可以执行{GetObject(,“Access.Application”)}的最大数量?

我不确定为什么它部分有效,而不是完全或根本没有。通过上述功能,TempVar通常可以在250到300之间完成任何操作,而不是总循环次数为600.

0 个答案:

没有答案