2017-02-04 18 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はシングルスレッドですが、立ち上がりの星型WebサーバーNode.jsが1つのスレッドから機能していて、マルチスレッドの印象を与えた後に、いくつかのトリックを実行してマルチスレッドにすることができます。

1)したがって、いくつかのPythonコンポーネントをWebサーバーの背後に置き、MSXML2.XMLHTTP60を非同期で使用することができます。 Private WithEvents oXHR As MSXML2.XMLHTTP60が便利です。 (WithEventsを使用するクラスのメンバーとして宣言する必要があることに注意してください)

2)あなたは別のスレッドを提供するプロセスにシェルし、Pythonコンポーネントをそのように呼び出すことができます。プロセスが完了したかどうか定期的に確認する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

Webサービスを取得するために必要なすべてのDjangoコードが掲載されていますか? –

関連する問題