注意:本次实现线程的暂停执行主要采用互斥量的方法,如果有更好的实现方法的小伙伴可以在下面留言!
直接插入代码了,由于做的小demo,代码写的可能有点乱,但还算完整。
//mythread.h#ifndef MYTHREAD_H#define MYTHREAD_H#include#include #include class MyThread:public QThread{ Q_OBJECTpublic: 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()<sleep(1);24 }25 26 27 28 }29 30 31 void MyThread::threadPause()32 {33 qDebug()< m_mutex.lock();35 this->m_buttonState=false;36 qDebug()< m_mutex.unlock();42 this->m_buttonState=true;43 qDebug()< 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 else63 {64 threadResume();65 }66 67 }
1 //mainwindow.h 2 #ifndef MAINWINDOW_H 3 #define MAINWINDOW_H 4 5 #include6 #include "mythread.h" 7 namespace Ui { 8 class MainWindow; 9 }10 11 class MainWindow : public QMainWindow12 {13 Q_OBJECT14 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 }else45 {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啊!