我在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());'會更安全 –