Qt 多线程的简单演示
Qt 多線程的簡單演示
任務(wù):單擊“”開始“”按鈕將啟動數(shù)個工作線程,線程由checkBox 來決定線程的啟用或者關(guān)閉,各個線程循環(huán)打印數(shù)字,數(shù)字每秒累加1;單擊“停止”按鈕將終止所有線程。
關(guān)于Qt中線程的理解:
Qt中的QThread類提供了平臺無關(guān)的線程。一個QThread代表了一個在應(yīng)用程序中可以獨立控制的線程,它與進程中的其他線程分享數(shù)據(jù),而且是獨立執(zhí)行的。
多線程編程可以有效解決在不凍結(jié)一個應(yīng)用程序的用戶界面情況下執(zhí)行一個耗時的操作問題。
相對于一般的程序都是從main()函數(shù)開始執(zhí)行,QThread從run()函數(shù)開始執(zhí)行。
QThread也提供了一個預(yù)平臺五關(guān)的睡眠函數(shù)。
實現(xiàn)過程:
單獨構(gòu)造一個WorkThread 類
#ifndef WORKTHREAD_H #define WORKTHREAD_H #include<QString> #include<QThread> #include<QObject>class Workthread:public QThread {Q_OBJECT public:Workthread();QString str;protected:void run(); signals:void mysignal(int);};#endif // WORKTHREAD_H #include "workthread.h" #include<QDebug>Workthread::Workthread() {}void Workthread::run() {while(true){for(int n = 0;n<1000;n++){str = QString::number(n);sleep(1);emit(mysignal(n));qDebug()<<str;}} }在workThread類中,定義了run() 來實現(xiàn)定時器累加。
接著在mianwindow.cpp 的構(gòu)造函數(shù)中添加如下代碼,這里將創(chuàng)建多個線程的對象。關(guān)聯(lián)按鈕來控制線程的開啟和終止。
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);setWindowTitle("線程");for(int i = 0;i<MAXSIZE;i++){workThread[i] = new Workthread();connect(workThread[i],SIGNAL(mysignal(int)),this,SLOT(ShowMsg(int)));}for(int i = 0;i<5;i++){flag_thread[i] = false;}connect(ui->pushButton_start,SIGNAL(clicked()),this, SLOT(slotStart()));connect(ui->pushButton_stop,SIGNAL(clicked()),this, SLOT(slotStop()));connect(ui->pushButton_exit,SIGNAL(clicked()),this, SLOT(close())); }接著:在信號槽函數(shù)中實現(xiàn) 線程的開啟和終止
void MainWindow::slotStart() {for(int i = 0;i<5;i++){if(flag_thread[i]){workThread[i]->start();}}ui->pushButton_start->setEnabled(false);ui->pushButton_stop->setEnabled(true); }void MainWindow::slotStop() {for(int i = 0;i<5;i++){if(flag_thread[i]){workThread[i]->terminate();workThread[i]->wait();}}ui->pushButton_start->setEnabled(true);ui->pushButton_stop->setEnabled(false); }我們用一個editText 部件來顯示線程處理中的數(shù)值,ShowMsg()函數(shù)來接收線程傳遞過來的信號mysignal(int)
這里,我們關(guān)聯(lián)
connect(workThread[i],SIGNAL(mysignal(int)),this,SLOT(ShowMsg(int))); void MainWindow::ShowMsg(int i ) {QString str = QString::number(i);ui->textEdit->append(str); }這樣就可以實現(xiàn)文本框的顯示了。
最后,checkBox 部件的實現(xiàn),我們讓該部件來響應(yīng)線程的開啟和關(guān)閉、
void MainWindow::on_checkBox_1_clicked(bool checked) {if(checked){flag_thread[0] = true;workThread[0]->start();}else{flag_thread[0] = false;workThread[0]->terminate();workThread[0]->wait();} }這樣,關(guān)于Qt多線程的并發(fā)處理的簡單例子就實現(xiàn)了,這里并沒有涉及線程間控制的相關(guān)內(nèi)容。
資源鏈接:
https://download.csdn.net/download/qq_21291397/12354483
總結(jié)
以上是生活随笔為你收集整理的Qt 多线程的简单演示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt 操作words实例 --- 幼儿快
- 下一篇: Qt多线程 TCP 服务端