Я пишу простую программу Qt для захвата видеопотока с камеры (с использованием OpenCV). Я использую объект QThread
, который петлиет, захватывает изображения и подает их на объект MainWindow
. Это работает так, как должно.Многопоточное приложение Qt не останавливается при выходе
Проблема заключается в том, что когда я закрываю приложение (т. Е. Нажимая «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
camerathread
#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
Программа с они больше кода, чем это, но я только включил код, который, как мне кажется, имеет отношение к вопросу. Я отправлю все остальное, если это необходимо.
Проверьте, есть ли другие потоки, помимо пользовательского интерфейса и камеры. Возможно, API-интерфейсы, которые вы используете, порождают другие потоки. –
Я не уверен, как проверить это ... Не могли бы вы объяснить? – gromit190
Проверка на работающие потоки зависит от используемой вами среды (если она стоит соли). Например, этот поиск: https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=how%20to%20see%20running%20threads%20in%20eclipse дал этот результат : http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Ftasks%2Fanalyzingthreads.html Но опять же, это зависит от вашей среды разработки. Я просто продемонстрировал образец/w Eclipse. –