QT 多线程处理和使用
2018-03-31 14:33
211 查看
思路:
![](https://img-blog.csdn.net/20180318153943656?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L3FxXzMzMTU0MzQz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
项目实例:
![](https://img-blog.csdn.net/20180318154023630?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L3FxXzMzMTU0MzQz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![](https://img-blog.csdn.net/20180318154134419?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L3FxXzMzMTU0MzQz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![](https://img-blog.csdn.net/20180318154109117?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L3FxXzMzMTU0MzQz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
源码交流:mythread.h[html] view plain copy#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QObject>
#include <QThread>
#include <QDebug>
class MyThread : public QObject
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = 0);
void MyTimeout();//线程处理函数
void setFlage(bool flag = true); //设置标志位,何时关闭子线程
signals:
void MySignal();
public slots:
protected:
bool isStop;
};
#endif // MYTHREAD_H
mythread.cpp[html] view plain copy#include "mythread.h"
MyThread::MyThread(QObject *parent) : QObject(parent)
{
isStop = false;
}
//线程处理函数
void MyThread::MyTimeout()
{
while(false == isStop)
{
QThread::sleep(1);
emit MySignal(); //每隔一秒发射一次信号
qDebug()<<"子线程ID:"<<QThread::currentThread(); //显示当前线程的数值
if(true == isStop)
{
break;
}
}
}
void MyThread::setFlage(bool flag)
{
isStop = flag;
}
mywidget.h[html] view plain copy#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include "mythread.h"
#include <QThread>
#include <QDebug>
namespace Ui {
class MyWidget;
}
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
~MyWidget();
void dealMySignal();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void dealClose();
signals:
void startMyThread(); //启动子线程的信号
private:
Ui::MyWidget *ui;
MyThread *myThread;
QThread *thread;
};
#endif // MYWIDGET_H
mywidget.cpp
[html] view plain copy#include "mywidget.h"
#include "ui_mywidget.h"
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
//创建线程对象,不能够指定父对象
myThread = new MyThread;
//创建子线程对象
thread = new QThread(this);
//把子线程(对象)添加到自定义的线程类(对象)中
myThread->moveToThread(thread);
connect(myThread, &MyThread::MySignal, this, &MyWidget::dealMySignal);
qDebug()<<"主线程ID:"<<QThread::currentThread(); //显示当前线程的数值
connect(this, &MyWidget::startMyThread, myThread, &MyThread::MyTimeout);
connect(this, &MyWidget::destroyed, this, &MyWidget::dealClose);
//线程处理函数内部,不允许操作图形界面
//connect()第五个参数的作用, 连接方式: 默认, 队列,直接
//多线程才有含义
//默认的时候
//如果是多线程,默认使用队列
//如果是单线程,默认使用直接方式
//队列:槽函数所在线程和接受(信号)者一样
//直接:槽函数所在线程和发送(信号)者一样
}
MyWidget::~MyWidget()
{
delete ui;
}
//处理收到的线程的信号, 作出相应动作
void MyWidget::dealMySignal()
{
static int i = 0;
i++;
ui->lcdNumber->display(i);
}
//启动子线程
void MyWidget::on_pushButton_clicked()
{
if(thread->isRunning() == true) //这个判断个什么鬼?
{
return;
}
//启动子线程,但没有启动线程处理函数
thread->start();
myThread->setFlage(false);
//**************************************************
//不能够直接调用该线程处理函数
//不然的话,都会导致线程处理函数和主线程是在同一个线程
// myThread->MyTimeout();
//**************************************************
//只能够通过 signal - slot 来调用线程处理函数
emit startMyThread();
}
void MyWidget::on_pushButton_2_clicked()
{
if(thread->isRunning() == false)
{
return;
}
myThread->setFlage(true);
thread->quit();
thread->wait();
}
void MyWidget::dealClose()
{
on_pushButton_2_clicked();
delete myThread; //因为没有指定父对象,所以不释放会溢出,但是没有设么大问题
}
项目实例:
源码交流:mythread.h[html] view plain copy#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QObject>
#include <QThread>
#include <QDebug>
class MyThread : public QObject
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = 0);
void MyTimeout();//线程处理函数
void setFlage(bool flag = true); //设置标志位,何时关闭子线程
signals:
void MySignal();
public slots:
protected:
bool isStop;
};
#endif // MYTHREAD_H
mythread.cpp[html] view plain copy#include "mythread.h"
MyThread::MyThread(QObject *parent) : QObject(parent)
{
isStop = false;
}
//线程处理函数
void MyThread::MyTimeout()
{
while(false == isStop)
{
QThread::sleep(1);
emit MySignal(); //每隔一秒发射一次信号
qDebug()<<"子线程ID:"<<QThread::currentThread(); //显示当前线程的数值
if(true == isStop)
{
break;
}
}
}
void MyThread::setFlage(bool flag)
{
isStop = flag;
}
mywidget.h[html] view plain copy#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include "mythread.h"
#include <QThread>
#include <QDebug>
namespace Ui {
class MyWidget;
}
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
~MyWidget();
void dealMySignal();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void dealClose();
signals:
void startMyThread(); //启动子线程的信号
private:
Ui::MyWidget *ui;
MyThread *myThread;
QThread *thread;
};
#endif // MYWIDGET_H
mywidget.cpp
[html] view plain copy#include "mywidget.h"
#include "ui_mywidget.h"
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
//创建线程对象,不能够指定父对象
myThread = new MyThread;
//创建子线程对象
thread = new QThread(this);
//把子线程(对象)添加到自定义的线程类(对象)中
myThread->moveToThread(thread);
connect(myThread, &MyThread::MySignal, this, &MyWidget::dealMySignal);
qDebug()<<"主线程ID:"<<QThread::currentThread(); //显示当前线程的数值
connect(this, &MyWidget::startMyThread, myThread, &MyThread::MyTimeout);
connect(this, &MyWidget::destroyed, this, &MyWidget::dealClose);
//线程处理函数内部,不允许操作图形界面
//connect()第五个参数的作用, 连接方式: 默认, 队列,直接
//多线程才有含义
//默认的时候
//如果是多线程,默认使用队列
//如果是单线程,默认使用直接方式
//队列:槽函数所在线程和接受(信号)者一样
//直接:槽函数所在线程和发送(信号)者一样
}
MyWidget::~MyWidget()
{
delete ui;
}
//处理收到的线程的信号, 作出相应动作
void MyWidget::dealMySignal()
{
static int i = 0;
i++;
ui->lcdNumber->display(i);
}
//启动子线程
void MyWidget::on_pushButton_clicked()
{
if(thread->isRunning() == true) //这个判断个什么鬼?
{
return;
}
//启动子线程,但没有启动线程处理函数
thread->start();
myThread->setFlage(false);
//**************************************************
//不能够直接调用该线程处理函数
//不然的话,都会导致线程处理函数和主线程是在同一个线程
// myThread->MyTimeout();
//**************************************************
//只能够通过 signal - slot 来调用线程处理函数
emit startMyThread();
}
void MyWidget::on_pushButton_2_clicked()
{
if(thread->isRunning() == false)
{
return;
}
myThread->setFlage(true);
thread->quit();
thread->wait();
}
void MyWidget::dealClose()
{
on_pushButton_2_clicked();
delete myThread; //因为没有指定父对象,所以不释放会溢出,但是没有设么大问题
}
相关文章推荐
- Qt5:多线程处理与使用之三(Qt5的方法,再次写一个小程序熟悉下)
- Qt5.8:多线程处理与使用之一(Qt4.7之前的方法)
- Qt5:多线程处理与使用之二(Qt5的方法)
- 使用消息来处理多线程程序中的一些问题
- Java【多线程知识总结(6)】使用Runnable接口创建多线程,处理同一个资源
- Qt 使用qmake 遇到 warning LNK4042: object specified more than once; extras ignored 错误的处理办法
- Java【多线程知识总结(6)】使用Runnable接口创建多线程,处理同一个资源
- 使用OpenMP实现多线程,不仅是用在循环处理上
- linux下文件的读写操作、字符串的处理操作,多线程操作等相关函数使用说明
- WPF使用多线程更新UI界面 涉及资源访问需要使用委托处理
- C#和Qt实现的对于异常处理的一个使用策略
- Android开发(12)--多线程处理机制之Handler的使用方法
- Qt 中多线程的处理
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- 大规模数据运行时,可以考虑使用多线程处理!
- 多线程处理:何时使用同步类
- 使用等待对象的方法,实现多线程的同步处理。。
- 多线程处理:何时使用同步类
- 使用GCD处理非UI相关的异步任务 Object-C异步多线程加载网络图片
- Linux下C程序使用多线程方式处理实例