Qthread调用只运行一次

Qthread calls run only once

本文关键字:一次 调用 运行 Qthread      更新时间:2023-10-16

您好,我正在尝试在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;
}

我的问题是,当我开始运行程序,它只调用运行方法一次。我期望输出是无限数量的"过程"打印出来,但它只打印一次。我在哪里失踪?

首先,继承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上面所说的("继承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是有益的。

这是一个与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