注意:本次实现线程的暂停执行主要采用互斥量的方法,如果有更好的实现方法的小伙伴可以在下面留言!
直接插入代码了,由于做的小demo,代码写的可能有点乱,但还算完整。
//mythread.h #ifndef MYTHREAD_H #define MYTHREAD_H #include <QDebug> #include <QThread> #include <QMutex> class MyThread:public QThread { Q_OBJECT public: MyThread(); ~MyThread(); void run(); public slots: void threadStart(); void threadPause(); void threadStop(); void threadResume(); void threadPR(); private: bool m_buttonState; //if pause m_buttonState=false;else m_buttonState=true; int m_i; QMutex m_mutex;//互斥量 }; #endif // MYTHREAD_H
1 //mythread.cpp 2 #include "mythread.h" 3 MyThread::MyThread() 4 { 5 m_i=0; 6 m_buttonState=false; 7 } 8 9 MyThread::~MyThread() 10 { 11 12 } 13 14 void MyThread::run() 15 { 16 m_buttonState=true; 17 while(1) 18 { 19 m_mutex.lock(); 20 m_i++; 21 qDebug()<<QString("the value of m_i is %1 ").arg(m_i); 22 m_mutex.unlock(); 23 this->sleep(1); 24 } 25 26 27 28 } 29 30 31 void MyThread::threadPause() 32 { 33 qDebug()<<QString("pause :%1").arg(m_buttonState); 34 this->m_mutex.lock(); 35 this->m_buttonState=false; 36 qDebug()<<QString("pause"); 37 } 38 void MyThread::threadResume() 39 { 40 qDebug()<<QString("resume :%1").arg(m_buttonState); 41 this->m_mutex.unlock(); 42 this->m_buttonState=true; 43 qDebug()<<QString("resume"); 44 45 } 46 void MyThread::threadStop() 47 { 48 this->exit(); 49 50 } 51 void MyThread::threadStart() 52 { 53 this->start(); 54 } 55 void MyThread::threadPR() 56 { 57 if(m_buttonState) 58 { 59 threadPause(); 60 61 } 62 else 63 { 64 threadResume(); 65 } 66 67 }
1 //mainwindow.h 2 #ifndef MAINWINDOW_H 3 #define MAINWINDOW_H 4 5 #include <QMainWindow> 6 #include "mythread.h" 7 namespace Ui { 8 class MainWindow; 9 } 10 11 class MainWindow : public QMainWindow 12 { 13 Q_OBJECT 14 15 public: 16 explicit MainWindow(QWidget *parent = 0); 17 ~MainWindow(); 18 private slots: 19 void changeButton(); 20 void threadStop(); 21 void threadStart(); 22 void threadPR(); 23 private: 24 Ui::MainWindow *ui; 25 MyThread *myThread; 26 MyThread *oneThread; 27 28 }; 29 30 #endif // MAINWINDOW_H
1 //mainwindow.cpp 2 #include "mainwindow.h" 3 #include "ui_mainwindow.h" 4 5 MainWindow::MainWindow(QWidget *parent) : 6 QMainWindow(parent), 7 ui(new Ui::MainWindow) 8 { 9 ui->setupUi(this); 10 myThread=new MyThread; 11 oneThread=new MyThread; 12 connect(ui->pauseButton,SIGNAL(clicked()),this,SLOT(changeButton())); 13 connect(ui->startButton,SIGNAL(clicked()),this,SLOT(threadStart())); 14 connect(ui->pauseButton,SIGNAL(clicked()),this,SLOT(threadPR())); 15 connect(ui->stopButton,SIGNAL(clicked()),this,SLOT(threadStop())); 16 } 17 18 MainWindow::~MainWindow() 19 { 20 if(ui!=NULL) 21 { 22 delete ui; 23 ui=NULL; 24 } 25 if(myThread!=NULL) 26 { 27 delete myThread; 28 myThread=NULL; 29 } 30 if(oneThread!=NULL) 31 { 32 delete oneThread; 33 oneThread=NULL; 34 } 35 } 36 37 void MainWindow::changeButton() 38 { 39 40 41 if(!QString::compare(ui->pauseButton->text(),QString::fromUtf8("暂停"))) 42 { 43 ui->pauseButton->setText(QString::fromUtf8("继续")); 44 }else 45 { 46 ui->pauseButton->setText(QString::fromUtf8("暂停")); 47 } 48 } 49 50 void MainWindow::threadStart() 51 { 52 myThread->threadStart(); 53 oneThread->threadStart(); 54 55 } 56 void MainWindow::threadStop() 57 { 58 myThread->terminate(); 59 oneThread->terminate(); 60 61 } 62 void MainWindow::threadPR() 63 { 64 myThread->threadPR(); 65 oneThread->threadPR(); 66 67 68 }
还有一个简单的ui界面就不贴了,就三个button
暂停、继续就可以实现了,但很奇怪的事情是当将线程terminate 后再调用start 也会好像出现“暂停、继续”的效果,这个正在思考中,如果小伙伴有知道的留言tell me啊!
时间: 2024-11-05 21:37:02