Qt QThread 多线程使用
一、继承QThread 使用方法
1.创建个继承QThread的类。
#ifndef MYTHREAD_H
#define MYTHREAD_H #include <QObject>
#include<QThread>
#include<QtCore>
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = );
~MyThread(); public:
void run();
bool stop=false;
signals:
void NumberChanged(int number); }; #endif // MYTHREAD_H
#include "mythread.h" MyThread::MyThread(QObject *parent)
{ } MyThread::~MyThread()
{ } void MyThread::run()
{
for(int i=;i<;i++)
{
QMutex mutex;
mutex.lock();
if(this->stop)
{
break;
}
else
{
mutex.unlock();
} emit NumberChanged(i);
this->msleep(); } }
2.调用代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow>
#include<mythread.h>
namespace Ui {
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = );
~MainWindow();
public:
MyThread *mThread; private:
Ui::MainWindow *ui; private slots:
void onNumberChanged(int number);
void on_btnStart_clicked();
void on_btnStop_clicked();
}; #endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); mThread=new MyThread(this);
QObject::connect(mThread,SIGNAL(NumberChanged(int)),this,SLOT(onNumberChanged(int))); } MainWindow::~MainWindow()
{
delete ui;
} void MainWindow::onNumberChanged(int number)
{ ui->lblNumber->setText(QString::number(number));
} void MainWindow::on_btnStart_clicked()
{
mThread->start();
mThread->stop=false; } void MainWindow::on_btnStop_clicked()
{
//mThread->stop=true; mThread->stop=true; }
二、 moveToThread 使用方法
#ifndef MYOBJECT_H
#define MYOBJECT_H #include <QObject>
#include<QDebug>
#include<QThread>
#include<QLabel> class MyObject : public QObject
{
Q_OBJECT
public:
explicit MyObject(QObject *parent = );
~MyObject(); signals: public slots:
void Thread1();
void Thread2(QLabel *lbl);
void Thread3(); }; #endif // MYOBJECT_H
#include "myobject.h" MyObject::MyObject(QObject *parent) : QObject(parent)
{ } MyObject::~MyObject()
{ } void MyObject::Thread1()
{ qDebug()<<QThread::currentThreadId();
}
void MyObject::Thread2(QLabel *lbl)
{ for(int i=;i<;i++)
{}
lbl->setText("aaaaa");
qDebug()<<QThread::currentThreadId();
}
void MyObject::Thread3()
{
qDebug()<<QThread::currentThreadId();
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow>
#include<myobject.h> namespace Ui {
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = );
~MainWindow(); private slots:
void on_pushButton_clicked(); void on_pushButton_2_clicked(); void on_pushButton_3_clicked(); void on_pushButton_4_clicked(); private:
Ui::MainWindow *ui; public:
MyObject *myobj; }; #endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); myobj=new MyObject;
QThread *mythread=new QThread;
myobj->moveToThread(mythread);
mythread->start(); connect(mythread,SIGNAL(started()),myobj,SLOT(Thread1())); } MainWindow::~MainWindow()
{
delete ui;
} void MainWindow::on_pushButton_clicked()
{
myobj->Thread1(); } void MainWindow::on_pushButton_2_clicked()
{ myobj->Thread2(ui->label);
} void MainWindow::on_pushButton_3_clicked()
{
myobj->Thread3(); } void MainWindow::on_pushButton_4_clicked()
{
qDebug()<<QThread::currentThreadId();
}
Qt QThread 多线程使用的更多相关文章
- QThread多线程编程经典案例分析
传统的图形界面应用程序都只有一个线程执行,并且一次执行一个操作.如果用户调用一个比较耗时的操作,就会冻结界面响应. 一个解决方法是按照事件处理的思路: 调用 Void QApplication::pr ...
- QThread多线程编程经典案例分析(三种方法,解释了为什么使用moveToThread的根本原因,即为了避免调用QThread::exec() )
传统的图形界面应用程序都只有一个线程执行,并且一次执行一个操作.如果用户调用一个比较耗时的操作,就会冻结界面响应. 一个解决方法是按照事件处理的思路: 调用 Void QApplication::pr ...
- Qt搭建多线程Server
起因是MySQL在Android上没有驱动.也就是说,移动端想要访问远程数据库,必须通过一台(或多台)PC进行中转. 中转PC作为Server,接受来自移动端Socket访问数据库的要求,Server ...
- qt中多线程用法总结
1.多线程的理解 在操作系统中线程和进程划分. 操作系统可以同时执行多个任务,每个任务就是进程:进程可以同时执行多个任务,每个任务就是线程. 线程之间相互独立,抢占式执行.对于单核CPU来说同一时刻只 ...
- 基于QT的多线程server
// thread.cpp #include "thread.h" Thread::Thread(int socketDescriptor, QObject *parent) : ...
- Pyqt Smtplib实现Qthread多线程发送邮件
一. smtplib 的介绍 smtplib.SMTP([host[, port[, local_hostname[, timeout]]]]) SMTP类构造函数,表示与SMTP服务器之间的连接 ...
- Qt之多线程
源地址:http://blog.csdn.net/liuhongwei123888/article/details/6072320 Qt 是一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造 ...
- Qt在多线程中使用信号槽的示例
之前对线程理解得不深入,所以对Qt的线程机制没有搞清楚,今天写一篇文章总结一下,如有错误,欢迎指出. 首先需要理解线程是什么,线程在代码中的表现其实就是一个函数,只不过这个函数和主线程的函数同时运行, ...
- Qt中多线程问题
1. 出现的问题 编写视频解码器程序时,把解码那部分单独置于一个线程中进行处理,后来实际应用到项目中发现内存泄漏很严重 问题就出现在多线程中,每次视频解码器程序关闭时首先必须释放其所涉及的堆空间, 由 ...
随机推荐
- oracle 中的dual表简介与用法
Dual表是每个数据库创建时默认生成的,该表仅有一列一行. 1)分析dual表执行,如下:
- jquery 获取datagrid行数
var data = $('#dg').datagrid('getData'); alert('总数据量:' + data.total)//注意你的数据源一定要定义了total,要不会为undefin ...
- apache2 多站点虚拟主机配置
<VirtualHost *:80> ServerAdmin webmaster@dummy-host.example.com DocumentRoot /var/www/ ServerN ...
- myeclipse的项目导入到eclipse下,com.sun.org.apache.commons.beanutils.BeanUtils不能导入
com.sun.org.apache.commons.beanutils.BeanUtils这个包不能引入了怎么办自己下了个org.apache.commons的jar包了之后,改成import or ...
- mybatis 添加事物后 无法获取自增主键的问题
检查代码后没发现mapper文件设置自增主键返回的问题,后来检查到,关闭事务后,执行完是可以获取返回的主键的, 我在mysql的客户端里关闭自动提交,发现使用select last_insert_id ...
- MSP430G2333下位机乘法运算需要注意的一个问题
背景: 最近负责为主板管理电源的电源管理模块编写软体,使用的MCU为MSP430G2333.功能上很简单,即通过板子上的硬件拨码设定,或者通过IIC与主板通信,由主板的BIOS决定开机及关机的延时供电 ...
- LUXURY 7
A.Little Pony and Expected Maximum Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:% ...
- Android三种消息提示
Android消息提示有三种方式: 1 使用Toast显示消息提示框 Toast类用于在屏幕中显示一个提示信息框,该消息提示框没有任何控制按钮,并且不会获得焦点,经过一定时间后自动消失.通常用于显示 ...
- 在同一个页面使用多个不同的jQuery版本,让它们并存而不冲突
- jQuery自诞生以来,版本越来越多,而且jQuery官网的新版本还在不断的更新和发布中,现已经达到了1.6.4版本,但是我们在以前的项目中就已经使用了旧版本的jQuery,比如已经出现的:1.3 ...
- C语言中free函数是如何确定要释放多少内存空间的
本文链接:http://www.cnblogs.com/xxNote/p/4009359.html 今天看书的时候看到free函数释放动态申请的内存时只需要把内存块的首地址传过去就行了,显然仅仅依靠首 ...