【发布时间】:2015-03-31 17:14:13
【问题描述】:
我正在编写一个简单的 Qt 程序来从摄像头捕获视频源(使用 OpenCV)。我正在使用一个循环的QThread 对象,捕获图像并将它们提供给MainWindow 对象。这正在正常工作。
问题是当我关闭时,应用程序(即按下“X”)相机捕获线程停止并且gui消失。但程序仍在后台运行。我还在应用程序输出中收到警告:
QThread:在线程仍在运行时销毁。
如何在退出时完全停止应用程序?
main.cpp
#include <QApplication>
#include "application.h"
using namespace cv;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Application app;
app.init();
return a.exec();
}
application.h
#include "mainwindow.h"
#include "camerathread.h"
#include "mathandler.h"
#include "tools.h"
#include "opencv2/core/core.hpp"
#ifndef APPLICATION
#define APPLICATION
class Application : public MatHandler{
MainWindow w;
CameraThread ct;
public:
Application() {
w.setFixedSize(800,600);
}
void init() {
ct.setMatHandler(this);
ct.start();
w.show();
}
void handleMat(cv::Mat mat) {
QImage qImage = toQImage(mat);
w.setImage(qImage);
}
};
#endif // APPLICATION
相机线程
#include <QThread>
#include "mathandler.h"
#include "opencv2/highgui/highgui.hpp"
#ifndef CAMERATHREAD
#define CAMERATHREAD
class CameraThread : public QThread {
MatHandler *matHandler;
public:
~CameraThread() {
}
void setMatHandler(MatHandler *h) {
matHandler = h;
}
private: void run() {
cv::VideoCapture vc(0);
if (vc.isOpened()) {
for(;;) {
cv::Mat img;
vc >> img;
matHandler->handleMat(img);
}
}
}
};
#endif // CAMERATHREAD
该程序包含比这更多的代码,但我只包含了我认为与问题相关的代码。如有需要,我会发布其余的。
【问题讨论】:
-
检查除了UI和相机线程之外是否还有其他线程在运行。您正在使用的 API 可能会产生其他线程。
-
我不知道如何检查这个...你能解释一下吗?
-
检查正在运行的线程取决于您使用的 IDE(如果值得一试)。例如,此搜索:google.com/… 产生了以下结果:help.eclipse.org/indigo/… 但同样,这取决于您的 IDE。我刚刚演示了一个示例视图 /w Eclipse。
标签: c++ multithreading qt opencv qthread