QT 线程暂停,继续执行的一种实现

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

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

QT 线程暂停,继续执行的一种实现的相关文章

C++11消息队列 + Qt线程池 + QRunnable执行任务简单模型

1.模板类queue,包含头文件<queue>中,是一个FIFO队列. queue.push():在队列尾巴增加数据 queue.pop():移除队列头部数据 queue.font():获取队列头部数据的引用... 2.Qt库的线程池,QThreadPool QThreadPool.setMaxThreadCount():设置线程池最大线程数 QThreadPool.start(new QRunnable(..)):开启线程池调用QRunnable 3.QRunnable执行任务 void r

Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? 线程的sleep()方法和yield()方法有什么区别?

Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复.wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时

让线程按顺序执行8种方法

实现我们下面需要完成这样一个应用场景: 1.早上:2.测试人员.产品经理.开发人员陆续的来公司上班:3.产品经理规划新需求:4.开发人员开发新需求功能:5.测试人员测试新功能. 规划需求,开发需求新功能,测试新功能是一个有顺序的,我们把thread1看做产品经理,thread2看做开发人员,thread3看做测试人员. 1.使用线程的join方法 join():是Theard的方法,作用是调用线程需等待该join()线程执行完成后,才能继续用下运行. 如果想学习Java工程化.高性能及分布式.深

QT核心编程之Qt线程 (c)

QT核心编程之Qt线程是本节要介绍的内容,QT核心编程我们要分几个部分来介绍,想参考更多内容,请看末尾的编辑推荐进行详细阅读,先来看本篇内容. Qt对线程提供了支持,它引入了一些基本与平台无关的线程类.线程安全传递事件的方式和全局Qt库互斥量允许你从不同的线程调用Qt的方法.Qt中与线程应用相关的类如表6所示. 表6 Qt中与线程相关的类 使用线程需要Qt提供相应的线程库的支持,因此,在编译安装Qt时,需要加上线程支持选项. 当在Windows操作系统上编译Qt时,线程支持是在一些编译器上的一个

Qt 线程基础(QThread、QtConcurrent等) 2

使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使用线程时需要非常小心.启动线程是很容易的,但确保所有共享数据保持一致很难.遇到问题往往很难解决,这是由于在一段时间内它可能只出现一次或只在特定的硬件配置下出现.在创建线程来解决某些问题之前,应该考虑一些替代的技术 : 替代技术 注解 QEventLoop::processEvents() 在一个耗时的计

qt线程(转)----这篇很专业!

本文档是自己所整理的一份文档,部分是原创,还转贴了网上的一此资料(已经标明了),(难点是多线程的编写),是有源代码的,大家可以作为参考,用到的知识是视频采集,压缩解压(xvid),实时传输(jrtp),基于qt库所写的,由于本人对qt下的多线程还不很了解,只做了单线程的(采集-->压缩-->解压-->发送-->接收--显示),用timer来刷新视频播放窗口,现在正在研究多线程(代码还在整理中),以后再换成多线程(用qt4的多线程,因为qt4的线程继承于QObject的,线程间可以使

qt 线程与ui线程同步

QT UI 与线程同步 目前只会一种,采用信号槽机制.通常情况下,信号和槽机制可以同步操作,这就意味着在发射信号的时候,使用直接函数即可以立刻调用连接到一个信号上的多个槽.然而,当连接位于不同线程中的对象时,这一机制就会变得不同步起来,可以通过修改QObject::connect()的第5个可选参数而改变.connect的第五个参数Qt::QueuedConnection表示槽函数由接受信号的线程所执行,如果不加表示槽函数由发出信号的次线程执行.当传递信号的参数类型不是QT的元类型时要先注册,关

Qt 线程基础

(转自:http://my.oschina.net/laopiao/blog/88158) 保谓线程? 线程与并行处理任务息息相关,就像进程一样.那么,线程与进程有什么区别呢?当你在电子表格上进行数据结算的时候,在相同的桌面上可能有一个播放器正在播放你最喜欢的歌曲.这是一个两个进程并行工作的例子:一个进程运行电子表格程序;另一个进程运行一个媒体播放器.这种情况最适合用多任务这个词来描述.进一步观察媒体播放器,你会发现在这个进程内,又存在并行的工作.当媒体播放器向音频驱动发送音乐数据的时候,用户界

Qt 学习之路 :Qt 线程相关类

希望上一章有关事件循环的内容还没有把你绕晕.本章将重新回到有关线程的相关内容上面来.在前面的章节我们了解了有关QThread类的简单使用.不过,Qt 提供的有关线程的类可不那么简单,否则的话我们也没必要再三强调使用线程一定要万分小心,一不留神就会陷入陷阱. 事实上,Qt 对线程的支持可以追溯到2000年9月22日发布的 Qt 2.2.在这个版本中,Qt 引入了QThread.不过,当时对线程的支持并不是默认开启的.Qt 4.0 开始,线程成为所有平台的默认开启选项(这意味着如果不需要线程,你可以