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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QThread и бесконечный цикл в потоке  (Прочитано 12154 раз)
titan83
Гость
« Ответ #15 : Октябрь 08, 2013, 14:54 »

Извиняюсь - сам туплю нещадно, это ж позиция чтения из файла, просто не выставляется(
Записан
titan83
Гость
« Ответ #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 Offline

Сообщений: 2812


Просмотр профиля
« Ответ #17 : Октябрь 08, 2013, 16:36 »

Цитировать
флаг готовности чтения select() не сбрасывается.

Это может быть если не все данные прочитаны. Если есть возможность узнать сколько доступно байт - то надо сделать это.
Или читать не два байта а 1024 сразу, т.к. в любом случае вернется столько, сколько доступно.

Хотя я не в курсе как мониторить sysfs, возможно есть какие-то особенности и т.п. тут ничем помочь не могу.

Хотя, можешь в getKey() еще раз вызвать select() с нулевым таймаутом && FD_ISSET. Может поможет Улыбающийся.
Также можно в getKey() проверять номер дескриптора k ==  gpio_fd.
Записан

ArchLinux x86_64 / Win10 64 bit
titan83
Гость
« Ответ #18 : Октябрь 09, 2013, 07:42 »

Странная канитель.
Я, причем, сейчас все это делаю даже не на sysfs, хотя для select() разницы так-то нет - по дескрипторам же наблюдается.
Без Qt select() работает отлично.
Ладно, сегодня поразбираюсь, если что-то получится, то отпишусь.
Записан
titan83
Гость
« Ответ #19 : Октябрь 09, 2013, 12:59 »

Если кому интересно, то проблема с select() в том, что он реагирует на EOF, т.е. надо закрывать и снова открывать файл, а это не то, что нам надо.
Читал разные комменты в сети, но так и не увидел приемлемого решения.
to kuzulis. Хотел у тебя проконсультироваться по поводу разработки своего компонента (как к разработчику QtSerialPort), сделать аналог QsocketNotifier, но на основе poll(), пока буду читать исходники этих компонент, чтобы понять основные принципы построения.
Как для тебя ненапряжнее будет общение? Создать здесь ветку?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #20 : Октябрь 09, 2013, 13:57 »

Цитировать
Хотел у тебя проконсультироваться по поводу разработки своего компонента (как к разработчику QtSerialPort), сделать аналог QsocketNotifier, но на основе poll(), пока буду читать исходники этих компонент, чтобы понять основные принципы построения.

Это не просто, потому что тебе придется лезть в кишки Qt и патчить их.
Класс QsocketNotifier - это всего-лишь верхушка айсберга, всеми евентами заправляет EventDispatcher.
Т.е. там все прибито гвоздями к select() (если не ошибаюсь).

Т.е. тебе придется или лезть в кишки и что-то там менять, или создать свой класс PollNotifier (или как там его) с использованием отдельного потока.

По поводу отдельного потока можешь зделать что-то аналогичное QWinOverlappedNotifier но только для Linux. Это будет самое простое, ИМХО. Улыбающийся
 

Цитировать
Как для тебя ненапряжнее будет общение? Создать здесь ветку?

Эмм.. В принципе у меня нет времени и интереса к этой теме. Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
titan83
Гость
« Ответ #21 : Октябрь 10, 2013, 08:41 »


Это не просто, потому что тебе придется лезть в кишки Qt и патчить их.
Класс QsocketNotifier - это всего-лишь верхушка айсберга, всеми евентами заправляет EventDispatcher.
Т.е. там все прибито гвоздями к select() (если не ошибаюсь).

Т.е. тебе придется или лезть в кишки и что-то там менять, или создать свой класс PollNotifier (или как там его) с использованием отдельного потока.

По поводу отдельного потока можешь зделать что-то аналогичное QWinOverlappedNotifier но только для Linux. Это будет самое простое, ИМХО. Улыбающийся
Кишки глянул, EventDispatcher понял, что пока мне это не потянуть, да и не надо.
Буду делать по аналогии с http://qt-project.org/forums/viewthread/25465
Эмм.. В принципе у меня нет времени и интереса к этой теме. Улыбающийся
Да я не имел в виду, что хочу привлечь тебя бесплатным консультантом и парить по каждой мелочи))
Буду, когда совсем невмоготу, писать тут на форуме.
Еще раз спасибо за помощь!
Тема закрыта.
« Последнее редактирование: Октябрь 10, 2013, 08:45 от titan83 » Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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