qt 多线程之间通讯
问题描述:界面线程MainApp为主线程,工作线程MyThread为一子线程,从工作线程向主线程传递字符串用于在主线程中显示。
Qt的信号与槽机制可以将任何继承自QObject类的对象捆绑在一起,使不同对象之间能够相互通信。
成功的实现
工作线程:
mythread.h
C++
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
class MyThread : public QThread
{
Q_OBJECT
public:
MyThread();
signals:
//--------------------------------------------用于向主线程传递字符串
void MsgSignal(const QString& tep);
protected:
//--------------------------------------------run中的内容才是子线程中执行的内容
void run();
};
#endif // MYTHREAD_H
|
mythread.cpp
C++
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include "mythread.h"
#include <windows.h>
MyThread::MyThread()
{
}
void MyThread::run()
{
Sleep(3000);
QString tep("mou-mou-mou");
emit MsgSignal(tep);
//---------------------------------各个Sleep的位置可放置具体的工作
Sleep(3000);
}
|
主线程:
mainapp.h
C++
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#ifndef MAINAPP_H
#define MAINAPP_H
#include <QWidget>
#include "mythread.h"
class MainApp : public QWidget
{
Q_OBJECT
public:
explicit MainApp(QWidget *parent = 0);
signals:
private slots:
//------------------------------------------接受子线程传递字符串用于显示
void OnMsgSignal(const QString& tep2);
private:
MyThread* m_thread;
};
#endif // MAINAPP_H
|
mainapp.cpp
C++
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include "mainapp.h"
#include <QDebug>
MainApp::MainApp(QWidget *parent) : QWidget(parent)
{
m_thread = new MyThread;
connect(m_thread, SIGNAL(MsgSignal(const QString&)), this, SLOT(OnMsgSignal(const QString&)));
m_thread->start();
}
void MainApp::OnMsgSignal(const QString &tep2)
{
// 使用子线程传递来的tep2
qDebug() << tep2;
}
|
实现过程中遇到过的问题:
1.connect函数的第五个参数代表信号与槽的连接模式,线程间的信号与槽不能使用Qt::DirectConnection直接连接方式,因为它要求在发信号的线程内执行槽函数。而Qt::QueuedConnection队列方式将信号转换成事件发送到槽函数所在线程的消息队列中让槽函数所在线程来处理,可以实现线程安全的线程间的通信。这样的时效性也不差,上面的实现中,会在子线程“run()”函数中的第二个Sleep之前执行主线程的“OnMsgSignal(constQString& tep2)”。
于是在调试的时候子线程的“emit MsgSignal(QString& tep);”的下一步并不会立即跳转到主线程的“OnMsgSignal(const QString& tep2)”,我开始还以为信号中途丢了没送达呢。。而强制使用Qt::DirectConnection模式却怎么也摆脱不了错误。
2.线程间用“信号与槽”传递引用参数的话,一定要加const,因为const文字常量存在常量区中,生命周期与程序一样的长。这样可以避免slot调用的时候参数的运行期已过而使引用无效。
我开始没注意到需要加const,程序运行时并没有报告错误,但是主线程毫无使用子线程传递来的字符串的迹象,这让我更加错误地以为子线程发送的信号丢了。。
http://love.junzimu.com/archives/2445
qt 多线程之间通讯的更多相关文章
- 多线程之间通讯JDK1.5-Lock
synchronized:代码开始上锁,代码结束时释放锁:内置锁.自动化的.效率低.扩展性不高(不够灵活): JDK1.5并发包Lock锁 --保证线程安全问题,属于手动挡,手动开始上锁,手动释放锁, ...
- 【java】-- 多线程之间实现通讯
1.多线程之间如何实现通讯 1.1.什么是多线程之间通讯? 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同. 画图演示 1.2.多线程之间通讯需求 需求:第一个线程写入(inpu ...
- JAVA多线程-实现通讯
一.多线程之间如何实现通讯 1)什么是多线程之间通讯 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同. 2)如何通讯 wait().notify().notifyAll()是三个 ...
- java 中多线程之间的通讯之生产者和消费者 (多个线程之间的通讯)
在真实开发 中关于多线程的通讯的问题用到下边的例子是比较多的 不同的地方时if 和while 的区别 如果只是两个线程之间的通讯,使用if是没有问题的. 但是在多个线程之间就会有问题 /* * 这个例 ...
- python处理多线程之间事件通讯方法
一.什么是事件 每执行一个事情,肯定有该事情的执行后状态,那事件就是该事情发生的信号 在程序中,多线程之间需要通讯,而事件就是方便线程之间的通讯 案例: 1.服务器启动需要5秒 2.客服端启动后去链接 ...
- QT多线程笔记
1.QT多线程涉及到主线程和子线程之间交互大量数据的时候,使用QThread并不方便,因为run()函数本身不能接受任何参数,因此只能通过信号和槽的交互来获取数据,如果只是单方面简单交互数据还过得去, ...
- Android--Otto事件总线 -- 组件之间通讯框架使用 --模式解析
前言:Otto事件总线 -- 组件之间通讯框架 对于之前的情况activity之间或者fragment之间等跳转传值一般都是用bundle.intent等,从activityA --- activit ...
- C# 多线程控制 通讯
一.多线程的概念 Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一 ...
- C# 多线程控制 通讯 和切换
一.多线程的概念 Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一 ...
随机推荐
- Windows下连接php5.3+sql server2008
php连接sql server真是一件闹心的事, 折腾了许久,今天有了点起色,还是不错的. mssql extension is not available anymore on Windows wi ...
- java package 重命名时注意事项
如果要对包重命名时,需要关注以下方面: 1. java关联类里的重命名(这个一般通过开发工具会自动修正,如eclipse) 2.配置文件,如原先配置为com.abc,现在更名为com.abc123,这 ...
- impala编译
impala编译 编译系统centos 5.10 说明:版本1.3.x----2.1.x都能编译 一.预装库 1.gcc安装 yum install gcc44 yum install gcc44-c ...
- Hibernate(五)——面向对象查询语言和锁
Hibernate做了数据库中表和我们实体类的映射,使我们不必再编写sql语言了.但是有时候查询的特殊性,还是需要我们手动来写查询语句呢,Hibernate框架为了解决这个问题给我们提供了HQL(Hi ...
- mysql-error --(ERROR 1135 (HY000): Can't create a new thread (errno 11); if you are not out)
报错信息: ERROR 1135 (HY000): Can't create a new thread (errno 11); if you are not out 解决办法: # 查看限制情况 [r ...
- [置顶] Application,Session,Cookie之Application对象
概述 Application为全局作用域,且只有一个Application对象,它可以存储和访问任意页面的变量(数据存储类型都是Object,也就是任意类型),同时也被多页面使用(也为引用). App ...
- pthread_t结构的定义
linux下是这样定义的: 在linux的实现中pthread_t被定义为 "unsigned long int",參考这里 Windows下这样定义: /* * Generic ...
- 8. 冒泡法排序和快速排序(基于openCV)
一.前言 主要讲述冒泡法排序和快速排序的基本流程,并给出代码实现,亲测可用. 二.冒泡法排序 冒泡法排序主要是将相邻两个值比较,把小的向前冒泡,大的向后沉淀,时间复杂度为O(n2).主要思想如下: 分 ...
- 系统简单的UIImagePickerController
1.从系统相册中读取 /* 判断选择的读取类型是否支持 UIImagePickerControllerSourceTypePhotoLibrary,普通相册 UIImagePickerControll ...
- ORA-00937:不是单组分组函数_Oracle
Demo: SELECT USER_ID, USER_NAME, USER_SEX, MAX(USER_AGE), SUM(USER_MONEY) AS USER_MONEY USER_TEL, US ...