2017-02-04 1 views
1

pywin32를 사용하여 Python에서 사용자 정의 객체를 만들었습니다. 해당 개체를 호출하는 동안 몇 시간이 걸립니다. 다음은 매크로를 실행하는 동안 응용 프로그램이 정지하지 않도록 응용 프로그램 stat와 관련하여 비동기로 만들려고합니다.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는 단일 스레드이지만 모든 최신 웹 서버 Node.js가 하나의 스레드에서 작동하지만 멀티 스레드의 느낌을주는 경우 일부 트릭을 사용하여 멀티 스레드로 표시 할 수 있습니다.

1) 그래서 파이썬 구성 요소를 웹 서버 뒤에 놓은 다음 MSXML2.XMLHTTP60을 비동기 적으로 사용할 수 있습니다. Private 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

웹 서비스를 얻는 데 필요한 장고 코드가 모두 게시 되었습니까? –