Domanda

Ho uno strano problema usando Jacob da due di conseguenza, ha iniziato i fili identici.Ho una classe di utilità che utilizza un campo statico ActiveXObject per la spedizione di varie richieste al WMI.Il primo filo funziona bene.Quando viene avviata la seconda discussione, ottengo la seguente eccezione:

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)
.

Il thread è avviato da un clic del mouse da una GUI, ma l'errore è riproducibile manualmente:

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

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

Mi sembra che alcune risorse assegnate non vengano rilasciate correttamente quando il filo che li utilizza termina.Qualche suggerimento?

Aggiornamento: Jacob Versione 1.14.3

È stato utile?

Soluzione

Non ho usato l'ultima versione di Jacob con il suo nuovo modello di filettatura, ma le versioni precedenti erano sicuramente non al sicuro.A partire dalla versione 1.7> hanno migliorato il modello di threading per riflettere meglio i componenti COM sottostanti, ma è necessario determinare se detto componente è MTA o STA, e quindi inizializzare le classi Jacob in modo appropriato.Fare riferimento a Documentazione Jacob per come adattare correttamente la tua applicazione in base alle sue esigenze.

Altri suggerimenti

Ho iniziato a sperimentare un problema simile (prima esecuzione OK, secondo non riuscito con non è possibile co-creare oggetto), quando ho iniziato a impostare lo stesso nome del filo in più thread.Aggiunta di numero sequenziale come suffisso al nome del thread ha risolto il problema per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top