QT之深入理解QThread
QT之深入理解QThread
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class MyThread : public QThread{public: MyThread() { moveToThread(this); } void run();signals: void progress(int); void dataReady(QByteArray);public slots: void doWork(); void timeoutHandler();}; |
--------------------------------------------------------------------------
#-------------------------------------------------
#
# Project created by QtCreator 2014-07-18T15:41:22
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 4) {
QT += widgets serialport
} else {
include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf)
}
TARGET = Serial
TEMPLATE = app
SOURCES += main.cpp\
uiwindow.cpp \
serial.cpp
HEADERS += uiwindow.h \
serial.h
FORMS += uiwindow.ui
--------------------------------------------------------------------------
serial.h 文件内容如下:
--------------------------------------------------------------------------
#ifndef SERIAL_H
#define SERIAL_H
#include <QObject>
#include <QtSerialPort/QSerialPort>
class Serial : public QObject
{
Q_OBJECT
public:
explicit Serial(QObject *parent = 0);
~Serial(void);
QSerialPort *port;
signals:
public slots:
void readData(void);
void threadStarted(void);
void threadFinished(void);
};
#endif // SERIAL_H
--------------------------------------------------------------------------
serial.cpp 文件内容如下:
--------------------------------------------------------------------------
#include "serial.h"
#include <QMessageBox>
#include <QDebug>
#include <QThread>
Serial::Serial(QObject *parent) :
QObject(parent)
{
port = new QSerialPort();
port->setPortName("COM1");
if(!port->open(QSerialPort::ReadWrite))
{
QMessageBox WrrMsg;
WrrMsg.setInformativeText("无法打开该串口");
WrrMsg.show();
WrrMsg.exec();
}
port->setBaudRate(QSerialPort::Baud19200,QSerialPort::AllDirections); // 19200,N,8,1
port->setDataBits(QSerialPort::Data8);
port->setStopBits(QSerialPort::OneStop);
port->setParity(QSerialPort::NoParity);
port->setFlowControl(QSerialPort::NoFlowControl);
connect(port, SIGNAL(readyRead()), this, SLOT(readData()), Qt::DirectConnection); // 注意,真正执行时 port 与 Serial 在同一个线程中,因此使用 Qt::DirectConnection。
}
Serial::~Serial(void)
{
}
void Serial::readData(void)
{
qDebug()<< "Reading Data...ID is:" << QThread::currentThreadId();
port->clear(QSerialPort::AllDirections);
}
void Serial::threadStarted(void)
{
qDebug()<< "Thread has started...ID is:" << QThread::currentThreadId();
}
void Serial::threadFinished(void)
{
qDebug()<< "Closing COM port...ID is:" << QThread::currentThreadId();
if(port->isOpen())
{
port->close(); // 关闭串口。
}
}
--------------------------------------------------------------------------
uiwindow.h 文件内容如下:
--------------------------------------------------------------------------
#ifndef UIWINDOW_H
#define UIWINDOW_H
#include <QMainWindow>
#include <QThread>
#include "serial.h"
namespace Ui {
class UIWindow;
}
class UIWindow : public QMainWindow
{
Q_OBJECT
public:
explicit UIWindow(QWidget *parent = 0);
~UIWindow();
private:
Ui::UIWindow *ui;
QThread serialThread;
Serial *serial;
};
#endif // UIWINDOW_H
--------------------------------------------------------------------------
uiwindow.cpp 文件内容如下:
--------------------------------------------------------------------------
#include "uiwindow.h"
#include "ui_uiwindow.h"
#include <QDebug>
UIWindow::UIWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::UIWindow)
{
ui->setupUi(this);
qDebug()<< "UI thread ID is:" << QThread::currentThreadId();
serial = new Serial();
connect(&serialThread, SIGNAL(started()), serial, SLOT(threadStarted()), Qt::QueuedConnection); // 注意,serialThread 与 serial 并不在同一个线程中,因此使用 Qt::QueuedConnection。
connect(&serialThread, SIGNAL(finished()), serial, SLOT(threadFinished()), Qt::DirectConnection); // serialThread 的 finished() 信号是在新线程中执行的,因此此处要使用 Qt::DirectConnection。
serialThread.start(QThread::HighestPriority); // 开启线程,串口接收线程的优先级较高。
serial->moveToThread(&serialThread); // 将串口接受对象移动到新线程中。
serial->port->moveToThread(&serialThread); // 用于接收的 port 一并移入新线程中。
}
UIWindow::~UIWindow()
{
if(serialThread.isRunning())
{
serialThread.exit(); // 结束该线程。
serialThread.wait();
/*while(!serialThread.isFinished())
{
;
}*/
}
delete ui;
}
-------------------------------------------------------------------------- http://blog.csdn.net/desert187/article/details/37932999
QT之深入理解QThread的更多相关文章
- Qt Model/View理解(二)---构造model(细心研读,发现超简单,Model就是做三件事:返回行数量、列数量、data如何显示。然后把model与view联系起来即可,两个例子都是如此)good
数据是一个集合,显示也是一个集合.例如一篇<西游记>的文章,所有的文字就是数据集合,展示方式就是显示的集合,可以以书本的形式,也可以以电纸书的形式,更可以用视频的方式展现. 下面是将一个二 ...
- 【QT】子类化QThread实现多线程
<QThread源码浅析> 子类化QThread来实现多线程, QThread只有run函数是在新线程里的,其他所有函数都在QThread生成的线程里.正确启动线程的方法是调用QThrea ...
- Qt——线程类QThread
本文主要介绍Qt中线程类QThread的用法,参考(翻译+修改)了一篇文章:PyQt: Threading Basics Tutorial,虽然使用的是PyQt,但与C++中Qt的用法大同小异,不必太 ...
- 【Qt开发】QThread介绍
回顾Qt之线程(QThread),里面讲解了如何使用线程,但还有很多人留言没有看明白,那么今天我们来一起瞅瞅关于QThread管理线程的那些事儿... 一.线程管理 1.线程启动 void start ...
- 【QT】 QThread部分源码浅析
本文章挑出QThread源码中部分重点代码来说明QThread启动到结束的过程是怎么调度的.其次因为到了Qt4.4版本,Qt的多线程就有所变化,所以本章会以Qt4.0.1和Qt5.6.2版本的源码来进 ...
- 【QT】QThread源码浅析
本章会挑出QThread源码中部分重点代码来说明QThread启动到结束的过程是怎么调度的.其次因为到了Qt4.4版本,Qt的多线程就有所变化,所以本章会以Qt4.0.1和Qt5.6.2版本的源码来进 ...
- Qt经典—线程、事件与Qobject(耳目一新)
介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...
- 【转】Qt事件循环与线程 二
转自:http://blog.csdn.net/changsheng230/article/details/6153449 续上文:http://blog.csdn.net/changsheng230 ...
- Qt经典—线程、事件与Qobject
介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...
随机推荐
- js中的一元运算符
一元运算符只有一个参数,即要操作的对象或值.它们是 ECMAScript 中最简单的运算符. delete delete 运算符删除对以前定义的对象属性或方法的引用.例如: var o = new O ...
- 转: ajax跨域之JSONP
事件背景: 某个站点分为静态产品介绍页面(或由于某原因需要静态化),和一个独立的在线应用程序.静态产品页面属于www.a.com下,而在线应用程序作为一个相对独立的系统存在于app.a.com上. 在 ...
- Qt中addStretch的有趣应用
今天在使用addStretch,布局的时候,发现addStretch竟然是可以平均分配的,有意思.比如: QVBoxLayout *buttonLayout = new QVBoxLayout; bu ...
- poj 3624 Charm Bracelet(区间dp)
题目链接:http://poj.org/problem?id=3624 思路分析: 经典的0-1背包问题: 分析如下: 代码如下: #include <iostream> using na ...
- linux下磁盘分区
转自于:http://pengyl.blog.51cto.com/5591604/1193963 命令:fdisk 功能:查看磁盘使用情况和分割磁盘 使用方法: 一.在 ...
- hyper-V 装ubuntu15.04
- ThinkPHP - session 数据库存储驱动
命名格式: Session + 驱动名称 + .class.php 所有的方法要有,但不一定要实现. <?php /** * @category Extend * @package Extend ...
- c.Tom and paper
Tom and paper Description There is a piece of paper in front of Tom, its length and width are intege ...
- DTM initialization: failure during startup recovery, retry failed, check segment status (cdbtm.c:1603)
安装greenplum集群出现以下错误: 20160315:13:49:16:025696 gpinitsystem:h95:jason-[INFO]:-Checking configuration ...
- MFC工程的复制
MFC工程的复制 [1] 在VS中新建一个同类型的MFC工程. [2] 复制.rc资源文件,用记事本打开旧工程和新工程的.rc文件,将旧工程的对应部分复制到新工程的对应部分,文 ...