छोड़ने पर नहीं रुकता है मैं कैमरे से वीडियो फ़ीड (ओपनसीवी का उपयोग करके) को कैप्चर करने के लिए एक साधारण क्यूटी प्रोग्राम लिख रहा हूं। मैं QThread
ऑब्जेक्ट का उपयोग कर रहा हूं जो लूप, छवियों को कैप्चर करना और उन्हें MainWindow
ऑब्जेक्ट पर खिला रहा है। यह काम कर रहा है जैसा कि यह करना चाहिए।मल्टीथ्रेड क्यूटी एप्लिकेशन
समस्या यह है कि जब मैं बंद करता हूं, एप्लिकेशन (यानी "एक्स" दबाकर) कैमरा कैप्चरिंग थ्रेड बंद हो जाता है और गुई गायब हो जाता है। लेकिन कार्यक्रम अभी भी पृष्ठभूमि में चल रहा है। मुझे एप्लिकेशन आउटपुट में चेतावनी भी मिल रही है:
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
कार्यक्रम ग इस से अधिक कोड के ऑनिस्ट, लेकिन मैंने केवल उस कोड को शामिल किया जो मुझे लगता है कि प्रश्न के लिए प्रासंगिक है। यदि आवश्यक हो तो मैं बाकी को पोस्ट करूंगा।
यह देखने के लिए जांचें कि यूआई और कैमरा थ्रेड के अलावा अन्य धागे चल रहे हैं या नहीं। यह संभव है कि आप जिन एपीआई को अन्य धागे का उपयोग कर रहे हैं। –
मुझे यकीन नहीं है कि इसके लिए कैसे जांचें ... क्या आप कृपया समझा सकते हैं? – 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 लेकिन फिर, यह आपके आईडीई पर निर्भर करता है। मैंने बस नमूना दृश्य/डब्ल्यू ग्रहण का प्रदर्शन किया। –