首先必须明确的是,Qt中的线程使用是相对复杂的,并不像C#中那么随意,特别是结合串口、网络编程等,使用时稍有不慎就会出问题,然后Qt里面经常出了问题就直接崩溃(这个真是谁用谁知道),所以如果在功能上用异步方式能做到其实就没必要自己去开线程,当然如果自己写的函数比较耗时(比如不断地循环做操作之类的)就无法避免使用线程了。

  Qt中一般将耗时操作单独放在一个类中实现,在主线程中创建类对象,然后将这个对象移到子线程中,主线程与子线程间的通信主要通过信号和槽实现。另外对象是在主线程中创建的,对象中的成员都属于主线程,在主、子线程中都可以直接访问,不过如果你把对象中的成员也移到子线程中,那么在主线程就不能直接访问这个成员了。

  下面是一个使用实例。

class ThreadManager : public QObject
{
Q_OBJECT
QThread workerThread;
public:
ThreadManager();
~ThreadManager();
MyWorker * worker;
signals:
void start();
public slots:
void emitstart();
void emitstop(); void printThreadId(int count);
};
ThreadManager::ThreadManager()
{
worker = new MyWorker();
worker->moveToThread(&workerThread);
connect(this,SIGNAL(start()),worker,SLOT(Start()));
connect(worker,SIGNAL(invokeParentThreadMethod(int)),this,SLOT(printThreadId(int)));
workerThread.start();
} ThreadManager::~ThreadManager()
{
workerThread.quit();
} void ThreadManager::emitstart()
{
emit start();
} void ThreadManager::emitstop()
{
worker->stoped = true;
qDebug()<<"停止";
} void ThreadManager::printThreadId(int count)
{
//worker->stoped = true;
qDebug()<<QThread::currentThreadId()<<"\t"<<count;
}

ThreadManager 用来开启一个新的线程,然后在这个线程里面执行其他操作,下面是执行操作的类 MyWorker。

class MyWorker : public QObject
{
Q_OBJECT
public:
explicit MyWorker(QObject *parent = );
bool stoped;
signals:
void invokeParentThreadMethod(int count);
public slots:
void Start();
};
MyWorker::MyWorker(QObject *parent) :
QObject(parent)
{
stoped = false;
} void MyWorker::Start()
{
int count =;
stoped = false;
while(!stoped)
{
qDebug()<<QThread::currentThreadId()<<"\t"<<count++;
emit invokeParentThreadMethod(count);
QThread::msleep();
}
}

再看看我们在主线程中如何使用的

    QObject* win = engine.rootObjects()[];
QObject* Button_Start = win->findChild<QObject*>("Button_Start");
QObject* Button_Stop = win->findChild<QObject*>("Button_Stop"); ThreadManager* therad = new ThreadManager();
QObject::connect(Button_Start,SIGNAL(clicked()),therad,SLOT(emitstart()));
QObject::connect(Button_Stop,SIGNAL(clicked()),therad,SLOT(emitstop()));

这里只是一个很简单的线程使用示例,在串口、网络编程时往往涉及到线程同步、资源共享、线程通信等问题,比如子线程还在使用资源主线程却将资源释放了或是线程间通信时传过去的数据发生了变化等等,具体情况只有结合自己经验去分析了。

