TL;博士:我有一個QThread的當新數據可用於處理將信號發送到主線程。主線程然後獲取,處理和顯示數據。主線程可以更頻繁地處理數據,導致凍結的GUI並最終導致堆棧溢出(yay!)。如何從另一個線程處理信號洪水的Qt
詳細
我的應用程序獲取幀從照相機,用於處理和顯示。相機通過Windows事件通知新幀何時可用。我有一個螺紋,其週期性地檢查這些事件,並通知主線程當新的幀可用於收藏:
void Worker::run()
{
running_ = true;
while (running_)
{
if (WaitForSingleObject(nextColorFrameEvent, 0) == WAIT_OBJECT_0)
emit signalColorFrame();
usleep(15);
}
}
signalColorFrame
被連接到在Camera
類從相機獲取幀中的時隙,進行一些處理,並將其發送到MainWindow
,將其繪製到屏幕上。
void Camera::onNewColorFrame()
{
getFrameFromCamera();
processFrame();
drawFrame();
}
現在,如果該方法在下一幀可用之前完成,則一切正常。由於類處理變得更加複雜,儘管Camera
類在接收到新信號之前處理了前一幀。
我的解決辦法是阻止工作線程處理的時間信號,強制甚至循環與QCoreApplication::processEvents()
之間運行:
void Camera::onNewColorFrame()
{
worker_->blockSignals(true)
getFrameFromCamera();
processFrame();
drawFrame();
QCoreApplication::processEvents(); // this is essential for the GUI to remain responsive
worker_->blockSignals(false);
}
不會看起來像做這件事的好方法嗎?有人可以提出更好的解決方案嗎
好吧,我刪除了這個解決方案是不可靠的零件,因爲這是由於我的失誤。它非常符合預期。 – jaho 2013-04-20 15:34:03