qt 线程间通信的现象描述

在Qt中,子线程不能直接操作UI,应使用信号槽进行线程间通信。线程A接收网口数据并发送信号至线程B,线程B的槽函数接收数据,记录接收字节数。槽函数运行在线程A,而run函数运行在B的线程。根据Qt文档,线程间的信号槽默认采用队列连接,确保安全。
摘要由CSDN通过智能技术生成

Qt创建的子线程中是不能对UI对象进行任何操作的,即QWidget及其派生类对象,这个是我掉的第一个坑。可能是由于考虑到安全性的问题,所以Qt中子线程不能执行任何关于界面的处理,包括消息框的弹出。正确的操作应该是通过信号槽,将一些参数传递给主线程,让主线程去处理。

线程A描述:

线程A负责接收网口的数据,每接收一次数据就发送信号至B线程。

线程B描述:

线程B负责接收A的网口数据并进行处理,B中的槽函数用于接收A的网口数据,B的run()函数重载用于处理A的网口数据;
线程B中槽函数负责接收线程A的数据,线程B中有一个接收计数,用于记录接收的字节数,线程B是重载run函数实现,负责处理接收的网口数据。

现象描述

线程b的槽函数的线程ID为线程A的线程ID,线程B的run函数中的线程ID是B的线程ID;

且看文档怎么说

  • 自动连接(AutoConnection),默认的连接方式。如果信号与槽,也就是发送者与接受者在同一线程,等同于直接连接;如果发送者与接受者处在不同线程,等同于队列连接。

  • 直接连接(DirectConnection)。当信号发射时,槽函数立即直接调用。无论槽函数所属对象在哪个线程,槽函数总在发送者所在线程执行。

  • 队列连接(QueuedConnection)。当控制权回到接受者所在线程的事件循环时,槽函数被调用。这时候需要将信号的参数塞到信号队列里。槽函数在接受者所在线程执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-西门吹雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值