首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除QCamera崩溃程序

删除QCamera崩溃程序
EN

Stack Overflow用户
提问于 2014-02-27 00:07:54
回答 1查看 984关注 0票数 2

我使用QT和QCamera对象在对话框中显示来自摄像机的视频提要。我的代码如下;

cameratestdialog.ui

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>CameraTestDialog</class>
 <widget class="QDialog" name="CameraTestDialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <widget class="QCameraViewfinder" name="viewfinder" native="true">
   <property name="geometry">
    <rect>
     <x>40</x>
     <y>40</y>
     <width>281</width>
     <height>201</height>
    </rect>
   </property>
  </widget>
 </widget>
 <customwidgets>
  <customwidget>
   <class>QCameraViewfinder</class>
   <extends>QWidget</extends>
   <header>qcameraviewfinder.h</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

cameratestdialog.h

代码语言:javascript
复制
#ifndef CAMERATESTDIALOG_H
#define CAMERATESTDIALOG_H

#include <QDialog>
#include <QCamera>

namespace Ui {
class CameraTestDialog;
}

class CameraTestDialog : public QDialog
{
    Q_OBJECT

public:
    explicit CameraTestDialog(QWidget *parent = 0);
    ~CameraTestDialog();

private:
    Ui::CameraTestDialog *ui;

    QCamera *camera;
};



#endif // CAMERATESTDIALOG_H

cameratestdialog.cpp

代码语言:javascript
复制
#include "cameratestdialog.h"
#include "ui_cameratestdialog.h"

#include <QCameraViewfinder>
#include <QDebug>

CameraTestDialog::CameraTestDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::CameraTestDialog),
    camera(0)
{
    ui->setupUi(this);
    this->setAttribute(Qt::WA_DeleteOnClose);

    delete camera;

    camera = new QCamera;
    camera->setViewfinder(ui->viewfinder);
    camera->start();
}

CameraTestDialog::~CameraTestDialog()
{
    qDebug() << "Stopping Camera";
    camera->stop();
    camera->unload();
    //delete camera;
    delete ui;
}

cameratestdialog.cpp中的析构函数中,您可以看到我已经注释掉了删除相机的行。当我像这样运行这个程序时,它工作得很好(我尝试过发布和调试模式),我可以在没有崩溃的情况下多次显示和关闭对话框。当我取消注释这一行时,当调用析构函数时,程序意外崩溃。

我正在启动对话

代码语言:javascript
复制
CameraTestDialog *dlg = new CameraTestDialog();
dlg->show();

我很高兴离开delete camera行的注释,所以我的程序运行,但这不意味着我泄漏内存每次对话框关闭?停止和删除QCamera对象的正确方法是什么?

我正在使用QT 2.8.1运行在2012年的Mac下的小牛下。

编辑:

我没有安装调试器,因此在这一点上我没有更多关于崩溃本质的可用信息。

我怀疑camera->stop()camera->unload()调用是异步的,因此相机在实际停止之前就被删除了。为了测试这一点,我添加了while循环来检查摄像机的状态,并阻塞,直到摄像机被确认停止,并卸载。我发现这些函数实际上是同步的,并且仍然有相同的症状(在调用delete之后的一段时间内崩溃)。

编辑2:

我尝试将对照相机的引用更改为基于堆栈的引用,而不是new-based,并删除了删除行。这样做后,程序在构造函数期间崩溃,然后显示对话框。

编辑3:

我刚刚确认这个程序不会在Windows 7上崩溃,所以我假设这是OSX计算机上QCamera的QT实现中的一个低级错误。我将尝试使用QT项目来引发一个bug。

EN

回答 1

Stack Overflow用户

发布于 2015-10-09 07:12:44

问题是QCamera似乎运行在线程中。删除它“太早”会在Windows上导致QMutuex错误。因此,解决方案是camera->stop();而不是camera->unload();

最后,也是最重要的一点:使用delete camera代替

代码语言:javascript
复制
camera->deleteLater();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22056348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档