2013-12-11 116 views
2

我在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秒内不再称呼)。什么是正确的方法来做到这一点?

回答

1

等待,而无需创建一个额外的功能,另一种方法:

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

NOTE:如果删除serialIOdeleteLater(在等待的过程中处理某些事件时/接收信号,也许从你的串行输入),你会在循环退出后有一个已删除且无效的this。如果这可能是您的应用程序的真实情况,最好使用分隔的插槽在计时器之后执行,如@ vahancho的回答。

+0

但是这可能会在事情被删除时做一些奇怪的事情 –

+0

你的意思是,当其他事情从事件循环中删除了SocketIO? –

+1

是的,当有人在这个对象上做一个'deleteLater'时,那么循环后'this'将会失效 - >未定义行为,做一个while(time.elapsed()<15000)QCoreApplication :: processEvents(QEventLoop :: AllEvents, 15000-time.elapsed());'会更安全 –

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

相关问题