Использовать Qt только ради механизма сигнал-слотов?!
На работе довелось поддерживать проект для embedded устройства (без gui), в котором Qt использовался ради механизма сигналов-слотов.
Считается ли это оверхедом или это нормальная ситуация?
Если да, то какие библиотеки сигналов-слотов кто использует и почему? Или вообще лучше тупо обычные коллбэки использовать?
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
B
- Bogdannn
- 28 марта 2024 г. 5:15
C++ - Тест 001. Первая программа и типы данных
- Результат:46баллов,
- Очки рейтинга-6
Последние комментарии
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий Кононенко5 февраля 2024 г. 12:50
EVA25 декабря 2023 г. 21:30
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев14 апреля 2024 г. 12:35
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
Как получить в массив значения из связанной модели? Спасибо, разобрался:))
AC
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
Alexandru Codreanu19 января 2024 г. 22:57
Механизм сигнал-слот - это паттерн наблюдатель, который можно реализовать на чистом С++. Примеров масса, сторонние библиотеки для этого не требуются.
Сложнее будет в случае использования многопоточки, но и там всё можно решить.
Если тащить QT только ради этого, моё мнение - это слишком избыточно.
Если нужна сторонняя библиотека и не хочется изобретать велосипед - boost signals2 вам в помощь.
Насчет оверхэда не подскажу, но использование сигналотов-слотов является лучшим решением чем колюэки, там некоторые проверки происходят на этапе компиляции. Более подробно описанно в этой статье
Сигналы и слоты есть в boost и они там на шаблонах, в boost слот ещё может возвращать результат в отличие от Qt. Но ни раз не сталкивался с ситуацией, когда бы мне это требовалось.
При этом Qt "вроде как" более потокобезопасный, а также может вызывать методы и сигналы по имени функции за счёт мета-объектной системы в других потоках, опять же потокобезопасно вызывать эти методы.
Вполне возможно, что в вашем проекте именно такие мета-объектные хаки могут присутствовать.
Также boost взял концепцию сигналов и слотов именно из Qt.
При этом в Qt как мне кажется более удобно реализована рабочая петля приложения. Нет необходимости очень много костылей для этого писать, да и connect сигналов и слотов будет поудобнее и работать будет более предсказуемо за счёт очереди вызовов сигнал слотовых соединений.
Так что в принципе ничего плохого в использовании Qt ради сигналов и слотов не вижу, тем более что это один из главных аргументов, на мой взгляд, чтобы использовать сигналы и слоты, кроме кроссплатформенности GUI.
Коллбеки работают немного быстрее сигналов и слотов, это даже в документации написано, но эта разница настолько незначительна, что не стоит внимания. При том что сигналы и слоты явно удобнее в использовании. Однако при разрастании программы порой становится сложнее отслеживать, откужа именно прилетел сигнал, но я сейчас говорю о действительно больших проектах, например, на миллион строк кода. В более мелких случаях зависит от опыта. Новичок и в трёх файлах запутаться может.
В принципе, если нет желания тянуть в проект Qt только ради сигналов и слотов, то можете попробовать использовать Boost.Signals2. Но только в том случае, если это новый проект. Не стоит в старом проекте дружить сигналы и слоты этих двух библиотек.
Какие-либо остальные библиотеки сигналов и слотов я бы вообще не рассматривал.
За использование Qt могу ещё сказать, что в embedded проекте можно использовать сетевые части Qt, то есть тот же самый QNetworkAccessManager , который является очень удобной штукой и позволяет значительно быстрее написать обращение к сайтам, серверам и т.д. чем какие-либо други библиотеки, а также имеет весьма удобную поддержу json. Я пробовал работать с json на другой библиотеке, по личным ощущениям было не так удобно. Также есть парсинг XML и т.д.
В общем не стоит сбрасывать со счетов Qt, если на первый взгляд он вам нужен только для сигналов и слотов. Там есть ещё много плюшек, которые весьма неплохо реализованы.
Cпасибо. Да, проект многопоточный и он должен уметь собираться под разное железо.
Т.е. надо под каждую отличающуюся платформу пересобирать qt. Вот эт прям бесит.
Ну в каждой избушке свои погремушки, поэтому нет гарантий, что не придётся пересобирать boost, частично он конечно шаблонный, но есть и часть функционала, который компилируют.
Многопоточность можно также решить и потоками boost или std, но если честно, тот же самый QtConcurrent весьма классная вещь, когда нужно распараллелить какие-нибудь вычисления, и собрать потом результат в одну кучу. Весьма удобно для локального распареллеливания какой-нибудь математики, когда дошли до какого-то места программы и не нужно проходить дальше, пока вычисления не будут готовы. А QtConcurrent с блокировкой выполнения позволяет раскидать математику по всем имеющимся ресурсам, пока не выполнит вычисления, а потом обратно в один поток собирается.
Json в Qt реализован не лучшим образом. Если важна скорость обработки тех же реквестов, то рекомендую использовать RapidJSON. Данную библиотеку очень просто интегрировать в проект, нужно просто скачать ее и прописать INCLUDEPATH в файле сборки проекта. Ниже привожу общий рейтинг json-библиотек, а также их рейтинг по различным параметрам (parsing time, parsing memory, stringify time, prettify time, code size).