日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt 第二种线程

發布時間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt 第二种线程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

流程:

?

工程目錄:

mythread.h:

#ifndef MYTHREAD_H #define MYTHREAD_H#include <QObject>class MyThread : public QObject {Q_OBJECT //要使用信號和槽必須有的宏, public:explicit MyThread(QObject *parent = 0);//線程處理函數void myTimerout();//由于bool isStop是私有的,需要定義一個公有接口,這里使用的是默認參數void setFlag(bool flag = true);signals:void mySignal();public slots:private:bool isStop;};#endif // MYTHREAD_H

?

?

mywidget.h:

#ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget>#include "mythread.h"#include <QThread>//添加在這里作為全局namespace Ui { class MyWidget; }class MyWidget : public QWidget {Q_OBJECTpublic:explicit MyWidget(QWidget *parent = 0);~MyWidget();void dealSignal();void dealclose();//點擊叉號槽函數 signals:void startThread();//啟動子線程的信號private slots:void on_buttonStart_clicked();void on_buttonStop_clicked();private:Ui::MyWidget *ui;MyThread *myT;QThread *thread;};#endif // MYWIDGET_H

?

?

mythread.cpp:

#include "mythread.h"#include <QThread>//待會用到sleep函數 #include <QDebug>MyThread::MyThread(QObject *parent) : QObject(parent) {isStop = false;}void MyThread::myTimerout() { // while(1) // { // //每隔一秒發射一次mySignal(), // QThread::sleep(1);// emit mySignal();// qDebug()<<"子線程號: "<<QThread::currentThread(); // }//換成如下代碼while(isStop == false){//每隔一秒發射一次mySignal(),QThread::sleep(1);emit mySignal();qDebug()<<"子線程號: "<<QThread::currentThread();if (true == isStop){break;}} }void MyThread::setFlag(bool flag) {isStop = flag; }

?

?

mywidget.cpp:

#include "mywidget.h" #include "ui_mywidget.h"#include <QDebug>MyWidget::MyWidget(QWidget *parent) :QWidget(parent),ui(new Ui::MyWidget) {ui->setupUi(this);//動態分配空間, 不能指定父對象,由于沒有指定父對象,所以我們需要手動將其delete掉myT = new MyThread;//創建子線程thread =new QThread(this);//把自定義的線程加入到子線程中myT->moveToThread(thread);connect(myT,&MyThread::mySignal,this,&MyWidget::dealSignal);qDebug()<<"主線程號: "<<QThread::currentThread();connect(this,&MyWidget::startThread,myT,&MyThread::myTimerout);//只能通過signal - slot 方式調用 connect(this,&MyWidget::destroyed,this,&MyWidget::dealclose);//線程處理函數內部,不允許操作圖形界面//面試題:connect()第五個參數的作用,第五個參數是:連接方式:默認,隊列,直接//多線程時才有意義//默認的時候,//如果是多線程,默認使用隊列//如果是單線程,默認使用直接方式//隊列:槽函數所在的線程和接收者一樣//直接:槽函數所在線程和發送者一樣 }MyWidget::~MyWidget() {delete ui; }void MyWidget::dealclose() {on_buttonStop_clicked();delete myT;} void MyWidget::dealSignal() {static int i = 0;i++;ui->lcdNumber->display(i); }void MyWidget::on_buttonStart_clicked() {if (thread->isRunning() == true){return;}//啟動線程,但是沒有啟動線程處理函數thread->start();myT->setFlag(false );//不能直接調用線程處理函數//直接調用(即myT->myTimerout();),導致線程處理函數和主線程是在同一個線程//只能通過signal - slot 方式調用 emit startThread();}void MyWidget::on_buttonStop_clicked() {//在這里由于使用的是while(1),其實線程是不能退出的,這是因為quit()要等線程走完再退出,但是while(1)是死循環,走不完。//所以我們應該在while函數下功夫,即設置一個標志位,if(thread->isRunning() == false){return;}myT->setFlag(true);thread->quit();thread->wait(); }

?

ui:

?

轉載于:https://www.cnblogs.com/doker/p/11162523.html

總結

以上是生活随笔為你收集整理的Qt 第二种线程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。