Имеет ли смысл использовать Qthread, не вызывая QThread :: start ()?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Имеет ли смысл использовать Qthread, не вызывая QThread :: start ()?

Сообщение Anonymous »

В течение некоторого времени я сейчас работаю с QT в приложении, где я должен взять рамы с камеры. Камера будет работать в другом потоке, чем в остальной части приложения. Я следовал рекомендациям:
http://mayaposch.wordpress.com/2011/11/ ... xplanation /
и
https://www.qt.io/blog/2010/06/17/youre-doing-it-wrong < /p>
не для подкласса qthread. Вместо этого я создал рабочую объект CcamerAcapture и перемещаю его в qthread. Захват кадры камеры управляется QTimer, который подключен к слоту для кадра. После перемещения CcamerAcapture в QThread, захват можно запустить с начала таймера. Мой вопрос: должен ли я позвонить в start () из класса Qthread? Мой подход работает, не называя его. Цикл выполняется таймером, а работник на самом деле работает в другой ветке, не вызывая запуска. Так что мне интересно, есть ли смысл в Calling start (), используется ли таймер? Для ясности я поместил свой класс работников ниже, который создается в основном приложении: < /p>
m_CameraCaptureThread= new QThread();
m_CameraCapture = new CCameraCapture(30);
m_CameraCapture->moveToThread(m_CameraCaptureThread);

//Connect error signal
QObject::connect(m_CameraCapture, SIGNAL(error(QString,QString)), this, SLOT(reportError(QString,QString)));

//Connect started() of QThread to the starting function of the worker class
connect(m_CameraCaptureThread, SIGNAL(started()), m_CameraCapture, SLOT(startGrabbing()));

//Connect the finished signal of the worker class to the thread for quitting the loop
connect(m_CameraCapture, SIGNAL(finished()), m_CameraCaptureThread, SLOT(quit()));

//This connections guarantees that the *m_CVideoCapture is automatically deleted if the event loop of the thread is terminated. Therefore, m_CVideoCapture does not need to be released manually if the capturing process is stopped.
QObject::connect(m_CameraCaptureThread, SIGNAL(finished()), m_CameraCaptureThread, SLOT(deleteLater()));
QObject::connect(m_CameraCapture, SIGNAL(finished()), m_CameraCapture, SLOT(deleteLater()));

//Connect sendFrame to update frame for displaying the current frame
QObject::connect(m_CameraCapture, SIGNAL(sendFrame(QImage)), this, SLOT(receiveFrame(QImage)));
/**
< /code>
Итак, до этого момента no m_cameracapturethread-> start () был вызван для запуска цикла обработки. Но если я позвоню в CamerAcapture-> startGrabbing (), это будет работать хорошо. Слот Grabframe () запускается таймером, а кадры отправляются в основное заявление. Тем не менее, все примеры кода, которые я видел до сих пор, называется start (), даже когда они использовали таймер: например: Право-пути-1/(использование 2-1 в конце страницы)
Это мой ccameracapture.h:
/**

@file CCameraCapture.h
@brief this file contains the definition of the class CCameraCapture.

**/

#ifndef CCameraCapture_H
#define CCameraCapture_H

//Required Qt libs
#include
#include
#include
#include
#include
#include

//Required OpenCV libs
#include

/**
@class CCameraCapture

@brief This class defines a video capture object which should be moved to thread.

class CCameraCapture : public QObject{

Q_OBJECT

public:
/**
@brief Constructor of CCameraCapture.
@param frameRate Desired frame rate (if possible)
*/
CCameraCapture(double frameRate=30);
/**
@brief Destructor of CCameraCapture.
*/
~CCameraCapture();
/**
@brief This function terminates the thread.
*/
void exitThread();
bool startGrabbing();
void stopGrabbing();
/**
@brief Check if camera is running
@return Returns true if camera is running
*/
bool isGrabbing();

private:
//The openCV capturing object to access the camera
cv::VideoCapture m_Cap;
// Device index
int m_IdxDevice;
// Timer for triggring grab frame
QTimer m_Timer;
//The most recent frame
QImage m_Frame;
//Mutex to lock variables
QMutex m_Mutex;

private slots:
/**
@brief This slot grabs a frame from the camera. It is triggered by the timer m_Timer.
*/
void grabFrame();

signals:
/**
@brief This signal needs to be connected to the slot in the main application which should receive the images.
@param img The most recent frame.

*/
void sendFrame(QImage currentFrame);
/**
@brief This signal is emitted if an error occurs
@param errMsg QString contains the error message to be displayed.
@param errTitle QString contains the title of the diplayed error message.

This signal should be connected to a slot in the main application. It allows to send error reports back to the main application which can be displayed on screen
*/
void error(QString errMsg,QString errTitle);
void finished();
};
#endif //CCameraCapture_H
< /code>
Это файл CPP: < /p>
/**
@file CCameraCapture.cpp
@brief this file contains the function definitions of CCameraCapture.
**/

#include "CCameraCapture.h"

CCameraCapture::CCameraCapture(double frameRate):m_Mutex(),m_IdxDevice(0)
{
//Connect timer to grabFrame
connect(&m_Timer, SIGNAL(timeout()), this, SLOT(grabFrame()), Qt::DirectConnection);
//Set framerate
m_Timer.setInterval(1000/frameRate);
}

CCameraCapture::~CCameraCapture(void)
{
}

void CCameraCapture::grabFrame(){
qDebug() >cvFrameBGR;
//Convert frame to RGB
cv::cvtColor(cvFrameBGR, cvFrameRGB, CV_BGR2RGB);
//Convert cv::Mat to QImage
QImage m_Frame=QImage((uchar*)(cvFrameRGB.data),cvFrameRGB.cols,cvFrameRGB.rows,QImage::Format_RGB888);
//Send frame to receivers
emit sendFrame(m_Frame);
}

bool CCameraCapture::startGrabbing(){
//Lock this function
QMutexLocker ml(&m_Mutex);
//Check if camera is open
if(!m_Cap.isOpened()){
//Connect to camera
if(!m_Cap.open(m_IdxDevice)){
emit error(QString("Could not connect to Camera."),QString("Error: No camera detected"));
return 0;
}
else{
//Start grabbing
m_Timer.start();
return 1;
}
}
else{
//Start grabbing
m_Timer.start();
return 1;
}
}

void CCameraCapture::stopGrabbing(){
//Lock this function
QMutexLocker ml(&m_Mutex);
//Stop grabbing
m_Timer.stop();
}

bool CCameraCapture::isGrabbing(){
//Lock this function
QMutexLocker ml(&m_Mutex);
//Return true if timer is running and triggering grabFrame
return m_Timer.isActive();
}

void CCameraCapture::exitThread(){
//Lock this function
QMutexLocker ml(&m_Mutex);
//Stop grabbing
stopGrabbing();
//Release camera
m_Cap.release();
//Emit finished signal which should be connected to quit() of QThread and deleteLater() of this class;
emit finished();
}


Подробнее здесь: https://stackoverflow.com/questions/226 ... hreadstart
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»