您好我正在尝试在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;打印出来但只打印一次。 我失踪的地方?
答案 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