我在Qt中对线程的了解相当有限,现在我遇到了一个似乎与线程有关的问题。我使用QextSerialPort通过uart进行通信。我的串行通信类看起来是这样的(精简到最低限度):
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
但在这两次尝试中,我都停止了获取串行数据(在这15秒内不再调用onDataAvailable
)。正确的方法是什么?
这种方法怎么样:
void SerialIO::initialize()
{
// do something
// wait for 15 s
QTimer::singleShot(15000, this, SLOT(onTimer()));
}
void SerialIO::onDataAvailable()
{
// do something useful
}
void SerialIO::onTimer()
{
// do something else
}
它不会阻止事件,您将调用onDataAvailable()
插槽。
另一种在不创建额外函数的情况下等待的方法:
void SerialIO::initialize() {
// Code here
QEventLoop loop;
QTimer::singleShot(15000, &loop, SLOT(quit()));
loop.exec();
// Code here, executed after 15s
}
注意:如果有东西删除了带有deleteLater
的serialIO
(在处理等待期间接收到的一些事件/信号时,可能来自串行输入),则在循环退出后,您将拥有一个已删除且无效的this
。如果这在你的应用程序中是真实的情况,最好使用一个单独的插槽在计时器之后执行,就像@vahancho的答案一样。