Qt Quick快速入门之线程基础
首先必须明确的是,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快速入门之线程基础的更多相关文章
- Qt Quick快速入门之信号、槽
信号和槽主要用于组件之间的通信,类似于.net和java中的委托. 使用QObject::connect方法将信号与槽关联起来,然后信号的发起者发出信号,接受者中的槽函数就会执行. 比如connect ...
- Qt Quick快速入门之qml与C++交互
C++中使用qml对象,直接使用findChild获取qml对象,然后调用setProperty方法设置属性,当然必须在加载qml之后才能使用,不然findChild找不到对象,用法如下. engin ...
- Qt Quick快速入门之qml布局
Qml里面布局主要有两种,锚点布局.Grid布局. 锚点布局使用anchors附件属性将一个元素的边定位到另一个元素的边,从而确定元素的位置和大小.下面是示例 import QtQuick 2.3 i ...
- 快速入门系列--WebAPI--01基础
ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...
- [转]快速入门系列--WebAPI--01基础
本文转自:http://www.cnblogs.com/wanliwang01/p/aspnet_webapi_base01.html ASP.NET MVC和WebAPI已经是.NET Web部分的 ...
- [Qt Creator 快速入门] 第5章 应用程序主窗口
对于日常见到的应用程序而言,许多都是基于主窗口的,主窗口中包含了菜单栏.工具栏.状态栏和中心区域等.这一章会详细介绍主窗口的每一个部分,还会涉及资源管理.富文本处理.拖放操作和文档打印等相关内容.重点 ...
- [Qt Creator 快速入门] 第2章 Qt程序编译和源码详解
一.编写 Hello World Gui程序 Hello World程序就是让应用程序显示"Hello World"字符串.这是最简单的应用,但却包含了一个应用程序的基本要素,所以 ...
- C#快速入门笔记(1)——基础语法
C#快速入门笔记(1)——基础语法 总体框架:
- [Qt Creator 快速入门] 第1章 Qt Creator简介
Qt Creator 是一个跨平台的.完整的 Qt 集成开发环境,其中包括了高级C++代码编辑器.项目和生成管理工具.集成的上下文相关的帮助系统.图形化调试器.代码管理和浏览工具等.这一章先对 Qt ...
随机推荐
- 工具推荐:ATSCAN,功能强大的Perl脚本扫描器
工具推荐:ATSCAN,功能强大的Perl脚本扫描器 使用perl语言编写的开源的扫描器,功能丰富强大,除了基本的tcp和udp端口扫描之外,还可以搜索wordpress.joomla等网站并进行口令 ...
- python 面试题2
问题一:以下的代码的输出将是什么? 说出你的答案并解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Par ...
- Spring4笔记5--基于注解的DI(依赖注入)
基于注解的DI(依赖注入): 对于 DI 使用注解,将不再需要在 Spring 配置文件中声明 Bean 实例.只需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解. < ...
- gpio口、内核定时器使用
/*申请gpio*/ int gpio_request(unsigned gpio, const char *label); /*设置gpio为输入状态,即设置如(GPH0CON)*/ int gpi ...
- WPF中ListBox的绑定
WPF中列表式控件派生自ItemsControl类,继承了ItemsSource属性.ItemsSource属性可以接收一个IEnumerable接口派生类的实例作为自己的值(所有可被迭代遍历的集合都 ...
- CAS和AQS
一.CAS CAS(Compare And Swap),即比较并交换.是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V).预期原值(A)和新值(B).如果内 ...
- jQuery简单介绍
一.jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行Ajax交 ...
- mac上安装完成node,就升级好了npm,之后的设置
1.打开终端输入: npm config list 找到npmrc globalconfig /usr/local/etc/npmrc 2.打开npmrc sudo vim /usr/local/et ...
- vue全面介绍--全家桶、项目实例
简介 “简单却不失优雅,小巧而不乏大匠”. 2016年最火的前端框架当属Vue.js了,很多使用过vue的程序员这样评价它,“vue.js兼具angular.js和react.js的优点,并剔除了它们 ...
- Windows 10安装uWSGI:不可行、失败了
Windows 10家庭中文版,Python 3.6.4,uwsgi-2.0.17.tar.gz,压缩工具-7-zip 提示:请不要和我一样尝试,浪费时间,去Linux上玩吧! 几个小时的安装经历 昨 ...