Russian Qt Forum
Июля 06, 2025, 02:30
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
QThread и бесконечный цикл в потоке
Страниц:
1
[
2
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QThread и бесконечный цикл в потоке (Прочитано 13071 раз)
titan83
Гость
Re: QThread и бесконечный цикл в потоке
«
Ответ #15 :
Октября 08, 2013, 14:54 »
Извиняюсь - сам туплю нещадно, это ж позиция чтения из файла, просто не выставляется(
Записан
titan83
Гость
Re: QThread и бесконечный цикл в потоке
«
Ответ #16 :
Октября 08, 2013, 15:07 »
Но с нотифером это ситуация, к сожалению, не прояснило. Поэтому выкладываю код:
gpio_fd = open("/test", O_RDONLY | O_NONBLOCK );
inputNotifier = new QSocketNotifier(gpio_fd, QSocketNotifier::Read);
inputNotifier->setEnabled(true);
QObject::connect(inputNotifier, SIGNAL(activated(int)), &myObject, SLOT(getKey(int)));
void getKey(int k)
{
int ret;
int buf = 10;
QByteArray data;
lseek(gpio_fd, 0, SEEK_SET);
ret = read(gpio_fd, &buf, 2);
if (ret < 0)
{
perror("read value");
}
{
qDebug() << "value" << QString::number(buf);
data = kDevice.read(1);
qDebug() << "spidev" << QString::number(data[0], 16);
}
}
После прописывания функции позиционирования значение читается правильное, флаг готовности чтения select() не сбрасывается.
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: QThread и бесконечный цикл в потоке
«
Ответ #17 :
Октября 08, 2013, 16:36 »
Цитировать
флаг готовности чтения select() не сбрасывается.
Это может быть если не все данные прочитаны. Если есть возможность узнать сколько доступно байт - то надо сделать это.
Или читать не два байта а 1024 сразу, т.к. в любом случае вернется столько, сколько доступно.
Хотя я не в курсе как мониторить sysfs, возможно есть какие-то особенности и т.п. тут ничем помочь не могу.
Хотя, можешь в getKey() еще раз вызвать select() с нулевым таймаутом && FD_ISSET. Может поможет
.
Также можно в getKey() проверять номер дескриптора k == gpio_fd.
Записан
ArchLinux x86_64 / Win10 64 bit
titan83
Гость
Re: QThread и бесконечный цикл в потоке
«
Ответ #18 :
Октября 09, 2013, 07:42 »
Странная канитель.
Я, причем, сейчас все это делаю даже не на sysfs, хотя для select() разницы так-то нет - по дескрипторам же наблюдается.
Без Qt select() работает отлично.
Ладно, сегодня поразбираюсь, если что-то получится, то отпишусь.
Записан
titan83
Гость
Re: QThread и бесконечный цикл в потоке
«
Ответ #19 :
Октября 09, 2013, 12:59 »
Если кому интересно, то проблема с select() в том, что он реагирует на EOF, т.е. надо закрывать и снова открывать файл, а это не то, что нам надо.
Читал разные комменты в сети, но так и не увидел приемлемого решения.
to kuzulis. Хотел у тебя проконсультироваться по поводу разработки своего компонента (как к разработчику QtSerialPort), сделать аналог QsocketNotifier, но на основе poll(), пока буду читать исходники этих компонент, чтобы понять основные принципы построения.
Как для тебя ненапряжнее будет общение? Создать здесь ветку?
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: QThread и бесконечный цикл в потоке
«
Ответ #20 :
Октября 09, 2013, 13:57 »
Цитировать
Хотел у тебя проконсультироваться по поводу разработки своего компонента (как к разработчику QtSerialPort), сделать аналог QsocketNotifier, но на основе poll(), пока буду читать исходники этих компонент, чтобы понять основные принципы построения.
Это не просто, потому что тебе придется лезть в кишки Qt и патчить их.
Класс QsocketNotifier - это всего-лишь верхушка айсберга, всеми евентами заправляет EventDispatcher.
Т.е. там все прибито гвоздями к select() (если не ошибаюсь).
Т.е. тебе придется или лезть в кишки и что-то там менять, или создать свой класс PollNotifier (или как там его) с использованием отдельного потока.
По поводу отдельного потока можешь зделать что-то аналогичное
QWinOverlappedNotifier
но только для Linux. Это будет самое простое, ИМХО.
Цитировать
Как для тебя ненапряжнее будет общение? Создать здесь ветку?
Эмм.. В принципе у меня нет времени и интереса к этой теме.
Записан
ArchLinux x86_64 / Win10 64 bit
titan83
Гость
Re: QThread и бесконечный цикл в потоке [решено]
«
Ответ #21 :
Октября 10, 2013, 08:41 »
Цитата: kuzulis от Октября 09, 2013, 13:57
Это не просто, потому что тебе придется лезть в кишки Qt и патчить их.
Класс QsocketNotifier - это всего-лишь верхушка айсберга, всеми евентами заправляет EventDispatcher.
Т.е. там все прибито гвоздями к select() (если не ошибаюсь).
Т.е. тебе придется или лезть в кишки и что-то там менять, или создать свой класс PollNotifier (или как там его) с использованием отдельного потока.
По поводу отдельного потока можешь зделать что-то аналогичное
QWinOverlappedNotifier
но только для Linux. Это будет самое простое, ИМХО.
Кишки глянул, EventDispatcher понял, что пока мне это не потянуть, да и не надо.
Буду делать по аналогии с
http://qt-project.org/forums/viewthread/25465
Цитата: kuzulis от Октября 09, 2013, 13:57
Эмм.. В принципе у меня нет времени и интереса к этой теме.
Да я не имел в виду, что хочу привлечь тебя бесплатным консультантом и парить по каждой мелочи))
Буду, когда совсем невмоготу, писать тут на форуме.
Еще раз спасибо за помощь!
Тема закрыта.
«
Последнее редактирование: Октября 10, 2013, 08:45 от titan83
»
Записан
Страниц:
1
[
2
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...