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