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

时间: 2024-07-31 14:35:24

qt 多线程之间通讯的相关文章

多线程之间通讯

什么是多线程之间通信? 多个线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的的动作不同. 如,一个线程对资源进行写的操作,一个线程对资源进行读的操作. 例子: 共享资源类: class Res { public String userSex; public String userName; } 写操作类 class IntThrad extends Thread { private Res res; public IntThrad(Res res) { this.res = res;

并发编程之多线程之间通讯

1.重排序概念 A.cpu会对代码执行顺序实现优化,不会对有依赖关系的数据做重排序.代码的执行顺序可能会发生改变,但是执行的结果不会发生任何改变. B.as-if-serial:不管怎么去做重排序,目的是提高并行度,但是不能影响到正常的结果. C.重排序在多线程情况下遇到 2.wait()和notify() A.wait()等待:让线程等待,并释放锁资源 B.noftify()唤醒:唤醒当前对象锁池被等待线程 C.注意:一定要在synchronized下使用,并且持有的是同一把锁. D.slee

【java】-- 多线程之间实现通讯

1.多线程之间如何实现通讯 1.1.什么是多线程之间通讯? 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同. 画图演示 1.2.多线程之间通讯需求 需求:第一个线程写入(input)用户,另一个线程取读取(out)用户.实现读一个,写一个操作. 2.代码实现基本实现 2.1.共享资源源实体类 class Res {      public String userSex;      public String userName; } 输入线程资源 class IntThrad

多线程之间实现通讯

多线程之间如何实现通讯 什么是多线程之间通讯?  多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同. 多线程之间通讯需求 需求:第一个线程写入(input)用户,另一个线程取读取(out)用户.实现读一个,写一个操作. 代码实现基本实现 共享资源源实体类 class Res { public String userSex; public String userName; } 输入线程资源 class IntThrad extends Thread { private Res

java 中多线程之间的通讯之生产者和消费者 (多个线程之间的通讯)

在真实开发 中关于多线程的通讯的问题用到下边的例子是比较多的 不同的地方时if 和while 的区别 如果只是两个线程之间的通讯,使用if是没有问题的. 但是在多个线程之间就会有问题 1 /* 2 * 这个例子用来解释多个生产者和多个消费者的情况 3 */ 4 5 /* 6 * 资源库 7 */ 8 class Resource 9 { 10 private String name; 11 private int count = 1; 12 private boolean flag = fals

C# 多线程控制 通讯 和切换

一.多线程的概念  Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数.多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程

QT开发(三十四)——QT多线程编程

QT开发(三十四)--QT多线程编程 一.QT多线程简介 QT通过三种形式提供了对线程的支持,分别是平台无关的线程类.线程安全的事件投递.跨线程的信号-槽连接. QT中线程类包含如下: QThread 提供了开始一个新线程的方法    QThreadStorage 提供逐线程数据存储    QMutex 提供相互排斥的锁,或互斥量    QMutexLocker 是一个辅助类,自动对 QMutex 加锁与解锁    QReadWriterLock 提供了一个可以同时读操作的锁    QReadL

C# 多线程控制 通讯

一.多线程的概念  Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数.多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程

QT多线程笔记

1.QT多线程涉及到主线程和子线程之间交互大量数据的时候,使用QThread并不方便,因为run()函数本身不能接受任何参数,因此只能通过信号和槽的交互来获取数据,如果只是单方面简单交互数据还过得去,如果涉及多次主.子线程之间的交互的时候,这种方式是很不方便的,这里采取另外一种方式,建一个继承自QObject的类,进行movetoThread()操作: class FileThread :public QObject { Q_OBJECT public: QString m_path; QFil