Qthread调用只运行一次

时间:2015-05-22 13:44:31

标签: c++ multithreading qt qthread

您好我正在尝试在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类如下:

    #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;
}

我的问题是,当我开始运行程序时,它只调用一次run方法。我希望输出是无限数量的&#34; process&#34;打印出来但只打印一次。 我失踪的地方?

2 个答案:

答案 0 :(得分:1)

首先,它通常是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。

答案 1 :(得分:1)

虽然我同意Amartel上面所说的内容(&#34;继承QThread并不是一个好主意&#34;)。它仍然是一种选择。

如果你仍想继承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是有益的。

这是博客文章,其中一位与QThread模块合作/帮助开发QThread模块的人解释了一些混淆:https://blog.qt.io/blog/2010/06/17/youre-doing-it-wrong/

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