Название: Как организовать скорейшую реакцию основной нити ? Отправлено: footballer от Май 22, 2007, 06:42 Под Linux-ом необходимо реализовать реакцию при приеме данных
c COM порта. Что данные приняты сообщает SIGIO handler, Другими словами находимся в функции обработки прерывания. Необходимо сформировать событие и передать обработчику очереди сообщений. Другими словами необходимо в основной нити найскорейшим образом среагировать на прием данных. Я вижу два пути: 1. postEvent 2. Некая Idle функция в основной нити (message loop должен вызывать некую мою функцию) Но первый способ должен быть SIGNAL-Safe Является он таковым ? Второй способ гипотетический. Или я ошибаюсь ? Название: Как организовать скорейшую реакцию основной нити ? Отправлено: goer от Май 22, 2007, 09:41 Поискал в асистенте - не нашел что такое SIGNAL-Safe. Если автору нетрудно, не мог бы он разъяснить в чем заключается безопасность относительно сигналов?
Название: Как организовать скорейшую реакцию основной нити ? Отправлено: Alex03 от Май 22, 2007, 10:35 По второму способу - можно таймер с нулевым таймаутом - но прога будет жрать проц-время.
Есть третий вариант - QSocketNotifier в который передаётся файловый дескриптор COM порта. Название: Как организовать скорейшую реакцию основной нити ? Отправлено: footballer от Май 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 !!! |