【发布时间】:2021-03-15 13:43:15
【问题描述】:
如何在不同的QThreads 中运行循环函数?我需要在不同的线程中运行,因为如果我不这样做,循环就会中断。
如何使on_pushTurnOn_clicked在其他线程中执行,pushTurnOn的循环必须能够被on_pushTurnOff_clicked取消,即使在不同的线程上。
MainWindow.h 代码:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDebug>
#include <QThread> //I don't know how to use it
#include <QTimer>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushTurnOn_clicked();
void on_pushTurnOff_clicked();
private:
QTimer *timerLoop;
};
#endif // MAINWINDOW_H
MainWindowcpp 代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushTurnOn_clicked()
{
timerLoop = new QTimer(this);
timerLoop->setInterval(3000);
timerLoop->setSingleShot(true);
connect(timerLoop, SIGNAL(timeout()),
SLOT(on_pushTurnOn_clicked()));
qDebug()<<"the loop was started";
timerLoop->start(); //start the loop
}
void MainWindow::on_pushTurnOff_clicked()
{
qDebug()<<"the loop was stoped";
timerLoop->stop(); //stop the loop
}
【问题讨论】:
-
这个问题没有完全的意义,但你可以使用 Qthread::run 来达到目的。这就是我从这个问题所了解的全部
-
请注意,每次输入
on_pushTurnOn_clicked()时都会创建一个新的QTimer。这可能不是您想要的内存泄漏? -
一种优雅的方法是在构造函数中分配 QTimer 并连接到完成工作的插槽。在
on_pushTurnOn_clicked()内部,您启动计时器一次(不是单次),在on_pushTurnOff_clicked()内部,您像现在一样停止计时器。这样您就不需要运行第二个线程。 -
@Aditya 我需要创建第二个线程,这是程序本身的 2%...真正的目的是在主线程上连接一个 PLC,并对另一个进行循环检查可编程逻辑控制器。 (2 个线程用于 2 个不同的 IP)。
-
@JoãoPedro 那么我相信你最好的选择是有第二个类,当你点击按钮时分配它并移动到 QThread。您可以在该线程中设置计时器和工作负载。
标签: c++ multithreading qt loops qthread