Установите приоритет для событий

Я делаю приложение в QT. Я использую QExtSerialPort для получения данных из последовательного порта моего компьютера (всякий раз, когда испускается сигнал readyread()). У меня также есть несколько таймеров, выполняющих другие действия через определенные промежутки времени. Сейчас заметил, что при включенных таймерах не все данные сигнала готовности выбрасываются намного меньше, чем когда таймеры не включены. Есть ли способ в QT убедиться, что все данные последовательного порта получены? Может быть, установив высокий приоритет для события readyread или что-то в этом роде?


person Frank    schedule 05.09.2012    source источник
comment
какую скорость передачи вы используете? вы могли бы замедлить его.   -  person TJD    schedule 05.09.2012
comment
на данный момент 115200, предполагается собирать данные на частоте около 500 Гц   -  person Frank    schedule 05.09.2012


Ответы (1)


Существует разница между соединениями сигнал-слот и системой событий. Излучение сигнала и запуск слота не являются отдельными вещами — когда сигнал испускается, подключенные слоты начинают работать. Так что они (сигналы) не могут быть потеряны.

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

Если вы сами публикуете события, вы можете использовать метод static void QCoreApplication::postEvent ( QObject* receiver, QEvent* event, int priority );. События сортируются в порядке убывания приоритета, т. е. события с высоким приоритетом ставятся в очередь перед событиями с более низким приоритетом. Приоритет может быть любым целым числом, т.е. между INT_MAX и INT_MIN включительно; см. Qt::EventPriority для более подробной информации. События с одинаковым приоритетом будут обрабатываться в порядке публикации.

person Pie_Jesu    schedule 05.09.2012
comment
Учтите, что платформа Qt преобразует сигналы в события. Это означает, что четные сигналы сохраняются в очереди событий и могут выполняться с небольшой задержкой. - person Maschina; 16.02.2014
comment
По умолчанию, если сигнал исходит из потока, отличного от принимающего объекта, сигнал ставится в очередь, ведет себя как Qt::QueuedConnection и как событие. В противном случае слот вызывается напрямую, действуя как Qt::DirectConnection. В очередь может быть поставлено только соединение, а не излучение сигнала. Так что тут ты немного не прав - person Pie_Jesu; 17.02.2014