我有一個圖像採集線程,它是在使用Visual Studio 2015編譯的64位Qt 5.6.0應用程序中每次抓取時更新GUI。除非用戶不調整或移動GUI窗口,應用程序工作正常。但如果窗口被移動或調整大小,它會隨機崩潰。代碼總結如下。第二個線程的快速更新GUI窗口通過調整窗口大小或移動窗口而崩潰
根據調試信息,碰撞發生是因爲QImage::convertToFormat_helper
中的訪問衝突任何人都知道爲什麼會發生這種情況以及如何修復?
初始化: `
auto thread = new KinectThread();
connect(thread,SIGNAL(OnRgbImage(QImage)),this,SLOT(rgbImageReady(QImage)));
thread->start();
`
工作線程: `
void KinectThread::run()
{
kinect = new Kinect();
while(true)
{
auto img = kinect->getRgb();
QImage imgIn= QImage((uchar*) img.data, img.cols, img.rows, img.step, QImage::Format_RGB888);
emit OnRgbImage(imgIn);
QThread::msleep(20);
}
delete kinect;
}
`
GUI更新:
void MainWindow::rgbImageReady(QImage image)
{
if (!image.isNull())
{
QGraphicsView* view = ui->graphicsView;
auto width = image.width();
auto height = image.height();
m_pScene->setSceneRect(0, 0, width, height);
auto pixmap = QPixmap::fromImage(image);
m_pixmapItem->setPixmap(pixmap);
view->show();
}
}
什麼行給你錯誤? –
不確定,但可能發生這種情況的原因是,圖像顯示速度遠遠低於獲取圖像和很多圖像對象的隊列?嘗試用一些計數器或其他方法來檢查。或'kinect-> getRgb();'是慢操作?無論如何,將QImage對象發送到信號上並不是一個好主意,最好是使用一些通用的指針和線程同步。 – johngull