Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在不同的QThread中运行函数_C++_Multithreading_Qt_Loops_Qthread - Fatal编程技术网

C++ 如何在不同的QThread中运行函数

C++ 如何在不同的QThread中运行函数,c++,multithreading,qt,loops,qthread,C++,Multithreading,Qt,Loops,Qthread,如何在不同的QThreads中运行循环函数?我需要在不同的线程中运行,因为如果我不这样做,循环就会中断 如何在其他线程中执行单击的on\u pushTurnOn\u,并且即使在不同的线程上,单击的on\u pushTurnOn\u也必须能够取消on\u pushTurnOn的循环 main窗口.h代码: \ifndef主窗口 #定义主窗口 #包括 #包括 #包括//我不知道如何使用它 #包括 名称空间用户界面{ 类主窗口; } 类主窗口:公共QMainWindow { Q_对象 公众: 主窗口(

如何在不同的
QThreads
中运行循环函数?我需要在不同的线程中运行,因为如果我不这样做,循环就会中断

如何在其他线程中执行单击的
on\u pushTurnOn\u
,并且即使在不同的线程上,单击的
on\u pushTurnOn\u
也必须能够取消
on\u pushTurnOn
的循环

main窗口
.h代码:

\ifndef主窗口
#定义主窗口
#包括
#包括
#包括//我不知道如何使用它
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
主窗口(QWidget*parent=nullptr);
~main窗口();
专用插槽:
单击按钮打开时无效();
单击按钮关闭时无效();
私人:
QTimer*timerLoop;
};
#endif//main窗口
main窗口
cpp代码:

#包括“mainwindow.h”
#包括“ui_main window.h”
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void main window::在按下按钮时打开并单击()
{
timerLoop=新的QTimer(此);
timerLoop->setInterval(3000);
timerLoop->setSingleShot(真);
连接(timerLoop,信号(timeout()),
插槽(在按钮打开时单击());

qDebug()我将从一个旁注开始。您在按下打开时单击的
timerLoop
的内存分配()
将由于没有释放而导致内存泄漏,即使它是一个单次计时器。您正在创建一个新的
QTimer
,而不会破坏以前分配的计时器。更好的方法是只在构造函数中分配内存一次,然后在单击()时在
中启动计时器。

回到你的问题,你必须把你的类分成两个,一个是你的
主窗口,它有一些插槽,用于打开和关闭按钮,其他可能的UI元素和非密集型任务

第二个类是一个worker,它包含
QTimer
,以及实际的工作负载。因此,您基本上有如下内容:

MainWindow.cpp:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //constructor
    ui->setupUi(this);
    this->worker = new Worker(); //object of WorkerClass type
    QThread *thread = new QThread();
    worker->moveToThread(thread);
    connect(this, SIGNAL(startOrStopTimerSignal(bool), worker, SLOT(startStopTimer(bool));
}
void MainWindow::on_pushTurnOn_clicked()
{
    if(Busy==1){
        qDebug()<<"Is busy!";
    }
    if(Busy==0){
    FuncaoLoop(RandomParameter1, RandomParameter2);
    }
//start the timer through a signal (timers need to be started in their own threads)
    emit startOrStopTimerSignal(true);
}

void MainWindow::on_pushTurnOff_clicked()
{
    emit startOrStopTimerSignal(false); //stop the timer
}
WorkerClass::WorkerClass(QObject *parent) : QObject(parent)
{
    timerLoop= new QTimer(this);
    connect(timerLoop, SIGNAL(timeout()), this, SLOT(workLoad())); //timer connect to your actual task
}
void WorkerClass::startStopTimer(bool start)
{
    if (start)
        timerLoop->start();
    else
        timerLoop->stop();
}
WorkerClass::workLoad()
{
    //whatever task for your PLC
}

希望这对您有所帮助。

这个问题没有完全的意义,但是您可以使用Qthread::run来实现这个目的。这就是我从这个问题中了解到的所有内容。请注意,您每次在单击按钮打开时输入
,都会创建一个新的QTimer()
。对于可能的内存泄漏,这可能不是您想要的。一种优雅的方法是在构造函数中分配QTimer,并连接到执行此操作的插槽。在内部
打开按钮时单击()
启动计时器一次(不是单次启动),在内部
打开按钮时单击()启动计时器
您可以像正在做的那样停止计时器。这样您就不需要运行第二个线程。@Aditya我需要创建第二个线程,这是程序本身的2%…真正的目的是在主线程上连接一个PLC,并在另一个PLC上执行循环检查。(两个线程用于两个不同的IP)@JoãoPedro那么我相信你最好的选择是拥有第二个类,当你点击按钮时,它会被分配到一个QThread。你可以在该线程中拥有计时器和工作负载。谢谢,这非常有帮助!