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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как организовать скорейшую реакцию основной нити ?  (Прочитано 3109 раз)
footballer
Гость
« : Май 22, 2007, 06:42 »

Под Linux-ом необходимо реализовать реакцию при приеме данных
c  COM порта.
Что данные приняты сообщает SIGIO handler,
Другими словами находимся в функции обработки прерывания.

Необходимо сформировать событие и передать обработчику очереди сообщений.

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

Я вижу два пути:

1. postEvent
2. Некая Idle функция в основной нити
(message loop должен вызывать некую мою функцию)

Но первый способ должен быть SIGNAL-Safe
Является он таковым ?

Второй способ гипотетический. Или я ошибаюсь ?
Записан
goer
Гость
« Ответ #1 : Май 22, 2007, 09:41 »

Поискал в асистенте - не нашел что такое SIGNAL-Safe. Если автору нетрудно, не мог бы он разъяснить в чем заключается безопасность относительно сигналов?
Записан
Alex03
Гость
« Ответ #2 : Май 22, 2007, 10:35 »

По второму способу - можно таймер с нулевым таймаутом - но прога будет жрать проц-время.
Есть третий вариант - QSocketNotifier в который передаётся файловый дескриптор COM порта.
Записан
footballer
Гость
« Ответ #3 : Май 23, 2007, 06:11 »

Цитата: "goer"
Поискал в асистенте - не нашел что такое SIGNAL-Safe. Если автору нетрудно, не мог бы он разъяснить в чем заключается безопасность относительно сигналов?


  Сигнал это функция которая вызывается в контексте
прерывания, а не основной нити. Но это и не другая нить.  Многие Unix системные вызовы так и пишут в man  "signal safe".

Я пробовал postEvent делать в основную очередь, ничего хорошего не получилось (трапалось, хотя и не факт что не из-за моих ошибок).
Поэтому интересен чужой опыт.

другими словами postEvent должен быть умный и весь из себя системный...

добавлено спустя 8 минут

 
Цитата: "Alex03"
По второму способу - можно таймер с нулевым таймаутом - но прога будет жрать проц-время.
Есть третий вариант - QSocketNotifier в который передаётся файловый дескриптор COM порта.



Таймер с нулевым таймаутом?
А это работает ?
В принципе это наверное то что надо.
Только система должна при этом очередь выгребать
на каждый тик. Я то жрать время не буду.
Мне всего лишь проверить флажок который в сигнале выставится.

QSocketNotifier наверное не получится - я работаю напрямую с COM портом через системные вызовы. Опять же боюсь что в моей embedded qt2.3 я сокеты выключил.

добавлено спустя 16 часов 29 минут:

 
Цитата: "Alex03"
По второму способу - можно таймер с нулевым таймаутом - но прога будет жрать проц-время.
Есть третий вариант - QSocketNotifier в который передаётся файловый дескриптор COM порта.



QSocketNotifier - посмотрел по сорцам это действительно то что надо.
в  QApplication  Message Loop стоит select который дергает qt signal.


Thanks to Alex03 !!!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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