注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

我的Qt学习之路(4)——多线程间的通信  

2013-03-15 14:17:11|  分类: QT开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
我的Qt学习之路(4)——多线程间的通信
多线程通信的方式有很多,但常用的不外乎那几种,但在QT中,还真是生疏,只是知道用信号和槽。一般的例子如下:
mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>

class MyThread : public QThread
{
Q_OBJECT

public:
MyThread();
~MyThread();


protected:
void run();
signals:
void changeText(QString str);
};

#endif // MYTHREAD_H

widgett.h
#ifndef WIDGETT_H
#define WIDGETT_H

#include <QtGui/QMainWindow>
#include "ui_widgett.h"

class WidgetT : public QMainWindow
{
Q_OBJECT

public:
WidgetT(QWidget *parent = 0, Qt::WFlags flags = 0);
~WidgetT();

private:
Ui::WidgetTClass ui;
private slots:
void labelSetText(QString qstr);
};

#endif // WIDGETT_H

mythread.cpp
#include "mythread.h"

MyThread::MyThread()
: QThread()
{

}

MyThread::~MyThread()
{

}

void MyThread::run(){

static int i=0;
while(true)
{
++i;
QString strnum = QString::number(i);
emit changeText(strnum);

QThread::sleep(1);
}
}

widgett.cpp
#include "widgett.h"
#include "mythread.h"
Q_DECLARE_METATYPE(QString);
WidgetT::WidgetT(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
MyThread *mythread = new MyThread;
int id=qRegisterMetaType<QString>("");
connect(mythread,SIGNAL(changeText(QString)),this,SLOT(labelSetText(QString)),Qt::QueuedConnection);
mythread->start();
}

WidgetT::~WidgetT()
{

}

void WidgetT::labelSetText(QString qstr){
ui.label->setText(qstr);
}
但是目前有一个例子,需求是这样的,启动一个线程,在线程里进行一些耗时的操作,但每一步操作都要回显到UI上,同时,初始启动时还要使用UI上设定的参数。OK,最初的想法就是像上面一样,但此时公司的线程框架里不是QThread,那么就无法connect信号和槽了。同事QT不错,写出了类似下面的例子:
UI类中:
sigals:
  SendData(QString s);

slots:
  DispalyData(QString s);

public void emitMsg();
UI实现类中:
void UIXXX::emitMsg(QString s)
{
 emit SendData(s);
}

线程函数中:
每动作一次:
     this->emitMsg();
此处需要对上面这行代码进行说明一下,同事封装了C++01X中的异步机制,在这种情况下,可以直接使用LMBDA表达式函数外面的仅有及可访问域内的变量及相应的函数。

还是对信号和槽的机制理解的不深刻,此时再回头与WIN下的消息机制一对比,发现何其相似,发送消息,不就是你定义好接收消息的函数,然后你可以在任何一个地方用SendMessage, PostMessage两个函数来发送消息。
纸上学来终觉浅,绝知此事要躬行。






  评论这张
 
阅读(1308)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017