Qt Quick快速入门之线程基础的更多相关文章

  1. Qt Quick快速入门之信号、槽

    信号和槽主要用于组件之间的通信,类似于.net和java中的委托. 使用QObject::connect方法将信号与槽关联起来,然后信号的发起者发出信号,接受者中的槽函数就会执行. 比如connect ...

  2. Qt Quick快速入门之qml与C++交互

    C++中使用qml对象,直接使用findChild获取qml对象,然后调用setProperty方法设置属性,当然必须在加载qml之后才能使用,不然findChild找不到对象,用法如下. engin ...

  3. Qt Quick快速入门之qml布局

    Qml里面布局主要有两种,锚点布局.Grid布局. 锚点布局使用anchors附件属性将一个元素的边定位到另一个元素的边,从而确定元素的位置和大小.下面是示例 import QtQuick 2.3 i ...

  4. 快速入门系列--WebAPI--01基础

    ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...

  5. [转]快速入门系列--WebAPI--01基础

    本文转自:http://www.cnblogs.com/wanliwang01/p/aspnet_webapi_base01.html ASP.NET MVC和WebAPI已经是.NET Web部分的 ...

  6. [Qt Creator 快速入门] 第5章 应用程序主窗口

    对于日常见到的应用程序而言,许多都是基于主窗口的,主窗口中包含了菜单栏.工具栏.状态栏和中心区域等.这一章会详细介绍主窗口的每一个部分,还会涉及资源管理.富文本处理.拖放操作和文档打印等相关内容.重点 ...

  7. [Qt Creator 快速入门] 第2章 Qt程序编译和源码详解

    一.编写 Hello World Gui程序 Hello World程序就是让应用程序显示"Hello World"字符串.这是最简单的应用,但却包含了一个应用程序的基本要素,所以 ...

  8. C#快速入门笔记(1)——基础语法

    C#快速入门笔记(1)——基础语法 总体框架:

  9. [Qt Creator 快速入门] 第1章 Qt Creator简介

    Qt Creator 是一个跨平台的.完整的 Qt 集成开发环境,其中包括了高级C++代码编辑器.项目和生成管理工具.集成的上下文相关的帮助系统.图形化调试器.代码管理和浏览工具等.这一章先对 Qt ...

随机推荐

  1. linux源码安装nginx

    任务目标:源码安装nginx,作为web服务修改配置文件,让配置生效,验证配置 首先要去官网nginx.org下载一个tar包: tar xvf 解包 进入到解包出来的目录,对configure进行配 ...

  2. ORB_SLAM2 源码阅读 ORB_SLAM2::Initializer::ComputeF21 (OpenCV 细节)

    ORB_SLAM2 计算 F21 的代码是这样的. cv::Mat Initializer::ComputeF21(const vector<cv::Point2f> &vP1,c ...

  3. Dream------scala--开发环境搭建

    scala简介: scala是一门函数式编程和面向对象编程结合的语言 函数式编程非常擅长数值计算而面向对象特别适合于大型工程或项目的组织以及团队的分工合作 我们借助scala可以非常优雅的构造出各种规 ...

  4. layui结合SpringMVC上传文件以及携带额外的参数上传文件

    今天在使用layui的过程中,遇到了使用其上传文件的模块.自己感觉文件上传还是bootstrapfileinput插件比较好用一些,灵活方便,bootstrapfileinput使用方法参考:http ...

  5. 【算法学习】【洛谷】cdq分治 & P3810 三维偏序

    cdq是何许人也?请参看这篇:https://wenku.baidu.com/view/3b913556fd0a79563d1e7245.html. 在这篇论文中,cdq提出了对修改/询问型问题(Mo ...

  6. Logback的继承体系

    今天碰到一个问题,发现控制台日志输出两遍,搜索得知,这个是由于logback继承体系导致的. logback不仅会继承level,也会继承appender,需要注意的是: <root> & ...

  7. vue项目中遇到的一些问题

    或访问:https://github.com/littleHiuman/experiences-about-vue  欢迎补充! vuex 状态 vue-cli 命令行 vue vue vue-rou ...

  8. Angular CLI 命令行工具

    工欲善其事必先利其器.好的工具让开发更加简单便捷. 1.全局安装angular cli npm install -g @angular/cli 2.安装完成后就可以使用angular-cli命令行工具 ...

  9. linux创建新用户

    服务器只用root账号会有风险,最好是每个人使用一个账号. 1. 添加用户名 adduser linuxidc 2. 给这个用户名设置新密码 passwd linuxidc 3.授权 个人用户的权限只 ...

  10. HDU 4763 Theme Section(KMP+枚举公共前后缀)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4763 题目大意: 给你一个字符串s,存在一个子串E同时出现在前缀.中间.后缀,即EAEBE这种模式,A ...