2

我对 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
}

问题是在方法中等待 15 秒initialize()而不阻塞串行输入。我试过了

QThread::sleep(15)

乃至

QTime time;
time.start();
while(time.elapsed() < 15000); // evil busy wait

但是通过这两次尝试,我停止获取串行数据(onDataAvailable在这 15 秒内不再调用)。这样做的正确方法是什么?

4

2 回答 2

4

这种方法怎么样:

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()调用插槽。

于 2013-12-11T15:52:04.800 回答
1

另一种无需创建额外函数即可等待的方法:

void SerialIO::initialize() {
  // Code here
  QEventLoop loop;
  QTimer::singleShot(15000, &loop, SLOT(quit()));
  loop.exec();
  // Code here, executed after 15s
}

注意:如果某些东西删除了serialIOwith deleteLater(在处理等待期间收到的某些事件/信号时,可能来自您的串行输入),您将this在循环退出后删除和无效。如果这可能是您的应用程序的真实情况,最好使用一个单独的插槽在计时器之后执行,如@vahancho 的回答。

于 2013-12-11T15:56:06.480 回答