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。你可以在该线程中拥有计时器和工作负载。谢谢,这非常有帮助!