Если я хочу записать данные на удаленную сторону и дождаться ее ответа, мне нужно по крайней мере waitForReadyRead
, Но прежде чем вызвать это, мне нужно вручную очистить очередь вывода, используя waitForBytesWritten
или Qt автоматически очищает очередь записи для меня? Я работаю синхронно (блокировка), и поэтому в этой функции я не могу использовать цикл обработки событий или локальный цикл обработки событий.
Когда используешь std::cin
, мы можем быть уверены, что ранее записанные байты std::cout
будет покраснел. Это аналогичная ситуация — это относится и к сокетам Qt?
Если вы посмотрите на исходный код, Будучи абстрактным базовым классом, QIODevice делает очень мало в waitForReadyRead, и это зависит от реализации унаследованных классов:
bool QIODevice::waitForReadyRead(int msecs)
{
Q_UNUSED(msecs);
return false;
}
это относится и к сокетам Qt?
Поскольку вы заявили, что работаете синхронно, я полагаю, что вы выбрали это по какой-то причине и знаете, что в главном потоке любой присутствующий графический интерфейс будет зависать во время вызова waitForReadyRead
, Обычно асинхронное использование для QIODevice является предпочтительным, при этом Qt является управляемой событиями средой.
Тем не менее Qt docs государство:
Некоторые подклассы QIODevice, такие как QTcpSocket и QProcess, являются асинхронными.
Поэтому, если ваш QIODevice является сокетом, таким как QTcpSocket, то нет, вам не нужно вызывать waitForBytesWritten
при звонке waitForReadyRead
,
В случае несинхронного устройства это будет необходимо.
Впоследствии я спросил Тьяго Макиейру (сопровождающего QtCore) об этой теме, и он ответил, что для QAbstractSocket и waitForBytesWritten, и waitForReadyRead будут записывать ожидающие байты, которые находятся в буфере qt, ожидая передачи в ОС.
Приложение, которое ожидает только записи байтов и только потом читает входящие байты, может потенциально заблокироваться, если удаленный сайт заблокирован из-за ожидания другой (локальной) стороны прочитать данные. Поскольку удаленная сторона блокирует, она не может читать данные, отправленные локальной стороной. Поэтому, если локальная сторона пишет слишком много для того, чтобы она тоже блокировалась, каждый будет ждать, пока другой прочитает их данные, и заблокируется.
Поэтому обе функции ожидания bytesWritten и readyRead обрабатывают как буфер чтения qt, так и буфер записи qt. WaitForBytesWritten может даже излучать сигнал readyRead, чего я не ожидал. Поэтому вызов waitForBytesWritten по сути был избыточным и может быть удален.