powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Запуск потока от имени пользователя
9 сообщений из 9, страница 1 из 1
Запуск потока от имени пользователя
    #39012014
mytoffnax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Собственно, даже не знаю возможно ли это...
С помощью jna инициализирую dll и получаю объект. При повторной инициализации вываливается системная ошибка.
1. Как мне можно использовать этот объект в разных потоках?

2. Возможно ли в каждом новом потоке инициализировать новый объект от имени пользователя винды (runas)?
Т.е. первый поток от пользователя 1, второй от пользователя 2 и т.д.

Командная строка в этом случае не подходит (вроде), так как нужно передавать объекту (не dll) нужные параметры после инициализации
Заранее спасибо
...
Рейтинг: 0 / 0
Запуск потока от имени пользователя
    #39012030
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mytoffnaxС помощью jna инициализирую dll и получаю объект. При повторной инициализации вываливается системная ошибка.
1. Как мне можно использовать этот объект в разных потоках?

Сама DLL загружается в JVM лишь единожды. Поэтому достаточно исключить множественную загрузку DLL.
А вот многопоточное использование сильно зависит от самой DLL. Тонны legacy софта написаны с глобальными переменными и ни о какой многопоточности речи быть не может. Единственным решением будет обертка каждого запуска в отдельный процесс. Под виндой это может оказаться достаточно накладно.

mytoffnax2. Возможно ли в каждом новом потоке инициализировать новый объект от имени пользователя винды (runas)?
Т.е. первый поток от пользователя 1, второй от пользователя 2 и т.д.

Это вопрос к винде, а не к Java. AFAIK, процессы запускаются от имени пользователя. Потоки - нет.

mytoffnaxКомандная строка в этом случае не подходит (вроде), так как нужно передавать объекту (не dll) нужные параметры после инициализации
Вы не теми понятиями оперируете. "Командная строка" и "отдельный процесс" это не совсем одно и то же. Да и с параметрами можно что-то придумать. Вопрос только в том решит ли это все проблемы.
...
Рейтинг: 0 / 0
Запуск потока от имени пользователя
    #39012211
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага. загруженная dll - одна на процесс и может (и должна) быть проинициализирована только один раз. Использовать в разных потоках легко - просто вызываешь методы этой длл из разных потоках, используя единственный объект JNA (его не зря рекомендуют делать static).

Если сама длл не предназначена для работы в нескольких потоках параллельно, то придется тебе создавать отдельный JVM-процесс под каждый поток, который тебе нужен.
...
Рейтинг: 0 / 0
Запуск потока от имени пользователя
    #39012219
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scfЕсли сама длл не предназначена для работы в нескольких потоках параллельно, то придется тебе создавать отдельный JVM-процесс под каждый поток, который тебе нужен.
Та, ну нафиг. Зачем обязательно JVM? Можно любой нативный, лишь бы только найти способ с ним общаться.
...
Рейтинг: 0 / 0
Запуск потока от имени пользователя
    #39012277
mytoffnax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помощь!
Классы работающие с dll решил обернуть в отдельный jar и вызывать отдельными процессами.

Это нормальный выход или всё таки это кривой костыль?
...
Рейтинг: 0 / 0
Запуск потока от имени пользователя
    #39012321
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mytoffnaxСпасибо за помощь!
Классы работающие с dll решил обернуть в отдельный jar и вызывать отдельными процессами.
Это нормальный выход или всё таки это кривой костыль?
1) Зависит о самой DLL. Это кривой костыль, но, зачастую, это единственный выход.
2) Стоит учесть что запускать каждый раз новую DLL может быть накладно. Более производительным решением может быть небольшой нативный менеджер, который бы через I/O процесса общался бы с Java.
...
Рейтинг: 0 / 0
Запуск потока от имени пользователя
    #39012461
mytoffnax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обернул в Jar, запустил в отдельном процессе - всё работает, результат верный, но есть один момент
После отработки DLL выдаёт ошибку "Инструкция с таким то адресом попыталась обратиться к такому то адресу. Память не может быть read"
и соответственно процессы жду, когда пользователь нажмёт кнопочку "ОК"

Вызов самого Jar
Код: java
1.
2.
		Process process = Runtime.getRuntime().exec("java -jar C:\\test.jar trololo");
		process.waitFor();



Эта ошибка выскакивает в process.waitFor() (так понимаю, выполнение процесса), можно ли с этим что то сделать, не прибегая к правке DLL?

Суть работы jar
1.Инициализация DLL
2.Выполнение её (создаёт файлы)
3.Копирование созданных файлов

Может быть можно как то грохнуть объект DLL после шага 2?
...
Рейтинг: 0 / 0
Запуск потока от имени пользователя
    #39012537
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mytoffnax....всё работает...DLL выдаёт ошибку "Инструкция с таким то адресом попыталась обратиться к такому то адресу. Память не может быть read"...

У меня когнетивный диссонанс. Так работает или DLL вызывает GPF ? )))

По хорошему - исправлять ошибку
mytoffnax...Может быть можно как то грохнуть объект DLL после шага 2?...
Нет такого "объект DLL". А вот процесс грохнуть можно.

Только, хорошо бы. не грохать, а найти ошибку (что ее вызывает) и исправить.
...
Рейтинг: 0 / 0
Запуск потока от имени пользователя
    #39018493
AlexBoyz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
стандартная ошибка
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Запуск потока от имени пользователя
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]