Если я хочу записать данные на удаленную сторону и дождаться ответа, мне нужно как минимум waitForReadyRead
. Но прежде чем позвонить, мне нужно вручную очистить очередь вывода, используя waitForBytesWritten
, или Qt автоматически очищает очередь записи для меня? Я работаю синхронно (блокирование), и поэтому в этой функции я не могу использовать цикл событий или локальный цикл событий.QIODevice :: waitForReadyRead неявно очищает очередь вывода (waitForBytesWritten)?
При использовании std::cin
мы можем быть уверены, что ранее записанные байты на std::cout
были сброшены. Это аналогичная ситуация - применима ли она к сокетам Qt?
Хмм, я не понимаю вывода «Поэтому, если ваш QIODevice является сокетом, таким как QTcpSocket, то нет, вам не нужно будет вызывать waitForBytesWritten при вызове waitForReadyRead». Что предотвращает Qt от простого опроса или 'select'-ing дескриптора файла сокета для новых байтов и заполнения его очереди чтения? Почему асинхронность подразумевает, что мне нужно сбросить байты? –
У меня создалось впечатление, что «асинхронный» в этом контексте означает, что вызов записи и чтения не имеет прямого доступа к устройству, а чтение и запись в буферы, которые только записываются или считываются при возврате цикла событий или при вызове одна из функций ожидания? –
Возможно, я неправильно понял ваш вопрос и, пожалуйста, поправьте меня, если это так. Как бы то ни было, по асинхронному я понимаю, что он подразумевает, что он обрабатывается в отдельном потоке, поэтому вызов waitForReadyRead, который является блокирующим вызовом, часто в основном потоке, не будет блокировать процесс записи для устройства, такого как QTcpSocket. – TheDarkKnight