多线程

时间:2017-09-27 01:00:36

标签: multithreading vba ms-access

我有一个函数,我用它来多线程一些Access VBA例程。它通过编写一个vb脚本来完成此操作,该脚本保存主Access数据库的副本,然后在另一个访问实例中打开它。打开时,它运行vb脚本中指定的已定义例程。这很好但我有一些例程,我需要从main函数传递变量。我本打算用Tempvars来做这件事。

main函数设置tempvar(带有初始值),但是当新的访问实例读取它时,tempvar已设置为null。我不知道为什么会这样。它引用tempvar时没有错误,所以我假设它可以看到它。但我无论如何都无法看到当地人窗口中的tempvars对象。有没有办法监控tempvar对象?

我过去曾以类似的身份成功使用过tempvars。主要的区别是新的实例写入tempvar并且main函数读取它们。我所拥有的问题是写给他们的主函数和新实例读取它们(相反)。

1 个答案:

答案 0 :(得分:0)

TempVars是Application对象的属性,而不是数据库。新的Access.Application将无法访问旧版本中设置的TempVars。

在我看来,更好的方法是使用表单,计时器和COM来实现这一目标。这样你就可以将变量从一个Access.Application对象传递给另一个{包括但不限于TempVars)

快速示例(我正在研究Access中多线程的更完整方法)

使用具有单一表单的空白数据库MTForm,它具有表单模块: 在MTForms表单模块中:

Private strTask As String
Private Sub Form_Timer()
    Application.Run strTask
    Application.Quit
End Sub
Public Property Let Task(Value As String)
    strTask = Value
End Property

在一个单独的模块中:

Public Sub RunAsync(strFunction As String)
    Dim A As New Access.Application
    A.OpenCurrentDatabase Application.CurrentProject.FullName
    A.DoCmd.OpenForm "mtForm"
    A.Forms("mtForm").Task = strFunction
    A.Forms("mtForm").TimerInterval = 1
End Sub

使用:RunAsync "MyFunction"将在同一数据库的单独MyFunction实例上异步运行函数Access.Application,一旦执行完毕就退出(请注意,您不能拥有独占锁在数据库上,否则这将失败)。

这可以很容易地适应添加参数,将值从一个线程传递到另一个线程等等。