Библиотека Jacob не удается при использовании в нескольких потоках

StackOverflow https://stackoverflow.com//questions/9684512

Вопрос

У меня странная проблема, используя Джейкоб из двух, следовательно, начал одинаковые потоки.У меня есть утилитный класс, который использует поле Static ActiveXObject для диспетчеризации различных запросов к WMI.Первый нить работает нормально.Когда второй поток запущен, я получаю следующее исключение:

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

Это было полезно?

Решение

Я не использовал последнюю версию JACOB с новой моделью Threading, но более старые версии были определенно не безопасным потоком.Нашей версии 1.7> они улучшили модель резьбы, чтобы лучше отразить базовые компоненты COM, но вы должны определить, является ли указанный компонент MTA или STA, а затем инициализируйте классы Jacob.Обратитесь к Документация Jacob для того, чтобы правильно адаптировать ваше приложение в соответствии с его требованиями.

Другие советы

Я начал испытывать подобную проблему (первое выполнение OK, второе не удалось с помощью объекта CORMET CREATE), когда я начал устанавливать одно и то же имя потока на несколько потоков.Добавление последовательного числа в качестве суффикса к названию резьбы исправлена проблема для меня.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top