Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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++ Qt-使用由按钮控制的线程的简单示例_C++_Qt_Qthread - Fatal编程技术网

C++ Qt-使用由按钮控制的线程的简单示例

C++ Qt-使用由按钮控制的线程的简单示例,c++,qt,qthread,C++,Qt,Qthread,我一直在尝试使用按钮激活的线程来实现这个简单的示例。它基于以下问题中的解决方案: 上面的示例解决方案与下面的代码之间的主要区别是: 我使用了QWidget而不是MainWindow 为了清楚起见,我更改了信号的名称 我的代码包含调试信息 我试着消除工人发出的信号,因为工人似乎什么也没做 似乎启动/停止信号没有触发相应的插槽,但我没有足够的经验来排除原因 此外,我不确定信号的用途: SignalToObj_mainThreadGUI() 这只是可以使用而不是的东西吗 我一直试图让这段代码工作了一

我一直在尝试使用按钮激活的线程来实现这个简单的示例。它基于以下问题中的解决方案:

上面的示例解决方案与下面的代码之间的主要区别是:

  • 我使用了QWidget而不是MainWindow
  • 为了清楚起见,我更改了信号的名称
  • 我的代码包含调试信息
  • 我试着消除工人发出的信号,因为工人似乎什么也没做
  • 似乎启动/停止信号没有触发相应的插槽,但我没有足够的经验来排除原因

    此外,我不确定信号的用途:

    SignalToObj_mainThreadGUI()

    这只是可以使用而不是的东西吗

    我一直试图让这段代码工作了一段时间,所以任何帮助都将不胜感激

    main.cpp

    #包括“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