Qthread 仅调用 运行 一次

Qthread calls run only once

您好,我正在尝试在 Qt 的控制台应用程序中创建线程。

我的主要方法是:

#include<featurematcher.h>
#include<QCoreApplication>

    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);

        FeatureMatcher * fm = new FeatureMatcher();

        fm->start();

    return a.exec();

}

我的 FeatureMatches class 如下:

    #ifndef FEATUREMATCHER_H
#define FEATUREMATCHER_H
#include<QThread>

class FeatureMatcher:public QThread
{
    Q_OBJECT
public:
    FeatureMatcher();
    void run();
};

#endif // FEATUREMATCHER_H

和 cpp 文件:

#include "featurematcher.h"
#include <iostream>
FeatureMatcher::FeatureMatcher()
{
}


void FeatureMatcher::run()
{
    std::cout<<"Process"<<std::endl;
}

我的问题是,当我启动 运行ning 程序时,它只调用 运行 方法 once.I 期望输出无限数量的 "process" 但它只打印一次。 我在哪里失踪?

首先一般是not a good idea to inherit QThread。但是,如果您绝对必须这样做,则必须自己实现循环。您可以通过两种方式完成。

您可以创建一个 QTimer 然后 运行 QThread::exec:

void FeatureMatcher::run()
{
    this->moveToThread(this);

    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), SLOT(onTimer()));
    timer->setInterval(1000);
    timer->start();
    exec();
}

或者您可以创建一个无限循环:

void FeatureMatcher::run()
{
    while (1) {
        std::cout<<"Process"<<std::endl;
    }
}

更新了第一个示例 #2。

虽然我同意 Amartel 上面所说的 ("not a good idea to inherit QThread")。它仍然是一个选择。

如果你仍然想继承 QThread(你真的,可能不需要)试试这个:

    #ifndef FEATUREMATCHER_H
#define FEATUREMATCHER_H
#include<QThread>

class FeatureMatcher:public QThread
{
    Q_OBJECT
public:
    FeatureMatcher();
    void loopRun();
private:
    void run();
};

#endif // FEATUREMATCHER_H

然后将 looprun() 函数添加到您的 .cpp 文件中:

#include "featurematcher.h"
#include <iostream>
FeatureMatcher::FeatureMatcher()
{
}

void FeatureMatcher::run()
{
    std::cout<<"Process"<<std::endl;
}

void FeatureMatcher::looprun()
{
    while(1){
        start();
    }
}

希望我能帮到你。很少有实例继承 QThread 是有益的。

这是博客 post,作者之一是 with/helped 开发 QThread 模块的人,其中解释了一些困惑:https://blog.qt.io/blog/2010/06/17/youre-doing-it-wrong/

然而,这个 post 提出了一些反对总是使用工作线程而不是子类化 QThreads 的论点:http://woboq.com/blog/qthread-you-were-not-doing-so-wrong.html