我在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
}
问题正在等待在initialize()
方法15秒而不阻挡串行输入。我试图
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());'会更安全 –