2017-02-04 44 views
1

我已經使用pywin32在Python中創建了自定義對象。同時調用該對象需要一些時間。 以下是我在嘗試使應用程序stat異步,以便在運行宏時應用程序不freez。如何在vba中執行異步函數調用

Sub demo() 
    demofunction 
End Sub 

Function demofunction() 
    Dim demoobj As Object 
    Do While demoobj Is Nothing 
     DoEvents 
     Set demoobj = CreateObject("Python.DemoObj") 
    Loop 
    Debug.Print demoobj.Hello 
End Function 

很明顯,代碼在異步運行方面不起作用。這甚至有可能如何?

上面的代碼,但工作正常,同時凍結一段時間的應用程序。

+1

'CreateObject'是一個阻塞調用。循環實際上沒有做任何事情。 – Comintern

+0

感謝您正確理解我想要的東西。這就是爲什麼我明顯地。我的代碼只是爲了解釋。 – Rahul

+0

VBA不會執行異步或多線程。如果這是一項要求,你需要一個更新/強大的語言。考慮VB.NET或C#....或者用VBScript + VBA破解異步解決方案。你有沒有研究過這個問題? –

回答

1

Vba是單線程的,但你可以玩一些技巧,讓它看起來像多線程,畢竟所有後起之秀的web服務器Node.js服務於一個線程,但給人一種多線程的印象。

1)因此,您可以將一些Python組件放在網絡服務器後面,然後異步使用MSXML2.XMLHTTP60Private WithEvents oXHR As MSXML2.XMLHTTP60在這裏派上用場。 (請注意,你需要聲明這是一個類的成員才能使用WithEvents

2)你可以向一個進程(這會給你另一個線程)發送消息並以這種方式調用Python組件,然後你使用一些Windows API調用來定期檢查過程是否已完成。

+0

謝謝。這正是我所做的。看到我的另一個問題:http://stackoverflow.com/questions/41935082/best-way-to-make-local-server-app-using-python?noredirect=1#comment71062831_41935082 – Rahul

+0

方法2是第一選擇,但在我的環境它仍然滯後。 – Rahul

+0

善良,是Django代碼發佈所需的所有必要的Web服務了嗎? –