【发布时间】:2014-06-29 16:03:42
【问题描述】:
我正在编写一个程序,它每REFRESH_RATE 毫秒从相机捕获一张图像,以将其发送到某个计算算法。我决定使用QThread 来定时启动该算法,但该算法在主线程上运行,因为我需要在此之前创建的对象。
无论如何,这很好用。
当我尝试关闭第二个线程时,麻烦就开始了......这是代码。
相机:
class Camera : public QMainWindow
{
Q_OBJECT
public:
Camera(QWidget *parent = 0){
AlgoQThread = new QThread;
myAlgoThreadWorker = new AlgoThreadWorker( (Camera *) this );
myAlgoThreadWorker->moveToThread(AlgoQThread);
//Launch The thread
connect(AlgoQThread, SIGNAL(started()), myAlgoThreadWorker, SLOT(process()));
connect(myAlgoThreadWorker, SIGNAL(finished()), AlgoQThread, SLOT(quit()));
// The line meant to stop the thread at next loop
connect(this, SIGNAL(stopAlgoThread()), myAlgoThreadWorker, SLOT(stopThread()));
connect(myAlgoThreadWorker, SIGNAL(finished()), myAlgoThreadWorker, SLOT(deleteLater()));
connect(AlgoQThread, SIGNAL(finished()), AlgoQThread, SLOT(deleteLater()));
AlgoQThread->start();
}
private slots:
void errorString(QString error);
//This function is triggered by a signal sent by the method called in AlgoThreadWoker::process()
void some_algorithm(){
...
emit stopAlgoThread();
}
signals:
void stopAlgoThread();
private:
QThread * AlgoQThread;
AlgoThreadWorker * myAlgoThreadWorker;
};
algoThreadWorker:
class AlgoThreadWorker : public QObject
{
Q_OBJECT
public:
AlgoThreadWorker(Camera * context){
parentCamera = context;
}
Camera* parentCamera;
public slots:
void process(){
while(1){
QMutexLocker locker(&m_mutex);
if (t_stop) break;
parentCamera->isCapturingImage = true;
//This triggers the some_algorithm() using a signal sent by imageCapture from main Thread
parentCamera->imageCapture->capture();
//Wait REFRESH_RATE millisecondes
Sleep(REFRESH_RATE);
}
//Ends the thread
emit finished();
}
private slots:
void stopThread(){
QMutexLocker locker(&m_mutex);
t_stop = true;
};
signals:
void finished();
void error(QString);
private:
bool t_stop;
QMutex m_mutex;
};
好吧,正如您可能已经预见的那样,它不起作用。我可以毫无问题地启动some_algorithm(),但我无法结束线程。 stopThread() 插槽甚至还没有启动,我已经测试过了。
【问题讨论】:
-
使用类名来命名对象是个坏主意。
-
哦,搞错了;实际代码中不是这样的,抱歉。
-
现在应该更好了。
-
仅供参考,“睡眠”来自 windows.h,所以它的单位是毫秒。
-
不错。 @Rems,我在寻找可能很快会在我自己的项目中实施的解决方案时,想出了一堆关于信号和槽的东西;)
标签: c++ multithreading qt