Я пытаюсь понять модуль последовательного порта Qt, и я не слишком знаком с тем, как Qt обрабатывает асинхронный ввод-вывод. В Windows метод QSerialPort::writeData
помещает данные для записи в кольцевой буфер и затем запускает однократный QTimer
, чтобы фактически выполнить запись при срабатывании сигнала timeout
:
qint64 QSerialPortPrivate::writeData(const char *data, qint64 maxSize)
{
Q_Q(QSerialPort);
writeBuffer.append(data, maxSize);
if (!writeBuffer.isEmpty() && !writeStarted) {
if (!startAsyncWriteTimer) {
startAsyncWriteTimer = new QTimer(q);
QObjectPrivate::connect(startAsyncWriteTimer, &QTimer::timeout, this, &QSerialPortPrivate::_q_startAsyncWrite);
startAsyncWriteTimer->setSingleShot(true);
}
if (!startAsyncWriteTimer->isActive())
startAsyncWriteTimer->start();
}
return maxSize;
}
В методе readData
таймер не используется таким образом, вместо этого вызывается ReadFileEx
напрямую.
Что делает таймер однократного действия по сравнению с простым вызовом WriteFileEx
?