【问题标题】:QThread error , was not defined in this scopeQThread 错误,未在此范围内定义
【发布时间】:2023-10-03 20:34:01
【问题描述】:

我希望得到一些帮助,找出我的 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 文件中的包含。

标签: c++ multithreading qt qthread


【解决方案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/ 它对我帮助很大;)

    抱歉,我现在没有时间编写完整的示例,如果您需要它,请告诉我,稍后我可以帮助您。

    【讨论】: