Пишу прогу для некой Embedded железяки.
Железяка на АРМ под Линухом. Управление все делается по Serial.
Вывод графики под QT вносит существенные задержки
и поэтому в основном MessageLoop невозможно реализовать
некий наш протокол. Софтина работает великолепно под QT Win32
Однако под Линухом выплывают траблы...
Пытаюсь написать обработку входящих
пакетов в асинхронном режиме:
saio.sa_handler = signal_handler_IO;
sigaction(SIGIO,&saio,NULL);
fcntl(m_fd, F_SETOWN, getpid());
fcntl(m_fd, F_SETFL, FASYNC);
signal_handler_IO - позволяет вроде реагировать мгновенно на входящие байтики, однако необходимо использовать mutex-ы
для блокировки ввода вывода. Реализовал блокировки на
pthread_mutex_t (пробовал и QMutex)
Все блоки которые используются
pthread_mutex_lock - pthread_mutex_unlock
сделаны на коротких участках кода
причем в одном scope
(на самом деле я использую конструктор - деструктор нотацию
а-ля CSingleLock )
тем не менее софтина попадает все время в залоченное состояние
(deadlocks).
Облазил сорцы в инете, никто ничего загадочного не делает в этом месте
Вопрос к Linux-QT девелоперам:
1. Объясните PLS какие ограничения при работе с SIGIO
сигналом? Какие подводные камни?
Могу я считать сигнал просто другой ниткой?
Или это та же нитка что и основная?
2. SIGIO может случаться рекурсивно?
(в принципе я это могу проверить
но хотелось бы сначала теорию).
3. Какие могут возникнуть проблемы с QT очередью?
или с графикой (у меня Frame Buffer) при работе с pthread_mutex_t
У кого есть опыт написания подобных вещей?
Поделитесь PLS!