#qt #qtcpsocket
#qt #qtcpsocket
Вопрос:
Я искал bytesToWrite
в документе и вот что я нашел «Для буферизованных устройств эта функция возвращает количество байтов, ожидающих записи. Для устройств без буфера эта функция возвращает 0.»
Сначала что означает буферизованные устройства. И может кто-нибудь, пожалуйста, объясните мне, что именно делает эта функция и где или как я могу ее использовать.
Ответ №1:
Многие устройства ввода-вывода находятся в буфере, что означает, что данные отправляются не сразу, а накапливаются для отправки в большом количестве, когда их достаточно.
По сути, это делается для повышения производительности, поскольку отправка данных обычно имеет некоторые фиксированные накладные расходы (по крайней мере, накладные расходы на системный вызов), которые хорошо амортизируются при массовой отправке данных, но должны быть оплачены за каждую запись, если буферизация не будет использоваться.
(обратите внимание, что здесь мы говорим только о QIODevice
буферах, обычно существуют также всевозможные буферы режима ядра и буферы, внутренние для самих аппаратных устройств)
bytesToWrite
сообщает вам, сколько материала находится в буфере QIODevice
записи, т. Е. Сколько байтов, которые вы записали, ожидают фактической записи (например, передано ОС для записи).
На самом деле мне никогда не приходилось использовать этот элемент, но я полагаю, что это может быть полезно, например, в сценарии производитель-потребитель (= если буфер записи меньше чего-то, тогда вам нужно фактически вычислить следующий фрагмент данных для отправки), вручную обрабатывать буферизацию в некоторых местах или даже простодля целей отладки / ведения журнала.
Ответ №2:
на самом деле это очень полезно, когда вы используете асинхронный API. вы можете, например, использовать ее внутри слота bytesWritten(), чтобы сообщить, пуст ли буфер, и данные были полностью записаны или нет.