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

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Скорость работы модели слот-сигнал  (Прочитано 3778 раз)
titan83
Гость
« : Август 28, 2014, 08:41 »

Здравствуйте.
На ARM9 400Mhz запускаю программу для опроса шины CAN, для чего использую подсистему ядра SocketCAN, она создает сетевой интерфейс, с которым можно работать как с простым сокетом.
Ну я, как простой посан с Урала, делаю простой класс для отлова входящих сообщений на шине, применяя для этих целей в первом заходе QSocketNotifier - и все вроде бы работает, сообщения отлавливаются, но! я отключаю физически кабель шины, а сообщения все поступают и поступают... Видимо имеет место быть буферизация, т.к. через некоторое время поток кадров прекращается.
Грусть-печаль... Ставлю пакет can-utils, в его составе есть candump, запускаю и вижу, что входящий поток довольно быстрый (около 10 кадров в секунду), отключаю провод и прием сразу останавливается, т.е. входящий поток обрабатывается с той скоростью, с которой он поступает.
В qt же я получаю от силы три кадра в секунду - остальное в буфер. Естественно, это крайне неприятно, ибо на сообщения устройства надо реагировать немедленно, а не через минуту.
Попробовал я отказаться от QSocketNotifier - сделал свой poll() - все так же(
Посмотрел код того же candump - там все делается аналогично - открытие порта и потом select(), но там нет оберток qt, неужели все настолько медленно?
« Последнее редактирование: Август 28, 2014, 11:52 от titan83 » Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Август 28, 2014, 08:47 »

неужели все настолько медленно?
DirectConnect сводится к обычному прямому вызову метода.

Попробовал я отказаться от QSocketNotifier - сделал свой poll() - все так же(
Т.е. вы сделали свой цикл с select как в candump, а он работает медленней чем в candump? Как то не верится, что проблема в сигналах?
Записан
titan83
Гость
« Ответ #2 : Август 28, 2014, 10:00 »

Т.е. вы сделали свой цикл с select как в candump, а он работает медленней чем в candump? Как то не верится, что проблема в сигналах?
Я лишь хочу разобраться в чем именно проблема, ибо в таком виде меня это абсолютно не устраивает.
Я, кстати, делал poll(), а в candump - select(), попробую с ним.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Август 28, 2014, 10:09 »

Я лишь хочу разобраться в чем именно проблема...
А я хочу вам в этом помочь. Улыбающийся
Попробуйте сделать обработку событий как в candump и не посылайте сигнал, а просто печатайте в консоль. Посмотрите на скорость. Потом, добавьте сигналы и проверьте с ними.
Просто, я сильно сомневаюсь, что дело в сигналах. Или вы используете сигналы между потоками?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Август 28, 2014, 10:32 »

И не мешало бы проверить как сильно кушается CPU.
Записан

Qt 5.11/4.8.7 (X11/Win)
titan83
Гость
« Ответ #5 : Август 28, 2014, 11:40 »

А я хочу вам в этом помочь. Улыбающийся
Спасибо за участие.
Как обычно - напишешь - поможешь себе сам)

Может кому пригодится - помимо опроса CAN у меня в программе работало еще несколько модулей, и все они базировались на общем классе, выполняющем поллинг файлов на sysfs. И ключевой функцией этого класса была QTimer::singleShot, которая вызывала слот опроса.
Проблема была в том, что у меня в качестве времени отсрочки выполнения слота стояло 0, и еще и таймаут в функции poll() стоял 100 мс, в итоге, как я понимаю, я своими singleShot (от трех-четырех объектов), забивал event loop и остальным слотам оставалось намного меньше процессорного времени.
В качестве решения я поменял отсрочку запуска слота с 0 на 50 мс и уменьшил таймаут poll() со 100 до 50 мс, теперь у меня все живут дружно.

Всем еще раз спасибо.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #6 : Август 29, 2014, 08:29 »

Как обычно - напишешь - поможешь себе сам)
Не в плане наезда, но: правильно сформулированный вопрос - и есть половина ответа. Так, что тут, действительно всё закономерно. Как и то, что в первую очередь подумали, что виноват "медленный сигнал-слот" Улыбающийся.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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