Мои знания о потоке в Qt довольно ограничены, и теперь у меня есть проблема, которая, похоже, связана с потоковой обработкой. Я использую QextSerialPort для связи через uart. Мой класс для последовательной связи выглядит следующим образом (раздели до минимума):Ожидание нескольких секунд в Qt
SerialIO::SerialIO() {
port = new QextSerialPort("/dev/ttymxc1");
connect(port, SIGNAL(readyRead()), this, SLOT(onDataAvailable()));
port->setQueryMode(QextSerialPort::EventDriven);
port->open(QIODevice::ReadWrite | QIODevice::Unbuffered);
port->setBaudRate(BAUD115200);
port->setFlowControl(FLOW_OFF);
port->setParity(PAR_NONE);
port->setDataBits(DATA_8);
port->setStopBits(STOP_1);
}
void SerialIO::initialize() {
// do something
// wait for 15 s
// do something else
}
void SerialIO::onDataAvailable() {
// do something useful
}
Проблема ждет 15 секунд в методе initialize()
без блокировки последовательного ввода. Я попытался
QThread::sleep(15)
и даже
QTime time;
time.start();
while(time.elapsed() < 15000); // evil busy wait
Но обе попытки, я перестал получать последовательные данные (onDataAvailable
был больше не вызывается в течение этих 15 секунд). Каков правильный способ сделать это?
но это может сделать странные вещи, когда вещи удаляются –
То есть, когда что-то еще удаляет SocketIO из цикла событий? –
Да, когда кто-то делает 'deleteLater' на этом объекте, то после того, как цикл' this' будет недействительным -> неопределенное поведение, выполните 'while (time.elapsed() <15000) QCoreApplication :: processEvents (QEventLoop :: AllEvents, 15000-time.elapsed()); 'будет безопаснее –