C++ Qt-使用由按钮控制的线程的简单示例
我一直在尝试使用按钮激活的线程来实现这个简单的示例。它基于以下问题中的解决方案: 上面的示例解决方案与下面的代码之间的主要区别是:C++ Qt-使用由按钮控制的线程的简单示例,c++,qt,qthread,C++,Qt,Qthread,我一直在尝试使用按钮激活的线程来实现这个简单的示例。它基于以下问题中的解决方案: 上面的示例解决方案与下面的代码之间的主要区别是: 我使用了QWidget而不是MainWindow 为了清楚起见,我更改了信号的名称 我的代码包含调试信息 我试着消除工人发出的信号,因为工人似乎什么也没做 似乎启动/停止信号没有触发相应的插槽,但我没有足够的经验来排除原因 此外,我不确定信号的用途: SignalToObj_mainThreadGUI() 这只是可以使用而不是的东西吗 我一直试图让这段代码工作了一
#包括“threadtest.h”
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
螺纹试验w;
w、 show();
返回a.exec();
}
threadtest.h
#包括
#包括
#包括“worker.h”
名称空间用户界面
{
类螺纹试验;
}
类ThreadTest:publicqwidget
{
Q_对象
公众:
显式线程测试(QWidget*parent=0);
~ThreadTest();
信号:
void startWorkSignal();
void stopWorkSignal();
专用插槽:
单击开始按钮时无效();
单击按钮时无效();
私人:
Ui::ThreadTest*Ui;
工人*我的工人;
QThread*WorkerThread;
};
threadtest.cpp
#包括“threadtest.h”
#包括“ui_threadtest.h”
ThreadTest::ThreadTest(QWidget*父项):
QWidget(母公司),
ui(新ui::ThreadTest)
{
用户界面->设置用户界面(此);
我的工人=新工人;
WorkerThread=新的QThread;
myWorker->moveToThread(WorkerThread);
连接(这个,
信号(startWorkSignal()),
我的工人,
插槽(StartWork())
);
连接(这个,
信号(停止工作信号()),
我的工人,
插槽(停止工作())
);
//调试
此->dumpObjectInfo();
myWorker->dumpObjectInfo();
}
ThreadTest::~ThreadTest()
{
删除用户界面;
}
void ThreadTest::启动按钮时单击()
{
qDebug()不会触发插槽,因为您已将myWork移动到线程WorkerThread,但未在该线程中运行事件循环。在threadtest.cpp中,添加
WorkerThread .start();
之后
你应该写
WorkerThread->start();
或者可以使用ThreadTest对象的线程代替WorkerThread(在本例中,WorkerThread是不必要的):
#include "threadtest.h"
#include "ui_threadtest.h"
ThreadTest::ThreadTest(QWidget *parent) :
QWidget(parent),
ui(new Ui::ThreadTest)
{
ui->setupUi(this);
myWorker = new worker;
WorkerThread = new QThread;
myWorker->moveToThread(WorkerThread);
connect(this,
SIGNAL(startWorkSignal()),
myWorker,
SLOT(StartWork())
);
connect(this,
SIGNAL(stopWorkSignal()),
myWorker,
SLOT(StopWork())
);
//Debug
this->dumpObjectInfo();
myWorker->dumpObjectInfo();
}
ThreadTest::~ThreadTest()
{
delete ui;
}
void ThreadTest::on_startButton_clicked()
{
qDebug() << "startwork signal emmitted";
emit startWorkSignal();
}
void ThreadTest::on_stopButton_clicked()
{
qDebug() << "stopwork signal emmitted";
emit stopWorkSignal();
}
#include <QObject>
#include <QDebug>
class worker : public QObject {
Q_OBJECT
public:
explicit worker(QObject *parent = 0);
~worker();
signals:
void SignalToObj_mainThreadGUI();
//void running();
//void stopped();
public slots:
void StopWork();
void StartWork();
private slots:
void do_Work();
private:
volatile bool running, stopped;
};
#include "worker.h"
worker::worker(QObject *parent) : QObject(parent), stopped(false),
running(false)
{
qDebug() << "running: " << running;
qDebug() << "stopped: " << stopped;
}
worker::~worker() {}
void worker::do_Work()
{
qDebug() << "inside do Work";
emit SignalToObj_mainThreadGUI();
if (!running || stopped) return;
// actual work here
/*
for (int i = 0; i < 100; i++)
{
qDebug() << "count: " + i;
}
*/
QMetaObject::invokeMethod(this, "do_Work", Qt::QueuedConnection);
}
void worker::StopWork()
{
qDebug() << "inside StopWork";
stopped = true;
running = false;
//emit stopped();
}
void worker::StartWork()
{
qDebug() << "inside StartWork";
stopped = false;
running = true;
//emit running();
do_Work();
}
WorkerThread .start();
myWorker = new worker;
WorkerThread = new QThread;
myWorker->moveToThread(WorkerThread);
WorkerThread->start();
myWorker->moveToThread(thread()); // this->thread