gpt4 book ai didi

c++ - 通过调整窗口大小或移动窗口,使用第二个线程快速更新 GUI 窗口会崩溃

转载 作者:行者123 更新时间:2023-11-30 02:27:48 25 4
gpt4 key购买 nike

我有一个图像采集线程,它在使用 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();
}
}

最佳答案

采用 uchar *data 作为图像数据的 QImage 构造函数不会创建数据的拷贝,这意味着它们需要 uchar * 缓冲区至少与 QImage 实例一样长。

此外,QImageimplicitly shared ,这意味着复制 QImage 也不会复制图像数据,但仍会访问原始缓冲区。

复制图像并通过信号快速传递图像的方式很好。但这也意味着来自 kinect->getRgb() 调用的图像数据必须存在,直到信号事件通过事件队列传递到 MainWindow::rgbImageReady 并且直到这完成使用数据。这也意味着如果 Kinect 类更改了已传递给 rgbImageReady 的现有缓冲区,而您使用 QPixmap::fromImage( image),你会弄得一团糟。如果 Kinect 类在 rgbImageReady 完成前一个缓冲区。

关于c++ - 通过调整窗口大小或移动窗口,使用第二个线程快速更新 GUI 窗口会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41338430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com