Блокирующий сокет - waitForReadyRead()

В настоящее время в моем коде QT у меня есть что-то вроде этого:

QByteArray tick_stream;
clntSocket->waitForReadyRead();
tick_stream = clntSocket->read(800);

В документации указано

Эта функция блокируется до тех пор, пока новые данные не будут доступны для чтения и не будет выдан сигнал readyRead(). Время ожидания функции истечет через мс миллисекунд; тайм-аут по умолчанию составляет 30000 миллисекунд

Есть ли способ заставить waitForReadyRead ждать до бесконечности в моем блокирующем приложении?


person Rajeshwar    schedule 12.08.2013    source источник
comment
Давая действительно очень большой тайм-аут?   -  person Some programmer dude    schedule 12.08.2013


Ответы (1)


Вы можете использовать -1 в качестве параметра ожидания на неопределенный срок.

clntSocket->waitForReadyRead(-1);

Это есть в документации для QIODevice, но не для производных классов сокетов.

Однако на самом деле вы должны использовать цикл событий Qt и прикреплять слот к сигналу readyRead, а не блокировать поток.

person dunc123    schedule 12.08.2013
comment
Если это выделенный поток, блокировка должна быть в порядке - проблема может возникнуть только при попытке правильно выйти из потока, пока он заблокирован. - person Frank Osterfeld; 12.08.2013
comment
Очевидно, нет ничего технически неправильного в блокировании потока, но использование сигнала было бы более совместимо с шаблоном проектирования Qt. Другое дело, согласны ли вы с шаблоном проектирования Qt? :) - person dunc123; 14.08.2013
comment
Просто потому, что вы можете использовать сигнал, это не значит, что вы должны это делать :) Так же, как только потому, что есть QObject, вам не нужно делать все QObject (на самом деле вы не должны). - person Frank Osterfeld; 14.08.2013
comment
@FrankOsterfeld, кажется, что функция waitForReadyRead() имеет некоторые проблемы с ОС Windows согласно официальной документации Qt. Хотя я тестировал на Linux, я заметил некоторые нарушения. Мой код фактически был реализован в обычных сокетах C, и я перенес его на Qt. Следовательно, в данном конкретном случае лучше использовать SIGNAL/SLOT. - person iammilind; 12.06.2017