LabVIEW и dll написанная на Qt

Простейшие вопросы в области инженерной разработки
Ответить
Alex K
interested
interested
Сообщения: 5
Зарегистрирован: 21 окт 2016, 10:48
Версия LabVIEW: 2014
Контактная информация:

LabVIEW и dll написанная на Qt

Сообщение Alex K »

Здравствуйте, есть библиотека dll, написанная на Qt. Она используется в проекте на LabVIEW и для ее вызова используется функция CLFN. Библиотека использует сигналы и слоты, при вызове сигнала, переход в слот не осуществляется. При использовании этой библиотеки для проекта на С++ все отрабатывает.

Код: Выделить всё

class Client_LV : public QObject
{
    Q_OBJECT
public:
    Client_LV();
    static BufferMessages * bufferMessages;
    static CModule * cmodule;
    static __cdecl void open(char nameModule[100]);
    static __cdecl void close();
    static __cdecl void connect_udp(quint8 indexInterface, quint16 _clientPort, quint16 _serverPort, char _serverAddress[], char messageConnect[]);
    static __cdecl bool resultConnection();
}
Функция open инициализирует переменную cmodule;
Функция connect_udp вызывает функцию cmodule->connect_udp, в которой отправляется сигнал вызывающий слот другого потока.

Также в LabVIEW в функции CLFN имена функций dll отображаются некорректно (см. вложение), как победить эту проблему?
Вложения
111.JPG
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: LabVIEW и dll написанная на Qt

Сообщение dadreamer »

Alex K, это у вас какая функция вызывается на рисунке? (ZN14BufferMessagesC1EP11QStringList)
Вот эта?
Alex K писал(а):

Код: Выделить всё

static __cdecl void open(char nameModule[100]);
В неё надо передать массив из 100 байт, а не LV String Handle. Выделите массив на 100 элементов U8 и подайте на вход (Array Data Pointer). Или можете передать как C String Pointer, только не забудьте указать минимальную длину в 100 байт.
Alex K писал(а):Также в LabVIEW в функции CLFN имена функций dll отображаются некорректно (см. вложение), как победить эту проблему?
extern "C" { ... } ?
Alex K
interested
interested
Сообщения: 5
Зарегистрирован: 21 окт 2016, 10:48
Версия LabVIEW: 2014
Контактная информация:

Re: LabVIEW и dll написанная на Qt

Сообщение Alex K »

dadreamer, да, вызывается

Код: Выделить всё

static __cdecl void open(char nameModule[100]);
Сделал extern C, отображать стало нормально. Данные в функции тоже передаются нормально, проверялось. Не работают именно сигналы, реализованные в используемой библиотеки в классе CModule.
Вложения
111.JPG
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: LabVIEW и dll написанная на Qt

Сообщение dadreamer »

Alex K писал(а):Данные в функции тоже передаются нормально, проверялось.
Удивительно, потому что
extcode.h писал(а):

Код: Выделить всё

/** @brief Long Pascal-style string types. */
typedef struct {
	int32	cnt;		/* number of bytes that follow */
	uChar	str[1];		/* cnt bytes */
} LStr, *LStrPtr, **LStrHandle;
LStrHandle *arg1 как-то не очень похоже на char nameModule[100]. Ну да ладно. :)
Alex K писал(а):Не работают именно сигналы, реализованные в используемой библиотеки в классе CModule.
Не в UI потоке (Run in any thread) тоже не работает?
Alex K
interested
interested
Сообщения: 5
Зарегистрирован: 21 окт 2016, 10:48
Версия LabVIEW: 2014
Контактная информация:

Re: LabVIEW и dll написанная на Qt

Сообщение Alex K »

dadreamer, Попробовал Run in any thread, тоже не работает. А у вас работает при использовании Run in any thread?
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: LabVIEW и dll написанная на Qt

Сообщение dadreamer »

Alex K писал(а):dadreamer, Попробовал Run in any thread, тоже не работает. А у вас работает при использовании Run in any thread?
:D А что именно должно у меня работать-то? Вы же не скинули никакой библиотеки. А так, смотря какая DLL и какие функции экспортирует. Если речь о стандартных библиотеках, например из WinAPI, то практически все функции там реентерантные и потому прекрасно работают в любом потоке. Если библиотека от стороннего вендора, то обычно в мануале написано, можно ли вызывать ту или иную функцию одновременно. В данном случае DLL самописная, так что лишь от вас зависит, будет ли функция потокобезопасной или же нет.

Попробуйте упростить код по максимуму. Отключите временно все ненужные участки. Может, удастся изолировать проблему и таким образом обнаружить. Ну, и можете выложить какие-то свои наработки, например, отладочную DLL с 1-2 функциями, которые должны работать, но не хотят. Также попытайтесь вызвать ваши функции из какой-то другой среды, например, Delphi или VB (не из той IDE, где писалось всё это хозяйство), чтобы отследить специфику. Есть и крайний вариант, но порой весьма эффектный - пройтись отладчиком по asm-листингу.
Alex K
interested
interested
Сообщения: 5
Зарегистрирован: 21 окт 2016, 10:48
Версия LabVIEW: 2014
Контактная информация:

Re: LabVIEW и dll написанная на Qt

Сообщение Alex K »

Со слотами все получилось. Теперь возникла другая проблема, не срабатывает второй поток в библиотеке dll. Прилагаю исходники в качестве примера, описание в файле Readme.txt.
Вложения
WriteFile.zip
LabVIEW 2014
(41.69 КБ) 96 скачиваний
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: LabVIEW и dll написанная на Qt

Сообщение dadreamer »

Alex K
2016-10-31_11-01-50.jpg
Это ему QT ран-тайма не хватает?

Сделайте статическую сборку без зависимостей. Заодно, проверьте на другой машине без QT.
Alex K
interested
interested
Сообщения: 5
Зарегистрирован: 21 окт 2016, 10:48
Версия LabVIEW: 2014
Контактная информация:

Re: LabVIEW и dll написанная на Qt

Сообщение Alex K »

Добавил в архив в папку release необходимые библитеки QT для запуска, но залить архив не получается, видимо вес в 80 метров форум блокирует. Вот ссылка на архив WriteFile
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: LabVIEW и dll написанная на Qt

Сообщение dadreamer »

Alex K, ну, что могу сказать... У меня создаётся текстовик по указанной локации. Но только один, второй не хочет создаваться. Время туда пишется также (один вызов write - одна запись). Чувствую, что-то не совсем правильно в синхронизации потоков. Но поскольку я не любитель QT (предпочитаю MSVS), то помочь вряд ли смогу. Посмотрите тему http://www.labviewportal.org/viewtopic.php?f=73&t=2354, может, что-то полезное найдёте.
Mad!sson
beginner
beginner
Сообщения: 22
Зарегистрирован: 21 янв 2015, 10:46
Версия LabVIEW: 2013
Контактная информация:

Re: LabVIEW и dll написанная на Qt

Сообщение Mad!sson »

_cdecl
На своем примере знаю, что при использовании уже готового .exe можно получить кучу проблем, как минимум ошибку при обращении к библиотеке. Лучше использовать в stdcall.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»