D
Dragon001Мамыр 17, 2017, 1:15 Т.Қ.

Com порт,поток и другое

Здравствуйте. Возникло несколько вопросов и не совсем хватает опыта их решить.

1. Есть com порт, его настройки я задаю в основном GUI, после чего создаю объект для работы с com-порт,создаю новый поток,запихиваю в поток объект.
Получается два потока: основной(GUI) и второй(для работы с com-портом).
В этом потоке я принимаю сообщения от com-порта и после делаю обработку.
Возник вопрос,как можно сделать,что-то вроде запрета на прием данных?
То есть, у меня есть данный коннект

connect(&thisPort, &QSerialPort::readyRead,this, &TPort::ReadInPort);
который выполняет слот по получению данных, в котором происходит обработка данных.
Мне нужно как-то залочить прием,пока не обработались данные.
Думал насчет стека очереди. Все таки хотелось узнать мнение профессионала.

И второй вопрос.
2) При обработка данных с com-порта, мы делаем запрос в БД и проверяем количество пришедших значений, если пришел 1 значение, то тут проблем нету, но если будет >1, мне необходимо открыть widget по верх всех окон, но тут возникает проблема, т.к. GUI работает в первичном потоке, нам нет доступа к нему без сигнала, но если использовать сигнал, то в случае,если в GUI будет открыто диалоговое окно, то оно не сработает. Мне нужно,чтобы при любых условиях открылось данный widget, поверх всех открытых окон.
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

5
Evgenii Legotckoi
  • Мамыр 18, 2017, 12:15 Т.Ж.

День добрый.

1) По первому вопросу

С таким функционалом я особо не работал, но встречался с подобным при работе с сетью, поэтому выскажу свои мысли.

Нужно сразу буферизировать данные. Если они не большие, то можно использовать какой-нибудь QList, и использовать компаратор по дате , например, или использовать QVector, но так, чтобы забирать и складывать данные по принципу первый вошёл - первый вышел . По приёму данных записывать их в этот буффер. По записи в буффер вызывать сигнал о том, что была сделана запись. По которому уже забирать данные из буффера. Если учесть, что com-порт у вас в отдельном потоке, то буффер стоит сделать в главном потоке. Информацию передавать по сигнал/слотовому соединению. Остаётся тогда проблема в том, как сообщить программе, что в буффере что-то есть. Думаю, что также можно кидать сигнал из буффера, что данные были приняты. А дальше уже реализовывать разбор данных из буффера с удалением обработанных данных.

Можно также для буфферизации использовать базу данных, например, SQLite, если объёмы данных достаточно большие, а поступают они не очень часто.

Ещё я посмотрел бы в сторону QBuffer и производных классов, думаю, что должно подойти, но придётся наследоваться от него и переопределять некоторые методы. К сожалению, с ним почти не работал.

2) По второму вопросу

