2017-09-27 51 views
0

我有一個函數用於多線程訪問某些Access VBA例程。它通過編寫一個vb腳本來完成此操作,該腳本保存主Access數據庫的副本,然後在另一個訪問實例中打開它。打開它時會運行在vb腳本中指定的已定義例程。這工作得很好,但我有一些例程,我需要從主函數傳遞變量給他們。我打算使用Tempvars來做到這一點。Tempvars在多線程時重置爲空

主函數設置tempvar(具有初始值),但是當新的訪問實例讀取它時,tempvar被設置爲null。我不知道爲什麼會發生這種情況。它引用tempvar時不會出錯,所以我假設它可以看到它。但無論如何,我無法看到當地人窗口中的臨時對象。有沒有辦法監測tempvar對象?

我已經成功地以相似的容量使用過去的tempvars。主要區別是新的新實例寫入tempvar並且主函數讀取它們。我所擁有的主要功能是寫給他們的問題,而新的實例讀取它們(這是相反的)。

+0

你怎麼能指望任何人來幫助你,當你給旁邊沒有信息。 – jsotola

+0

抱歉jsotola,我以爲我做到了。問題是如何將tempvars從一個訪問對象傳遞到另一個訪問對象 –

回答

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"將在同一個數據庫的單獨Access.Application實例上異步運行函數MyFunction,該實例在執行完成後退出(請注意,您不能對數據庫進行排他鎖定,否則這將失敗)。

這可以很容易地適應從一個線程添加參數,值傳遞給另一個等

+0

謝謝Erik,我認爲那是我嘗試做的一種,但沒有成功。你給了我一些有用的進步的指針。 –