QThread 错误,未在此范围内定义
Posted
技术标签:
【中文标题】QThread 错误,未在此范围内定义【英文标题】:QThread error , was not defined in this scope 【发布时间】:2015-06-16 14:43:28 【问题描述】:我希望得到一些帮助,找出我的 QThread 代码哪里出错了。这是第一次做线程并且一直在阅读和观看教程,但仍然很难。先生是我的代码
currentTimeThread.h(我的线程)
#ifndef CURRENTTIMETHREAD_H
#define CURRENTTIMETHREAD_H
#include <QtCore>
class currentTimeThread :public QThread
public:
currentTimeThread();
void run();
;
#endif // CURRENTTIMETHREAD_H
currentTimeThread.cpp
#include "currenttimethread.h"
#include <QtCore>
#include <QDebug>
#include "noheatmode.h"
currentTimeThread::currentTimeThread()
void currentTimeThread::run()
QTime time = QTime::currentTime();
QString sTime = time.toString("hh:mm:ss:ms");
noheatmode::ui->tempTimeNoHeatMode->append(sTime);
当线程被调用/启动时我的 noHeatMode.cpp
#include "noheatmode.h"
#include "ui_noheatmode.h"
#include "wiringPi.h"
#include "currenttimethread.h"
#include <QTime>
#include <QTextEdit>
#include <QTimer>
#include <QString>
noheatmode::noheatmode(QWidget *parent) :
QWidget(parent),
ui(new Ui::noheatmode)
ui->setupUi(this);
noheatmode::~noheatmode()
delete ui;
while(flowTime > 0)
currentTimeThread timeThread;
timeThread.start();
// set second pin LED to flash according to dutyCycle
digitalWrite(2,1);
delay(onTime);
digitalWrite(2,0);
delay(offTime);
//set zero pin to be high while flowtime is more than 0
digitalWrite(0,1);
flowTime--;
问题吧,我得到一个错误,就是时间线程的
currentTimeThread timeThread
未声明。问题是什么?
【问题讨论】:
您是否将currentTimeThread.h
包含在noHeatMode.cpp
中?
是的,它包含在内,我编辑了帖子以包含 noheatmode.cpp 文件中的包含。
【参考方案1】:
您的 while 循环中的大括号放错了位置:
while(flowTime > 0)
// <---- HERE
currentTimeThread timeThread;
timeThread.start();
// set second pin LED to flash according to dutyCycle
digitalWrite(2,1);
delay(onTime);
digitalWrite(2,0);
delay(offTime);
//set zero pin to be high while flowtime is more than 0
digitalWrite(0,1);
flowTime--;
否则代码就相当于这个
while (flowTime > 0)
currentTimeThread timeThread;
// timeThread doesn't exist anymore
// Rest of code
【讨论】:
【参考方案2】:我认为你正在以陈旧的方式获得它。到那时(我想我们正在谈论 QT3),QT 已经改变了他们使用线程的方式,并且确实让我们这些用户感到困惑,但是当你得到它时很容易。 您永远不应该扩展 QThread,只需使用他们为您提供的类。
您的方案如下:
用你的循环创建一个类 在这个类上创建一个槽,这是一个可以调用的方法 来自另一个线程。 从主类中,创建你的 loopClass 的一个实例和另一个 QThread 的实例 使用 QthreadObject 作为参数在 loopObject 上使用 movetothread 向您的 loopObject 的插槽发送一个信号,以便它可以开始工作你可以在这篇文章中看到完整的解释: https://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/ 它对我帮助很大;)
抱歉,我现在没有时间编写完整的示例,如果您需要它,请告诉我,稍后我可以帮助您。
【讨论】:
QThread
可以是loopClass
的成员。 moveToThread
和 start
可以从 loopClass
的构造函数中调用。
我认为您参考了这篇博文:blog.qt.io/blog/2010/06/17/youre-doing-it-wrong 并且是对的,许多用户误用了 QThread。但是继承 QThread 是有正当理由的,请参阅此博客:woboq.com/blog/qthread-you-were-not-doing-so-wrong.html。经验法则:如果在 Thread 中使用 QEventLoop,请使用您的方法,否则为子类以上是关于QThread 错误,未在此范围内定义的主要内容,如果未能解决你的问题,请参考以下文章