Если я понял правильно, то обработку данных и запрос к БД вы делаете в потоке COM-порта. В этом и проблема с окном. Но если сделать буффер в main потоке, то есть в потоке GUI, и сделать там же обработку данных, то станет уже несколько проще, поскольку можно будет не только открывать окно, но и добавлять информацию в открытое окно, также через сигналы и слоты соответственно. То есть, если виджет ещё не открыт, то открываем его, если уже открыт, то обновляем информацию в данном виджете. Виджет тогда нужно объявить в заголовочном файле и чтобы один его экземпляр существовал и к нему были подключены соответствующие сигнал/слотовые соединения.

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

    D
    • Мамыр 18, 2017, 7:02 Т.Ж.
    Насчет первого вопроса, наверно я не правильно подумал о использование какого-либо буффера/листа. У меня есть сканер штрих кода, который считывает некоторый абонемент со штрих кодом (типа "1111111"), если использовать некоторый буффер, в который будет складироваться все значения приходящие, то возникает такая проблема, если человек,много раз со сканирует, программе придется несколько раз проверять одно и тоже, что черевато, т.к. у меня некоторая система пропуска,если он много раз со сканирует, то много раз и откроется.
    Может быть все таки есть,какая нибудь задержка? может быть сделать как-то хитро, что-то вроде еще одного слота + переменная типа bool, при приходе данных,мы вызываем данный слот, проверяем переменную,если она не true, просто выходим, иначе прогоняем?

    Насчет второго вопроса, то есть, в потоке gui,создать окно,его скрыть, при необходимости его показать и обновить данные, но если будет открыто диалоговое окно, откроется ли данный виджет?
    Если убрать обработку данных с потока com-порта,в основной, не помешает ли это работе? Просто у меня есть окно некого администратора (основной gui, в котором работает пользователь), ему никак не должно мешать, то что обрабатывается данные пришедшие с com-порта, одно условие, это выпадение окна поверх всех с некоторой информацией, после проверки в БД.
      Evgenii Legotckoi
      • Мамыр 18, 2017, 10:07 Т.Ж.

      1) Задержку можно реализовать с помощью того же самого таймера, в самом классе, который отвечает за считывание данных. И игнорировать все входящие данные в течение определённого периода. Либо сделать временное хранилище с тем же самым QMap, в котором в качестве ключа будет храниться уникальный идентификатор штрихкода с временем жизни. То есть в качестве ключа будет Id штрихкода, а в качестве значения - время жизни. При считывании данных проверять наличие id в QMap, если он есть, то смотреть время жизни. Если не истекло, значит игнорировать обработку, если истекло, значит можно считать повторно. Время жизни установить допустим 15 секунд для считывания.

      2) Вообще, если виджет подразумевается как окно, то может открыться, как таковой проблемы в этом нет. Что касается того, что помешает ли работе gui, то может быть, но если учесть уточнение по работе программы из первого вопроса, то я уже не вижу большой необходимости в переносе буфера в main, можно и там оставить.

        D
        • Мамыр 18, 2017, 3:17 Т.Қ.

        1. Таймер тут к сожалению не подойдет, т.к. не известно сколько времени нужно будет,а брать слишком малое черевато. QMap тоже не подойдет, посетитель может зайти и позже, но если он будет в контейнере, может сработать не верно,я все таки думаю сделать, через переменную.
        2. Вот тут разобрался, вроде все заработало
        Спасибо большое вам за вашу помощь.

          Evgenii Legotckoi
          • Мамыр 19, 2017, 2:40 Т.Ж.

          1. Тогда сначала нужно описать все возможные дозволенные варианты поведения посетителя и потом уже отталкиваться от них. Поскольку начинается такая ситуация:
          -Давайте сделаем задержку.
          -А если посетитель уйдет?
          -А если посетитель вернётся?
          -т.д.
          Нужно описать все эти если, то есть написать User Story фактически на этот кейс. И уже на основе него думать над возможным функционалом и решением.

            Пікірлер

            Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
            Кіріңіз немесе Тіркеліңіз
            AD

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Нәтиже:50ұпай,
            • Бағалау ұпайлары-4
            m
            • molni99
            • Қаз. 26, 2024, 1:37 Т.Ж.

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Нәтиже:80ұпай,
            • Бағалау ұпайлары4
            m
            • molni99
            • Қаз. 26, 2024, 1:29 Т.Ж.

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Нәтиже:20ұпай,
            • Бағалау ұпайлары-10
            Соңғы пікірлер
            ИМ
            Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
            Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
            Evgenii Legotckoi
            Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
            Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
            A
            ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
            Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
            ИМ
            Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
            Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
            d
            dblas5Шілде 5, 2024, 11:02 Т.Ж.
            QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            Енді форумда талқылаңыз
            m
            moogoҚар. 22, 2024, 7:17 Т.Ж.
            Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
            Evgenii Legotckoi
            Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
            добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
            t
            tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
            google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
            NSProject
            NSProjectМаусым 4, 2022, 3:49 Т.Ж.
            Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

            Бізді әлеуметтік желілерде бақылаңыз