Russian Qt Forum
Декабрь 03, 2024, 20:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1] 2 3 ... 39
1  Qt / Пользовательский интерфейс (GUI) / Re: QDateTimeEdit без года : Ноябрь 12, 2024, 09:54
Можно задать ограничение на диапазон дат в 1 год

Код
C++ (Qt)
calendar->setDateRange(min, max);
 

и
Цитировать
можно не заморачиваться и при отсутствии года вызвать
если так пользователю удобнее будет.
2  Qt / Общие вопросы / Re: Проблема с подключением DLL на VS и QtCreator : Октябрь 25, 2024, 15:21
Извините что сразу не уточнил Смеющийся

Да в студии используется стандартный компилятор(msvc toolset), а в Qt MinGW32bit

Т.е получается, что библа используемая в проекте должна быть собрана тем же компилятором что и сам проект иначе никак.
Я правильно понимаю?  Может можно как-то настроить?

В C++ нет стандарта по экспорту методов при сборке библиотек, поэтому библиотеки совместимы только тогда, когда собраны одним и тем же компилятором.

Такой стандарт есть в C, но тогда в C++ коде глобальные методы (для других нельзя) нужно задекларировать как

Код
C++ (Qt)
// MyCFuncs.h
#ifdef __cplusplus
extern "C" {  // only need to export C interface if
             // used by C++ source code
#endif
 
__declspec( dllimport ) void MyCFunc();
__declspec( dllimport ) void AnotherCFunc();
 
#ifdef __cplusplus
}
#endif
 

Далее небольшой геморрой с подготовкой файлов для другого компилятора

Инструментами из состава MinGW для библиотеки требуется выполнить

  • Запустить gendef example.dll(сгенерирует example.def)
  • Запустить dlltool -D example.dll -d example.def -l libexample.a(сгенерирует libexample.a)
  • Использовать libexample.a вместе с example.dll для линковки с проектом на MinGW

И главное не напутать с битностью библиотеки, так как инструменты не выдают никаких ошибок).

Такой подход следует использовать только тогда, когда нет исходных файлов example и он поставляется исключительно в виде готовой библиотеки, в противном случае это просто садомазохизм.
3  Qt / Вопросы новичков / Re: Сторонняя подключенная библиотека не работает : Сентябрь 26, 2024, 13:06
Еще есть вариант собрать hidapi в виде статической библиотеки.
Тип указывается в настройках проекта в Visual Studio.
4  Qt / Вопросы новичков / Re: Сторонняя подключенная библиотека не работает : Сентябрь 26, 2024, 10:14
Эти ошибки возникают на этапе линковки и только в Windows, так как методы библиотеки не экспортированы.
Обычно в проектах делают что-то типа

Код
C++ (Qt)
#if defined( BUILD_DLL )
   #define IMPORT_EXPORT __declspec(dllexport)
#else
   #define IMPORT_EXPORT __declspec(dllimport)
#endif
class IMPORT_EXPORT MyClass {
   ...
};
 
IMPORT_EXPORT void myMethod();
 

Где при сборке библиотеки IMPORT_EXPORT определяется как __declspec(dllexport), а при сборке приложения как__declspec(dllimport).

Похоже hidapi не содержит такого механизма, либо при его сборке не определен необходимый DEFINE.

Можно обойтись без IMPORT_EXPORT, тогда необходимо сгенерировать def файл по инструкции

https://learn.microsoft.com/ru-ru/cpp/build/exporting-from-a-dll-using-def-files?view=msvc-170
https://learn.microsoft.com/en-us/cpp/build/reference/def-specify-module-definition-file?view=msvc-170
5  Qt / Вопросы новичков / Re: Не отвечает слот после отправки сигнала : Июль 23, 2024, 12:27
Потому что разные экземпляры Automat инициированы для разных переменных autw

Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent)
   , ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
   autw = new Automat();
   connect(this,&MainWindow::open_window,autw,&Automat::open_automat);
 
   ld=new load();
}
 

Код
C++ (Qt)
load::load(QObject *parent) : QObject(parent)
{
   autw = new Automat();
   connect(autw,&Automat::get_load,this,&load::load_data);
   connect(this,&load::get_data,autw,&Automat::load_text);
 
}
 


Из общих замечаний - нет очистки ресурсов (RAII). Всё что создано через new "повисает в воздухе".
Никто не владеет экземплярами autw и ld. Хотя бы следует сделать delete для них, подобно как delete ui.
А лучше использовать unique_ptr вместо простых указателей, в нем RAII реализовано внутри, тогда и delete вызывать не нужно.
6  Qt / Многопоточное программирование, процессы / Re: Ошибка "Segmentation fault" : Апрель 04, 2024, 15:23
Крах программы наблюдается, когда я перед загрузкой новой конфигурации удаляю старые объекты контроллеров, использующих протоколы modbus rtu по протоколу TCP/IP. Это мой компонент (QModbusRtuClient), я сделал его на основе уже имеющихся в составе qtserialbus, исходники я публиковал где-то здесь. Ключевые фрагменты кода (не существенные части я пропускаю, отмечено '...'):

Код
C++ (Qt)
CModbusInterface::CModbusInterface(...) {
...
       //
       modbusDevice = new QModbusRtuClient(this);
...
}
 
CModbusInterface::~CModbusInterface(){
   if (modbusDevice) {
       modbusDevice->deleteLater();
   }
}
 

Фрагмент кода не должен приводить к краху по рассматриваемой причине.
Код в деструкторе лишний, так как при конструировании modbusDevice указан родитель this, который и управляет его временем жизни.

после чего сокетом формируется сигнал ошибки и отправляется уже удаленному modbusDevice. И программа валится.

Все сигнал слот соединения разрываются и все сообщения для modbusDevice удаляются из очереди обработки при его удалении.
Поэтому ситуации "сокетом формируется сигнал ошибки и отправляется уже удаленному modbusDevice" при корректной реализации быть не может.

Здесь на лицо проблема конкурентного доступа к экземпляру объекта. Обработка сообщений происходит в одном потоке, удаление объекта в другом.
Можно проверить это с помощью определения своего типа производного QModbusRtuClient, например, и вывода и сравнении информации о потоке в деструкторе и обработчиках сигналов.

Вариантов управления временем жизни не так уж и много:

  • объект на стеке - удалиться при потере области видимости в том же потоке, где был создан, независимо от потока обработки событий
  • член класса - удалиться вместе с экземпляром агрегата, независимо от потока обработки событий
  • умный указатель - удалиться вместе удаления умного указателя, независимо от потока обработки событий
  • Qt parent-child отношение - удалиться вместе с экземпляром родителя, независимо от потока обработки событий
  • new/delete - удалиться в вместе вызова delete, независимо от потока обработки событий
  • deleteLater - удалиться в потока обработки событий, независимо от других способов владения (кроме Qt parent-chaild)


Основное, вроде, перечислил.
Почти любая суперпозиция способов владения - крах программы с похожей проблемой, как здесь.

Удаление, изменение и т.д. конфигурации не должно приводить в краху программы. Решение задачу с помощью "отложенное удаление старой конфигурации ...", лишь усугубит ситуацию, так как проблема никуда не денется, а частота её появления уменьшиться.



7  Qt / Многопоточное программирование, процессы / Re: Ошибка "Segmentation fault" : Апрель 04, 2024, 08:21
Код
C++ (Qt)
QObject::connect(&archivingThread, &QThread::finished, archiving, &CServiceArchives::deleteLater);
 

Цитировать
If deleteLater() is called after the main event loop has stopped, the object will not be deleted.

Что-то подсказывает мне, что archiving никогда не удалиться), цикл обработки событий уже не работает.
Одна морока с этим moveToThread  В замешательстве

Конечно, хотелось бы увидеть весь проект или тестовый пример, или хотя бы стек вызовов по всем потокам.
8  Qt / Многопоточное программирование, процессы / Re: Ошибка "Segmentation fault" : Апрель 03, 2024, 15:21
И ещё... Если иcпользовался moveToThread, то удалять нужно через deleteLater(), чтобы удаление произошло в правильном потоке.
9  Qt / Многопоточное программирование, процессы / Re: Ошибка "Segmentation fault" : Апрель 03, 2024, 14:56
Или может сигнал слот взаимодействие через обычный AutoConnection, а потом используется moveToThread()?
А это имеет значение? Если да, то позор мне...  Грустный

Такие ошибки чаще всего связаны именно с этим. Значение имеет огромное.

Когда осуществляется connect по AutoConnection выбирается способ соединения в соответствии с потоками обработки событий объектов.
Если потоки одинаковые, то AutoConnection == DirectConnection.

После moveToThread объект меняет поток обработки событий, а соединения остаются связанными через DirectConnection.
События в одном потоке, сигнал слот в другом, отсюда следует UB в случае конкурентного доступа к полям экземпляра объекта.
И программа может упасть не обязательно из-за деструктора, а в любой момент в процессе работы.
А уж если деструктор вызвался, то практически гарантировано упадет (но есть случаи, когда может и не упасть)). UB оно такое).
10  Qt / Многопоточное программирование, процессы / Re: Ошибка "Segmentation fault" : Апрель 01, 2024, 08:37
Такое впечатление, что receiver не живой или почти не живой.
Базовый тип QObject выглядит подозрительно.

Нет ли сигнал слот взаимодействия через DirectConnection для объектов, связанных с разными потоками?
Или может сигнал слот взаимодействие через обычный AutoConnection, а потом используется moveToThread()?
11  Qt / Qt Quick / Re: Найти и выделить слово в TextArea : Март 28, 2024, 14:39
TextArea отображает разметку html, выделяемые слова можно поместить в теги, определяющие формат выделения.
12  Qt / Работа с сетью / Re: tcp proxy server. Только на berkley sockets (select/poll/epoll) : Январь 31, 2024, 11:10
И еще момент, лучше разделять запросы по ';' не смотря на 'SELECT'.
В SQL есть и другие команды, кроме выборки данных (SELECT). Улыбающийся

По хорошему да.., но ';' не обязателен в конце запроса. Поэтому про пример трафика и пишу.
Если явных признаков начала и конца нет, то парсер придется писать)).
13  Qt / Работа с сетью / Re: tcp proxy server. Только на berkley sockets (select/poll/epoll) : Январь 31, 2024, 10:58
При подключении нового клиента, выполняем подключение к серверу и после этого имеем пару сокетов client-proxy и proxy-server, вот все что приходит по первому сокету, нужно отправить во второй и наоборот. Если один из сокетов закрывается, то нужно закрыть и второй.
Как правило эти два сокета хранятся в объектах, которые называют session. Улыбающийся

Я тоже к такой схеме пришёл). Назвал объект только proxy_client.

Цитировать
Как мне узнать, что ответ получен не полностью и ожидается продолжение?

Нужно реальный трафик смотреть. В общем случае никак. Если в сети текст, то надеяться, что есть разделитель ";", либо по слову "SELECT" или другим косвенным признакам.
Если бинарный протокол, то его нужно знать, скорее всего, где-то длина пакета должна быть.
14  Qt / Работа с сетью / Re: tcp proxy server. Только на berkley sockets (select/poll/epoll) : Январь 30, 2024, 17:04
С сетью работал оочень давно). Похоже, что должно работать.

Цитировать
Необходимо распарсить сетевые пакеты, проходящие через
прокси, в которых содержатся SQL запросы, извлечь эти запросы из пакетов и записать их
в файл в виде текста (по одному запросу в строке, структура неважна)

Вот этой части не нашел. В обработчике только вывод в cout.

По идее SQL запросы необходимо собирать из сетевых пакетов.
При этом пакеты могут неожиданно разрываться и слипаться между собой.
Должен быть какой-то признак окончания запроса (м.б. символ";").
15  Разное / Говорилка / Re: Регистрация программы в Росреестре : Январь 19, 2024, 09:50
Коллеги,
прошло много времени, появиличь ли прецеденты регистрации программ на Qt в росреестре?

Да, мы регистрировали несколько продуктов в 2021-2023.
По моему, мы нанимали консалтинговую фирму для подготовки документов.
Страниц: [1] 2 3 ... 39

Страница сгенерирована за 0.232 секунд. Запросов: 23.