关闭

关于跨线程操作的心得

标签: 线程通信用户体验qt开发
112人阅读 评论(0) 收藏 举报
分类:

背景:创建线程是为了把任务量大的事情交给线程去做,防止因为主线程(GUI线程)执行逻辑代码产生卡顿造成用户体验不好的现象。

这样子就会涉及主线程和子线程的通信问题。

子线程包括了逻辑子线程和GUI子线程,一般来说因为GUI子线程有自己的触发事件,跟主线程交互的情况比较少,所以就不讨论了,这里就单单说下逻辑子线程。

一般子线程要传递数据或者调用主线程的函数,都会使用信号SIGNAL。
在子线程对象被创造出来的时候

    m_SMU = new SMUThread();    //子线程对象被创建
    connect(m_SMU,SIGNAL(sendString(QString)),this,SLOT(Auxiliary_information(QString)));//信号槽绑定子线程,捕捉sendString事件,来触发Auxiliary_information()函数

然后再

emit sendString(str);   //子线程中发射信号

这就是子线程对主线程的交互。

那么好了,主线程该如何跟子线程进行交互呢?例如我想点击主线程来触发子线程发送数据。

一开始我是直接用子线程对象来调用子线程函数

m_SMU->SendRecv(0,buf,sizeof(buf),0);//主线程直接调用m_SMU线程下的SendRecv函数

然后bingo,功能实现出来了,然后把上述代码放入botton点击事件中去,想调用几次就点击几次,然后就报错了。。

QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread

大概意思是不能够跨线程调用。。

然后我就在想,当初是通过信号来触发主线程函数,反过来可不可以呢?

当然可以,但是你要知道怎么写。

主线程里面创建对象时

m_SMU = new SMUThread(this); //把主线程的指针传进去

子线程的逻辑里面写一个connect

this->connect(parent,SIGNAL(sendString(QString)),this,SLOT(test()));//parent 是 主线程指针,用于监听主线程的信号 来触发test()函数。

然后系统又报错了。。。
QObject::moveToThread: Cannot move objects with a parent

意思是说,调用moveToThread必须要

m_SMU = new SMUThread();  //不能传入任何东西  指针必须要为0

难道主线程调用子线程真就这么难?

还有一个办法,在主线程里写一个connect

connect(ui->pushButton_4,SIGNAL(clicked(bool)),m_SMU,SLOT(test()));//获取botton点击事件来调用子线程的函数

本人刚学QT不久,如果有好的线程交互希望能留言给个方向或者关键字,谢谢大家了

0
0
查看评论

QObject 的线程关联性

全文转载自dbzhang800的Bolg,「QObject 之 Thread Affinity」               原文地址:http://blog.csdn.net/dbzhang800/article/d...
  • LynFam
  • LynFam
  • 2011-12-18 14:21
  • 4554

关于时间管理的一些心得

前言 你是否有这样的体会: 坐在电脑面前忙碌了一天,等到快下班的时候发现还有一大堆的事情没有做完,如果这种情况多次发生,我觉得你是时候对你的时间好好管理一下了。  轻重缓急 19世纪意大利经济学家帕累托提出:生活中80%的结果几乎源于20%的活动。比如:20%的客户给你带来80%的业...
  • zdp072
  • zdp072
  • 2014-04-20 15:29
  • 1580

三种青年解决“跨线程访问窗口问题”的方法

最常见的情况就是把其它线程的文字加到listbox,总结了三种写法,由繁到简 1.普通青年:声明委托,调用委托,委托里调方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
  • Mono1977
  • Mono1977
  • 2014-09-13 00:36
  • 1309

Winform 跨线程访问控件的两个方法总结

博主刚接触线程没多久,需要实现将线程中计算出的数据传递给winform的label显示出来,但是C#中禁止跨线程直接访问控件,首先想到方法一(用委托实现) : 具体拿一个案例(内部计算已省略)说明:需要实现,按button start ,线程中传递出一个string类型的数据,之后将数据传递给la...
  • feelingdu
  • feelingdu
  • 2016-05-28 15:05
  • 2267

C# 关于跨线程访问控件问题

所谓跨线程调用控件就是一个线程调用另外一个线程的控件。 常见使用情况,比如:当我们开了一个在后台监听消息的线程以后,需要将消息内容添加到主窗体的消息框内显示出来。 这时候,我们就需要使用跨线程调用控件的方法。 1.首先,声明一个委托,如://修饰符 delegate 返回类型 委托函数名...
  • linyujie0927
  • linyujie0927
  • 2017-05-14 22:31
  • 441

c#如何跨线程调用窗体控件

要从其他跨线程存取调用控件,可采用以下两种方法之一: 方法1)不进行线程安全的检查 方法2)通过委托的方式 代码如下所示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...
  • angel20082008
  • angel20082008
  • 2014-04-13 12:31
  • 2927

《C#编程之道》 之 如何跨线程调用Windows窗体控件

<br />推荐下载:《C#编程词典》体验版,免费享用最全的编程资源<br /> <br />    在开发具有线程的应用程序时,有时会通过子线程实现Windows窗体,以及控件的操作,比如:在对文件进行复制时,为了使用户可...
  • MR_abc
  • MR_abc
  • 2010-09-06 18:16
  • 4069

Winform 让跨线程访问变得更简单

前言 由于多线程可能导致对控件访问的不一致,导致出现问题。C#中默认是要线程安全的,即在访问控件时需要首先判断是否跨线程,如果是跨线程的直接访问,在运行时会抛出异常。近期在项目中碰到这个问题,首先想到的是,关闭跨线程检查,因为做的Winform没有多么复杂,图省事就直接这样做了,之后又出了一点点...
  • dyllove98
  • dyllove98
  • 2013-07-15 21:34
  • 9513

WPF跨线程调用和Dispatcher

在winform中默认不允许跨线程操作控件,但可通过设置控件属性CheckForIllegalCrossThreadCalls = false。在WPF中同样也是禁止跨线程操作控件的,会提示“调用线程无法访问此对象,因为另一个线程拥有该对象。”的错误。 正确的操作是使用Dispatcher。 ...
  • lwwl12
  • lwwl12
  • 2017-07-29 17:48
  • 271

关于html的一些心得和总结!

一. C/S架构和B/S架构 C/S: client/server  客户端服务器架构 B/S: browser/server  浏览器服务器架构 优势: C/S: 1.需要下载,安装    2.服务器和客户端都需要更新  3.开发维护成本高...
  • lfl1994
  • lfl1994
  • 2017-03-10 21:39
  • 208
    个人资料
    • 访问:3538次
    • 积分:134
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:5篇
    • 译文:0篇
    • 评论:0条
    文章分类