Высвобождение DLL из памяти
-
- beginner
- Сообщения: 24
- Зарегистрирован: 22 янв 2013, 17:14
- Версия LabVIEW: 2009, 2015
- Контактная информация:
Высвобождение DLL из памяти
Проблема воспроизводится следующим обоазом:
1) Запускаю VI, вызывающий SubVI, содержащий dll'ку
2) Закрываю VI, после его выполнения (причем выполнение произошло без ошибок)
3) Повторяю пункт 1) и получаю ошибку вызова той dll'ки 1097
4) Ошибка пропадает если полностью закрыть LabVIEW, запустить его обратно и запустить VI.
В чем проблема? Почему dll'ка не освобождается после завершения выполнения?
1) Запускаю VI, вызывающий SubVI, содержащий dll'ку
2) Закрываю VI, после его выполнения (причем выполнение произошло без ошибок)
3) Повторяю пункт 1) и получаю ошибку вызова той dll'ки 1097
4) Ошибка пропадает если полностью закрыть LabVIEW, запустить его обратно и запустить VI.
В чем проблема? Почему dll'ка не освобождается после завершения выполнения?
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: Высвобождение DLL из памяти
Есть описание ошибки? Что то у меня не находит такого кода(. А также свойства execution VI и subVI и тип вызова dll (thread).
-
- professor
- Сообщения: 3409
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Высвобождение DLL из памяти
Blackman писал(а):Есть описание ошибки? Что то у меня не находит такого кода(. А также свойства execution VI и subVI и тип вызова dll (thread).
Possible reason(s):
LabVIEW: An exception occurred within the external code called by a Call Library Function Node. The exception might have corrupted the LabVIEW memory. Save any work to a new location and restart LabVIEW.
она и не должна, вдруг ещё понадобится.Privetvsem писал(а): В чем проблема? Почему dll'ка не освобождается после завершения выполнения?
Судя по описанию, в самой dll что-то не то с памятью, или не те данные ей передаёте.
По возможности, скиньте код и описание dll
в добавок к этому
Blackman писал(а):. А также свойства execution VI и subVI и тип вызова dll (thread).
-
- beginner
- Сообщения: 24
- Зарегистрирован: 22 янв 2013, 17:14
- Версия LabVIEW: 2009, 2015
- Контактная информация:
Re: Высвобождение DLL из памяти
Сигнатуры методов, вызываемых из дллки полностью совпадают(что и не удивительно, раз при первом запуске все работает). Возможно проблема в типе вызова (c или stdcall). В настройках стоит stdcall. Дллка вызывается в потоке UI. Пишу настройки по памяти, но то что они такие это 100%. Нагуглил тему, где предлагают вызывать subVI динамически по ссылке и потом по завершении работы с ней закрывать ссылку, что высвободит все ее ресурсы. Еще такая фишка VI вызывает несколько разных subVI, вызывающих одну и ту же DLLку. При повторном запуске программы валится исключение при первом вызове одной из них.Artem.spb писал(а):Blackman писал(а):Есть описание ошибки? Что то у меня не находит такого кода(. А также свойства execution VI и subVI и тип вызова dll (thread).Possible reason(s):
LabVIEW: An exception occurred within the external code called by a Call Library Function Node. The exception might have corrupted the LabVIEW memory. Save any work to a new location and restart LabVIEW.она и не должна, вдруг ещё понадобится.Privetvsem писал(а): В чем проблема? Почему dll'ка не освобождается после завершения выполнения?
Судя по описанию, в самой dll что-то не то с памятью, или не те данные ей передаёте.
По возможности, скиньте код и описание dll
в добавок к этомуBlackman писал(а):. А также свойства execution VI и subVI и тип вызова dll (thread).
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Высвобождение DLL из памяти
А с чем работает dll? Я имею ввиду с железом, базой данных, еще каким-то ресурсом? Если она внутри открывает ссылку на ресурс, вполне возможно, что ссылка не закрывается корректно, и при повторной инициализации ресурса (то бишь - вызове этой dll) и возникает ошибка...
У меня была подобная проблема - dll работала с одной кастомной базой данных. И через вызывались функции, скажем "Read" и "Write". Последовательность "Read" - "Write" работала корректно. Но, когда паралельно вызывались функции "Read", а затем "Write" - запись работала правильно лишь в одном паралельном потоке. Решилось все повторным вызовом функции "Read" для второго, "отстающего" потока. И так и не понятно, в чем проблема - скорее всего, функция "Write" "убивала" все открытые ссылки на базу данных, и все.
А если код в dll, и исходников нету - остается только гадать; как и в Вашем случае.
У меня была подобная проблема - dll работала с одной кастомной базой данных. И через вызывались функции, скажем "Read" и "Write". Последовательность "Read" - "Write" работала корректно. Но, когда паралельно вызывались функции "Read", а затем "Write" - запись работала правильно лишь в одном паралельном потоке. Решилось все повторным вызовом функции "Read" для второго, "отстающего" потока. И так и не понятно, в чем проблема - скорее всего, функция "Write" "убивала" все открытые ссылки на базу данных, и все.
А если код в dll, и исходников нету - остается только гадать; как и в Вашем случае.
Мы делили апельсин - много наших полегло...
-
- beginner
- Сообщения: 24
- Зарегистрирован: 22 янв 2013, 17:14
- Версия LabVIEW: 2009, 2015
- Контактная информация:
Re: Высвобождение DLL из памяти
Исходный код есть...Но там черт ногу сломит. Дллка работает с ком портом, отправляя по нему команды одной штуке. Почему я не использую готовый функционал из LabVIEW? Потому что в дллке зашита логика формирования формата команды. Я думал, что может проблема в том, что не закрывается дескриптор порта, но он закрывается, когда я вызываю соответствующий метод из длл.Kosist писал(а):А с чем работает dll? Я имею ввиду с железом, базой данных, еще каким-то ресурсом? Если она внутри открывает ссылку на ресурс, вполне возможно, что ссылка не закрывается корректно, и при повторной инициализации ресурса (то бишь - вызове этой dll) и возникает ошибка...
У меня была подобная проблема - dll работала с одной кастомной базой данных. И через вызывались функции, скажем "Read" и "Write". Последовательность "Read" - "Write" работала корректно. Но, когда паралельно вызывались функции "Read", а затем "Write" - запись работала правильно лишь в одном паралельном потоке. Решилось все повторным вызовом функции "Read" для второго, "отстающего" потока. И так и не понятно, в чем проблема - скорее всего, функция "Write" "убивала" все открытые ссылки на базу данных, и все.
А если код в dll, и исходников нету - остается только гадать; как и в Вашем случае.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Высвобождение DLL из памяти
Весь код не нужен. Только вызов dllИсходный код есть...Но там черт ногу сломит.
-
- beginner
- Сообщения: 24
- Зарегистрирован: 22 янв 2013, 17:14
- Версия LabVIEW: 2009, 2015
- Контактная информация:
Re: Высвобождение DLL из памяти
Вот одна из VI плюс код того, что собирается в дллку
- Вложения
-
- StandInterface.cpp
- (3.21 КБ) 203 скачивания
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Высвобождение DLL из памяти
Кстати, не советую использовать функцию "Error Cluster From Error Code" в таком применении. Просто сделайте соответствующую константу. Сейчас простая ошибка выливается в такое количество действий, при этом вызывается она ВСЕГДА, независимо от того, была на самом деле ошибка или нет... Вы откройте эту функцию и сами увидите, сколько там накручено.
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: Высвобождение DLL из памяти
После этого проверьте в MAX, есть ли доступ к порту с которым работала DLL.Проблема воспроизводится следующим обоазом:
1) Запускаю VI, вызывающий SubVI, содержащий dll'ку
2) Закрываю VI, после его выполнения (причем выполнение произошло без ошибок)
-
- beginner
- Сообщения: 24
- Зарегистрирован: 22 янв 2013, 17:14
- Версия LabVIEW: 2009, 2015
- Контактная информация:
Re: Высвобождение DLL из памяти
Да вроде все в порядке. Как я уже писал дескриптор порта закрывается после выполнения.Blackman писал(а):После этого проверьте в MAX, есть ли доступ к порту с которым работала DLL.Проблема воспроизводится следующим обоазом:
1) Запускаю VI, вызывающий SubVI, содержащий dll'ку
2) Закрываю VI, после его выполнения (причем выполнение произошло без ошибок)
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: Высвобождение DLL из памяти
Было бы значительно проще, если бы Вы сообщили название вышей "пусковой установки")
А так можно посоветовать просканировать порт на предмет различий в обмене для двух сессий.
Судя по названию ошибки можно предположить, что она возникает на этапе идентификации девайса или ожидания какого-то подтверждения, типа ошибки таймаута в VISA.
А так можно посоветовать просканировать порт на предмет различий в обмене для двух сессий.
Судя по названию ошибки можно предположить, что она возникает на этапе идентификации девайса или ожидания какого-то подтверждения, типа ошибки таймаута в VISA.
-
- beginner
- Сообщения: 24
- Зарегистрирован: 22 янв 2013, 17:14
- Версия LabVIEW: 2009, 2015
- Контактная информация:
Re: Высвобождение DLL из памяти
Эта штука - самопал, которому я даже не знаю сколько лет) Я нагуглил точно такую же проблему, но ее решение там не дали. Буду сам методом тыка отсекать неверные решения...Blackman писал(а):Было бы значительно проще, если бы Вы сообщили название вышей "пусковой установки")
А так можно посоветовать просканировать порт на предмет различий в обмене для двух сессий.
Судя по названию ошибки можно предположить, что она возникает на этапе идентификации девайса или ожидания какого-то подтверждения, типа ошибки таймаута в VISA.
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: Высвобождение DLL из памяти
Есть ли хоть какое-то описание протокола обмена? Можете выложить StandCtrl.h файл? Названия всех VI в драйвере. А лучше всего сам драйвер для попытки реверса и переноса кода в VISA.
-
- beginner
- Сообщения: 24
- Зарегистрирован: 22 янв 2013, 17:14
- Версия LabVIEW: 2009, 2015
- Контактная информация:
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение