Просмотр сообщений
|
Страниц: [1] 2 3 ... 39
|
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 и он поставляется исключительно в виде готовой библиотеки, в противном случае это просто садомазохизм.
|
|
|
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 Конечно, хотелось бы увидеть весь проект или тестовый пример, или хотя бы стек вызовов по всем потокам.
|
|
|
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()?
|
|
|
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. По моему, мы нанимали консалтинговую фирму для подготовки документов.
|
|
|
|
|