|
|
|
Запуск потока от имени пользователя
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток! Собственно, даже не знаю возможно ли это... С помощью jna инициализирую dll и получаю объект. При повторной инициализации вываливается системная ошибка. 1. Как мне можно использовать этот объект в разных потоках? 2. Возможно ли в каждом новом потоке инициализировать новый объект от имени пользователя винды (runas)? Т.е. первый поток от пользователя 1, второй от пользователя 2 и т.д. Командная строка в этом случае не подходит (вроде), так как нужно передавать объекту (не dll) нужные параметры после инициализации Заранее спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2015, 11:18 |
|
||
|
Запуск потока от имени пользователя
|
|||
|---|---|---|---|
|
#18+
mytoffnaxС помощью jna инициализирую dll и получаю объект. При повторной инициализации вываливается системная ошибка. 1. Как мне можно использовать этот объект в разных потоках? Сама DLL загружается в JVM лишь единожды. Поэтому достаточно исключить множественную загрузку DLL. А вот многопоточное использование сильно зависит от самой DLL. Тонны legacy софта написаны с глобальными переменными и ни о какой многопоточности речи быть не может. Единственным решением будет обертка каждого запуска в отдельный процесс. Под виндой это может оказаться достаточно накладно. mytoffnax2. Возможно ли в каждом новом потоке инициализировать новый объект от имени пользователя винды (runas)? Т.е. первый поток от пользователя 1, второй от пользователя 2 и т.д. Это вопрос к винде, а не к Java. AFAIK, процессы запускаются от имени пользователя. Потоки - нет. mytoffnaxКомандная строка в этом случае не подходит (вроде), так как нужно передавать объекту (не dll) нужные параметры после инициализации Вы не теми понятиями оперируете. "Командная строка" и "отдельный процесс" это не совсем одно и то же. Да и с параметрами можно что-то придумать. Вопрос только в том решит ли это все проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2015, 11:25 |
|
||
|
Запуск потока от имени пользователя
|
|||
|---|---|---|---|
|
#18+
Ага. загруженная dll - одна на процесс и может (и должна) быть проинициализирована только один раз. Использовать в разных потоках легко - просто вызываешь методы этой длл из разных потоках, используя единственный объект JNA (его не зря рекомендуют делать static). Если сама длл не предназначена для работы в нескольких потоках параллельно, то придется тебе создавать отдельный JVM-процесс под каждый поток, который тебе нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2015, 13:12 |
|
||
|
Запуск потока от имени пользователя
|
|||
|---|---|---|---|
|
#18+
scfЕсли сама длл не предназначена для работы в нескольких потоках параллельно, то придется тебе создавать отдельный JVM-процесс под каждый поток, который тебе нужен. Та, ну нафиг. Зачем обязательно JVM? Можно любой нативный, лишь бы только найти способ с ним общаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2015, 13:16 |
|
||
|
Запуск потока от имени пользователя
|
|||
|---|---|---|---|
|
#18+
Спасибо за помощь! Классы работающие с dll решил обернуть в отдельный jar и вызывать отдельными процессами. Это нормальный выход или всё таки это кривой костыль? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2015, 13:45 |
|
||
|
Запуск потока от имени пользователя
|
|||
|---|---|---|---|
|
#18+
mytoffnaxСпасибо за помощь! Классы работающие с dll решил обернуть в отдельный jar и вызывать отдельными процессами. Это нормальный выход или всё таки это кривой костыль? 1) Зависит о самой DLL. Это кривой костыль, но, зачастую, это единственный выход. 2) Стоит учесть что запускать каждый раз новую DLL может быть накладно. Более производительным решением может быть небольшой нативный менеджер, который бы через I/O процесса общался бы с Java. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2015, 14:09 |
|
||
|
Запуск потока от имени пользователя
|
|||
|---|---|---|---|
|
#18+
Обернул в Jar, запустил в отдельном процессе - всё работает, результат верный, но есть один момент После отработки DLL выдаёт ошибку "Инструкция с таким то адресом попыталась обратиться к такому то адресу. Память не может быть read" и соответственно процессы жду, когда пользователь нажмёт кнопочку "ОК" Вызов самого Jar Код: java 1. 2. Эта ошибка выскакивает в process.waitFor() (так понимаю, выполнение процесса), можно ли с этим что то сделать, не прибегая к правке DLL? Суть работы jar 1.Инициализация DLL 2.Выполнение её (создаёт файлы) 3.Копирование созданных файлов Может быть можно как то грохнуть объект DLL после шага 2? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2015, 15:56 |
|
||
|
Запуск потока от имени пользователя
|
|||
|---|---|---|---|
|
#18+
mytoffnax....всё работает...DLL выдаёт ошибку "Инструкция с таким то адресом попыталась обратиться к такому то адресу. Память не может быть read"... У меня когнетивный диссонанс. Так работает или DLL вызывает GPF ? ))) По хорошему - исправлять ошибку mytoffnax...Может быть можно как то грохнуть объект DLL после шага 2?... Нет такого "объект DLL". А вот процесс грохнуть можно. Только, хорошо бы. не грохать, а найти ошибку (что ее вызывает) и исправить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2015, 16:43 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39012030&tid=2125130]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 357ms |

| 0 / 0 |
