来自主线程的信号未到达第二线程Qt 5中的插槽

雷米·桑(Remy San)

我正在编写一个程序,该程序每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()插槽甚至还没有启动,我已经测试过了。

村拉糖

由于您在while循环中忙于等待,因此事件循环永远不会有机会处理接收到的信号。

qApp->processEvents() 将控件交给事件循环,以处理等待的作业。

请注意,通常您不必自己调用它,Qt会为您调用它。在您的情况下,这是必要的,因为您有一个无限循环,这会阻止Qt执行其工作。

解决方案:

void process(){

    while(1){
        qApp->processEvents();
        ^^^^^^^^^^^^^^^^^^^^^^

        .....
    }

    //Ends the thread
    emit finished();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

QT5中的信号和插槽

来自分类Dev

C ++:信号/插槽库中的线程安全

来自分类Dev

是否可以从Qt5 QML中的信号断开所有插槽?

来自分类Dev

QT中的插槽排队

来自分类Dev

PyQt5线程,信号和插槽。连接错误

来自分类Dev

PyQt5:使用QtDesigner,如何将信号与模块中定义的插槽/可调用连接

来自分类Dev

访问在第二个线程的主线程中定义的变量?

来自分类Dev

访问在第二个线程的主线程中定义的变量?

来自分类Dev

Qt:连接文本中的信号和插槽

来自分类Dev

在QT中清除信号和插槽的命名

来自分类Dev

如何知道Qt在哪个线程中执行插槽?

来自分类Dev

Qt插槽未在多线程DLL中执行

来自分类Dev

PyQt5 Gui线程到辅助线程信号/插槽

来自分类Dev

如何从插槽中找出哪个信号调用了该插槽?

来自分类Dev

在非Qt线程中使用Qt信号/插槽

来自分类Dev

Qt5:无法将信号连接到插槽

来自分类Dev

Qt线程上的信号插槽,这是安全的方法吗?

来自分类Dev

Qt线程上的信号插槽,这是安全的方法吗?

来自分类Dev

第二类内的QT信号和插槽

来自分类Dev

QT信号和插槽可在单线程中直接指导应用程序中的连接行为

来自分类Dev

Qt:信号主线程

来自分类Dev

Qt:信号主线程

来自分类Dev

将参数放在Qt中的插槽中

来自分类Dev

Qt 4.8:两个信号和来自不同线程的一个插槽之间的连接行为

来自分类Dev

覆盖子类中的Qt插槽

来自分类Dev

Qt排队连接中的插槽调用顺序

来自分类Dev

PyQt | 信号未在QThread中处理,但在主线程中

来自分类Dev

将QVector从信号传递到不同线程中的插槽是否会导致数据复制?

来自分类Dev

如何在Qt中创建动态信号和插槽?

Related 相关文章

热门标签

归档