博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QT 线程暂停,继续执行的一种实现
阅读量:4935 次
发布时间:2019-06-11

本文共 3604 字,大约阅读时间需要 12 分钟。

注意:本次实现线程的暂停执行主要采用互斥量的方法,如果有更好的实现方法的小伙伴可以在下面留言!

直接插入代码了,由于做的小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 #include 
6 #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啊!

 

转载于:https://www.cnblogs.com/liu-hq/p/4281806.html

你可能感兴趣的文章
express框架学习笔记
查看>>
记录一个css的综合运用
查看>>
在Ubuntu中安装PHP,MySQL,Nginx和phpMyAdmin
查看>>
类模板相互引用的问题(错误:缺少类型说明符-假定为int。注意:C++不支持默认int)...
查看>>
操作系统下载路径
查看>>
网站开发 关于图片压缩 以及图片使用
查看>>
把查询出来的结果进行修改再赋值给list
查看>>
POSIX条件变量pthread_cond
查看>>
开博了
查看>>
C# Dictionary 字典用法 记录
查看>>
php中iconv函数使用问题
查看>>
hive的count(distinct id)测试--慎用
查看>>
第九周周总结
查看>>
关于一个简单面试题(。net)
查看>>
Logistic Regression
查看>>
RecipientsEditor-信息收件人输入框
查看>>
8lession-基础类型转化
查看>>
线程同步复习
查看>>
Nginx http反向代理流程Proxy_pass模块
查看>>
HTML5 新元素标签系列:使用 HTML5 设计自己的博客
查看>>