2013-12-11 144 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()插槽調用。

相關問題