QT 多线程信号与槽(二)
来源:互联网 发布:软件技术优势怎么写 编辑:程序博客网 时间:2024/05/01 09:39
一个主线程,一个次线程,主线程向次线程发送信号
mythread.h
#include <QThread>
#include <QDebug>
class Mythread : public QThread
{
Q_OBJECT
public:
Mythread();
protected:
void run();
private:
public slots:
void receive_main_signal(int);
};mythread.cpp
#include "mythread.h"
#include <QDebug>
Mythread::Mythread()
{
qDebug()<<"Mythread:" <<QThread::currentThreadId();
//moveToThread(this);
}
void Mythread::run()
{
qDebug()<<"run:" <<QThread::currentThreadId();
exec();
}
void Mythread::receive_main_signal(int a)
{
qDebug()<<"from MainWindow:" <<QThread::currentThreadId();
qDebug()<<"i="<<a;
}
MainWindow.h
#include <QMainWindow>#include "mythread.h"namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{Q_OBJECTpublic:
explicit MainWindow(QWidget *parent = 0);~MainWindow();private:
Ui::MainWindow *ui;Mythread thread;signals:
void emit_signal_to_thread(int);public slots:void start_thread();};MainWindow.cppMythread: 3064174288#include "mainwindow.h"#include "ui_mainwindow.h"#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);qDebug()<<"MainWindow:" <<QThread::currentThreadId();connect(this,SIGNAL(emit_signal_to_thread(int)),&thread,SLOT(receive_main_signal(int)));//主线程给次线程发消息connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(start_thread()));}MainWindow::~MainWindow(){delete ui;}void MainWindow::start_thread(){thread.start();int i;for(i=0;i<10;i++){
emit emit_signal_to_thread(i);sleep(1);}
}打印结果:Mythread: 3063412432 MainWindow: 3063412432 from MainWindow: 3063412432 i= 0 run: 3018308496 from MainWindow: 3063412432 i= 1 from MainWindow: 3063412432 i= 2 from MainWindow: 3063412432 i= 3 from MainWindow: 3063412432 i= 4 from MainWindow: 3063412432 i= 5 from MainWindow: 3063412432 i= 6 from MainWindow: 3063412432 i= 7 from MainWindow: 3063412432 i= 8 from MainWindow: 3063412432 i= 9结论:主线程向子线程发送信号,子线程对应的槽函数实现还是在主线程中完成的。如何使子线程的槽函数在子线程中完成呢?可以将mythread.cpp中moveToThread(this)的//去掉,最后可以显示:
MainWindow: 3064174288
run: 3019070352
from MainWindow: 3019070352
i= 0
from MainWindow: 3019070352
i= 1
from MainWindow: 3019070352
i= 2
from MainWindow: 3019070352
i= 3
from MainWindow: 3019070352
i= 4
from MainWindow: 3019070352
i= 5
from MainWindow: 3019070352
i= 6
from MainWindow: 3019070352
i= 7
from MainWindow: 3019070352
i= 8
from MainWindow: 3019070352
i= 9可见子线程的槽函数在新线程中运行了,没有出现在主线程中。但这种方法是被Bradley T. Hughes所唾弃的,所以还是用大家公认为比较对的方法吧。(见下篇)
0 0
- QT 多线程信号与槽(二)
- QT 多线程信号与槽(二)
- QT 多线程信号与槽(一)
- QT 多线程信号与槽(三)
- QT 多线程信号与槽(一)
- QT 多线程信号与槽(三)
- QT中的信号-槽函数与多线程
- Qt多线程中的信号与槽
- qt 多线程 信号槽
- QT 的信号与槽机制介绍(二)
- Qt编程之自定义信号与槽(二)
- qt creator 信号与槽 代码实现 (二)
- QT学习源网址转载1---QT多线程参数传递(信号与槽)方法
- qt 信号槽(connect)失效,【多线程使用信号槽】
- Qt 信号与信号,信号与槽
- Qt多线程和信号与槽加载多张图片
- Qt实现多线程下的信号与槽通讯
- Qt信号-槽源码解析(二)
- HTML5 Canvas 实现本地压缩图片
- 设置VM虚拟机从U盘启动装系统
- 刷沐丝
- 黑马程序员 面向对象(2)
- UVALive - 4725 Airport
- QT 多线程信号与槽(二)
- Struts2结合Jfreechart实现数据报表统计
- Android之Activity标题栏和状态栏设置
- 装了win7和win8双系统之后,怎么删除win8系统
- PC与iPhone间的通信方式(草)
- 为什么HierachyViewer无法连接真机调试
- Linux系统服务 5 ---- Vsftpd匿名用户不能下载原因分析及解决
- 开发Qt Plugin 3
- Qt for Android 编译纯C工程