Qt子线程的“信号队列”(转载)

本文探讨了Qt子线程中信号队列的问题,分析了两种子线程工作方式的优缺点:一是进入事件循环避免信号丢失,但槽函数在子线程对象所在线程执行;二是无事件循环直接处理工作,可能丢失信号。解决方案是使用一个队列线程作为中介,确保信号不会丢失,同时保持线程间工作分离。
摘要由CSDN通过智能技术生成
对Qt的多线程编程没有深究,只了解了基本的用法,够我用就行了。

之所以写这篇文章是因为前几天遇到一个疑问:如果其他几个线程同时向一个线程发signal,而这个线程没有自己的事件循环,那是不是会丢失signal呢?

下面是我总结的两种子线程的工作方式

1.让子线程进入事件循环,这样的话多余的signal就会进入该线程的事件队列,不会丢失。问题是这时子线程的槽函数都是在该子线程对象所在的线程(很可能是主线程)执行,这样似乎失去了多线程的意义。
void run()
{
    exec();
}

void slot1();  //处理工作
void slot2();  //处理工作
...



2.子线程没有事件循环,直接在run里处理工作,主线程可通过信号连接到该子线程的槽来控制flag,从而控制子线程的暂停和继续。但是,如果还有另外几个线程不时地向通过slot2()给somarg赋值的话,即使给slot2()加了锁保证了不会被同时赋值,但那些同时进入的赋值信号没有队列可进,这样会不会就丢失了呢
void run()
{
    while(1)
    {
    while(flag)
    {
       
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值