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 的成员。 moveToThreadstart 可以从 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 错误,未在此范围内定义的主要内容,如果未能解决你的问题,请参考以下文章

如何解决在 Ionic Vue 方法的嵌套范围内定义“this”时的 ESLint 错误

错误:未在此范围内声明“对象”

未在此范围内声明 CvSVM 错误

变量已在范围内定义?

C++ 错误:未在此范围内声明类/对象

无法从另一个函数(在全局范围内定义)访问变量(数组)