我有一個使用COM對象(使用VB6創建)的AutoIt腳本。 COM對象可以觸發事件。我想使用這些事件來顯示AutoIt腳本中任務的進度,因爲執行VB6任務最多可能需要10分鐘。問題是這些事件正在被解僱,但是在'巨大'任務處理結束後,他們在AutoIt中處理。您可以在下面找到腳本的簡化版本。在腳本的真實版本中使用GUI,並且不應將進度百分比寫入控制檯,而應寫入「DIV」元素的內部文本。在AutoIt中處理COM(VB6)事件延遲
Work()
Func Work()
Local $g_oReport = ObjCreate("wcDashboardTools.DashBoardToolsVB6")
If IsObj($g_oReport) Then
$g_oReport.Server = "my-sql-server-name"
Local $g_oReportEvents = ObjEvent($g_oReport,"ToolsEvent_") ; Start receiving Events.
; test the events three times (the 'InitEvents' methods only raises the event in VB6)
$g_oReport.InitEvents()
Sleep(3000)
$g_oReport.InitEvents()
Sleep(3000)
$g_oReport.InitEvents()
; in the test application this works and the event messages now have been written to the console
; in the real life application, these 'test' messages will only be written to the console after the report results have been rendered
$g_oReport.Database = "my-database-name"
$g_oReport.FinancialYear = 2013
$g_oReport.FinancialPeriodStart = 1
$g_oReport.FinancialPeriodEnd = 1
$g_oReport.ReportLayout = "my-layout-name"
; start the huge task
$g_oReport.CreateReport()
; at this point, the huge task has been completed
ConsoleWrite("Creation of the report finished, start rendering the report")
If @Compiled = 0 Then $g_oReport.StoreReportAsXml("c:\temp\exploreport.xml")
; start rendering
$sHTML = $g_oReport.GetReportAsHtmlString()
ConsoleWrite($sHTML)
Else
ConsoleWrite("FOUT: Het genereren van de rapportage is mislukt.")
EndIf
EndFunc
COM對象的'CreateReport'方法在實際啓動'巨大'任務本身之前觸發事件兩次。但是,只有在將呈現的HTML寫入控制檯後,纔會將這些事件的消息寫入控制檯。
任何人都可以幫助我確保在正確的時刻(在執行「巨大」任務期間)在AutoIt腳本中處理事件嗎?
提前致謝!
Björn
P.S.我在C#中使用相同的VB6(Interop)做了一個參考實現,然後在適當的時候處理這些事件。