2012-03-13 26 views
0

結果的に2つの同じスレッドからJACOBを使用すると奇妙な問題が発生します。私は、WMIにさまざまな要求をディスパッチするための静的ActiveXObjectフィールドを使用するユーティリティクラスを持っています。最初のスレッドは正常に動作します。スレッドはGUIからマウスクリックによって開始されたが、エラーが手動で再現性のある複数のスレッドで使用するとJACOBライブラリが失敗する

com.jacob.com.ComFailException: Can't map name to dispid: ExecQuery 
at com.jacob.com.Dispatch.invokev(Native Method) 
at com.jacob.com.Dispatch.invokev(Dispatch.java:858) 
at com.jacob.com.Dispatch.callN(Dispatch.java:455) 
at com.jacob.com.Dispatch.call(Dispatch.java:544) 
at com.jacob.activeX.ActiveXComponent.invoke(ActiveXComponent.java:510) 
at JacobWmiAdapter.getResultsList(JacobWmiAdapter.java:111) 
at JacobWmiAdapter.getResultsList(JacobWmiAdapter.java:104) 
at WindowsInfoCollector.getConnectionInfo(WindowsInfoCollector.java:516) 
at WindowsInfoCollector.collect(WindowsInfoCollector.java:118) 
at DiagnosisExecutor.execute(DiagnosisExecutor.java:128) 
at DiagnosisExecutor.run(DiagnosisExecutor.java:160) 
at java.lang.Thread.run(Thread.java:662) 

 DiagnosisExecutor dex = new DiagnosisExecutor(); 
     Thread thread1 = new Thread(dex); 
     Thread thread2 = new Thread(dex); 

     thread1.start(); 
     thread1.join(); 
     Thread.sleep(1000); 
     thread2.start(); 

それはように私には思える二のスレッドが開始されたとき、私は次の例外を取得しますいくつかの割り当てられたリソースは、それらを使用するスレッドが終了すると正しく解放されません。何かヒント?

更新:JACOBバージョン1.14.3

+0

私の解決策:ComThread.Release()を使用してリソースを解放する単純なアプローチが機能しなかったため、静的な方法でJACOBユーティリティクラスを使用してインスタンスのメソッドを呼び出すようになりました。したがって、メインのActiveXObjectも内部的に再インスタンス化されています。おそらく、これはCOM層の腸の中にいくつかの漏れを引き起こしますが、私は本当に気にしない実用的な人です。この操作は1セッションにつき2回、最大3回と呼ばれ、COMインターフェイス実装の黒い魔法を調べるよりもむしろそのような問題を閉じるでしょう。 –

答えて

1

は、私はそれが新しいスレッドモデルだとJACOBの最新バージョンを使用していないが、古いバージョンは間違いないスレッドセーフでした。バージョン1.7以降、基盤となるCOMコンポーネントをよりよく反映するようにスレッドモデルを改善しましたが、そのコンポーネントがMTAかSTAかを判断し、JACOBクラスを適切に初期化する必要があります。要件に応じてアプリケーションを適切に適応させる方法については、JACOB documentationを参照してください。

+0

ヒントをありがとう。私は実際にスレッドセーフティが必要ではない(一度に1つのスレッドしかライブラリで作業していない)が、まだJACOBは正しくハウスキーピングを行うことができないようだ。 –

0

私はいくつかのスレッドに同じスレッド名を設定し始めたときに、同様の問題(最初の実行OK、2番目はオブジェクトを共存できませんでした)が発生し始めました。スレッド名に接尾辞として連続番号を追加することで、私の問題が解決しました。

関連する問題