pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

Qt 信號(hào)(QueuedConnection 和 DirectConnection)

Qt signals (QueuedConnection and DirectConnection)(Qt 信號(hào)(QueuedConnection 和 DirectConnection))
本文介紹了Qt 信號(hào)(QueuedConnection 和 DirectConnection)的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!

問(wèn)題描述

我在處理 Qt 信號(hào)時(shí)遇到問(wèn)題.

I'm having trouble with Qt signals.

我不明白 DirectConnectionQueuedConnection 是如何工作的?

I don't understand how DirectConnection and QueuedConnection works?

如果有人能解釋何時(shí)使用其中的哪一個(gè)(示例代碼將不勝感激),我將不勝感激.

I'd be thankful if someone will explain when to use which of these (sample code would be appreciated).

推薦答案

除非您使用具有不同線程親緣關(guān)系的對(duì)象,否則您不會(huì)看到太大差異.假設(shè)您有 QObjects AB 并且它們都附加到不同的線程.A 有一個(gè)名為 somethingChanged() 的信號(hào),B 有一個(gè)名為 handleChange() 的槽.

You won't see much of a difference unless you're working with objects having different thread affinities. Let's say you have QObjects A and B and they're both attached to different threads. A has a signal called somethingChanged() and B has a slot called handleChange().

如果您使用直接連接

connect( A, SIGNAL(somethingChanged()), B, SLOT(handleChange()), Qt::DirectConnection );

方法 handleChange() 將實(shí)際運(yùn)行在 A 的線程中.基本上,就好像發(fā)出信號(hào)直接"調(diào)用插槽方法一樣.如果 B::handleChange() 不是線程安全的,這可能會(huì)導(dǎo)致一些(難以定位)錯(cuò)誤.至少,您錯(cuò)過(guò)了額外線程的好處.

the method handleChange() will actually run in the A's thread. Basically, it's as if emitting the signal calls the slot method "directly". If B::handleChange() isn't thread-safe, this can cause some (difficult to locate) bugs. At the very least, you're missing out on the benefits of the extra thread.

如果您將連接方法更改為 Qt::QueuedConnection(或者,在這種情況下,讓 Qt 決定使用哪種方法),事情會(huì)變得更有趣.假設(shè) B 的線程正在運(yùn)行一個(gè)事件循環(huán),發(fā)出信號(hào)將向 B 的事件循環(huán)發(fā)送一個(gè)事件.事件循環(huán)對(duì)事件進(jìn)行排隊(duì),并最終在控制權(quán)返回給它時(shí)調(diào)用 slot 方法(它是事件循環(huán)).這使得處理 Qt 中線程之間的通信變得非常容易(再次假設(shè)您的線程正在運(yùn)行它們自己的本地事件循環(huán)).您不必?fù)?dān)心鎖定等問(wèn)題,因?yàn)槭录h(huán)會(huì)序列化槽調(diào)用.

If you change the connection method to Qt::QueuedConnection (or, in this case, let Qt decide which method to use), things get more interesting. Assuming B's thread is running an event loop, emitting the signal will post an event to B's event loop. The event loop queues the event, and eventually invokes the slot method whenever control returns to it (it being the event loop). This makes it pretty easy to deal with communication between/among threads in Qt (again, assuming your threads are running their own local event loops). You don't have to worry about locks, etc. because the event loop serializes the slot invocations.

注意:如果您不知道如何更改 QObject 的線程關(guān)聯(lián),請(qǐng)查看 QObject::moveToThread.這應(yīng)該會(huì)讓你開(kāi)始.

Note: If you don't know how to change a QObject's thread affinity, look into QObject::moveToThread. That should get you started.

編輯

我應(yīng)該澄清一下我的開(kāi)場(chǎng)白.如果您指定一個(gè)排隊(duì)連接,它確實(shí)會(huì)有所不同——即使對(duì)于同一線程上的兩個(gè)對(duì)象.該事件仍然發(fā)布到線程的事件循環(huán).因此,方法調(diào)用仍然是異步的,這意味著它可以以不可預(yù)測(cè)的方式延遲(取決于循環(huán)可能需要處理的任何其他事件).但是,如果不指定連接方法,同一個(gè)線程上的對(duì)象之間的連接會(huì)自動(dòng)使用直接方法(至少在Qt 4.8中是這樣).

I should clarify my opening sentence. It does make a difference if you specify a queued connection - even for two objects on the same thread. The event is still posted to the thread's event loop. So, the method call is still asynchronous, meaning it can be delayed in unpredictable ways (depending on any other events the loop may need to process). However, if you don't specify a connection method, the direct method is automatically used for connections between objects on the same thread (at least it is in Qt 4.8).

這篇關(guān)于Qt 信號(hào)(QueuedConnection 和 DirectConnection)的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來(lái)源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問(wèn)題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

How can I read and manipulate CSV file data in C++?(如何在 C++ 中讀取和操作 CSV 文件數(shù)據(jù)?)
In C++ why can#39;t I write a for() loop like this: for( int i = 1, double i2 = 0; (在 C++ 中,為什么我不能像這樣編寫(xiě) for() 循環(huán): for( int i = 1, double i2 = 0;)
How does OpenMP handle nested loops?(OpenMP 如何處理嵌套循環(huán)?)
Reusing thread in loop c++(在循環(huán) C++ 中重用線程)
Precise thread sleep needed. Max 1ms error(需要精確的線程睡眠.最大 1ms 誤差)
Is there ever a need for a quot;do {...} while ( )quot; loop?(是否需要“do {...} while ()?環(huán)形?)
主站蜘蛛池模板: 砖机托板价格|免烧砖托板|空心砖托板厂家_山东宏升砖机托板厂 | 小型UV打印机-UV平板打印机-大型uv打印机-UV打印机源头厂家 |松普集团 | 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 烟台游艇培训,威海游艇培训-烟台市邮轮游艇行业协会 | 安徽免检低氮锅炉_合肥燃油锅炉_安徽蒸汽发生器_合肥燃气锅炉-合肥扬诺锅炉有限公司 | 离子色谱自动进样器-青岛艾力析实验科技有限公司 | 山东风淋室_201/304不锈钢风淋室净化设备厂家-盛之源风淋室厂家 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 蔬菜清洗机_环速洗菜机_异物去除清洗机_蔬菜清洗机_商用洗菜机 - 环速科技有限公司 | T恤衫定做,企业文化衫制作订做,广告T恤POLO衫定制厂家[源头工厂]-【汉诚T恤定制网】 | 黑龙江「京科脑康」医院-哈尔滨失眠医院_哈尔滨治疗抑郁症医院_哈尔滨精神心理医院 | 余姚生活网_余姚论坛_余姚市综合门户网站 | 小型玉石雕刻机_家用玉雕机_小型万能雕刻机_凡刻雕刻机官网 | NMRV减速机|铝合金减速机|蜗轮蜗杆减速机|NMRV减速机厂家-东莞市台机减速机有限公司 | 闪电优家-卫生间防水补漏_酒店漏水渗水维修_防水堵漏公司 | 天津暖气片厂家_钢制散热器_天津铜铝复合暖气片_维尼罗散热器 | 合肥钣金加工-安徽激光切割加工-机箱机柜加工厂家-合肥通快 | 2025福建平潭岛旅游攻略|蓝眼泪,景点,住宿攻略-趣平潭网 | 临海涌泉蜜桔官网|涌泉蜜桔微商批发代理|涌泉蜜桔供应链|涌泉蜜桔一件代发 | 英超直播_英超免费在线高清直播_英超视频在线观看无插件-24直播网 | 湖南教师资格网-湖南教师资格证考试网 | 密集柜_档案密集柜_智能密集架_密集柜厂家_密集架价格-智英伟业 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | YJLV22铝芯铠装电缆-MYPTJ矿用高压橡套电缆-天津市电缆总厂 | 精密冲床,高速冲床等冲压设备生产商-常州晋志德压力机厂 | 电机保护器-电动机综合保护器-浙江开民 | 石牌坊价格石牌坊雕刻制作_石雕牌坊牌楼石栏杆厂家_山东嘉祥石雕有限公司 | 手术室净化厂家-成都做医院净化工程的公司-四川华锐-15年特殊科室建设经验 | 臻知网大型互动问答社区-你的问题将在这里得到解答!-无锡据风网络科技有限公司 | 播音主持培训-中影人教育播音主持学苑「官网」-中国艺考界的贵族学校 | 板式换网器_柱式换网器_自动换网器-郑州海科熔体泵有限公司 | 丙烷/液氧/液氮气化器,丙烷/液氧/液氮汽化器-无锡舍勒能源科技有限公司 | 液压油缸-液压缸厂家价格,液压站系统-山东国立液压制造有限公司 液压油缸生产厂家-山东液压站-济南捷兴液压机电设备有限公司 | 硫化罐-电加热蒸汽硫化罐生产厂家-山东鑫泰鑫智能装备有限公司 | 广州市哲铭油墨涂料有限公司,水性漆生产研发基地 | 企业彩铃制作_移动、联通、电信集团彩铃上传开通_彩铃定制_商务彩铃管理平台-集团彩铃网 | 盘装氧量分析仪-防爆壁挂氧化锆分析仪-安徽吉帆仪表有限公司 | 通辽信息港 - 免费发布房产、招聘、求职、二手、商铺等信息 www.tlxxg.net | 山西3A认证|太原AAA信用认证|投标AAA信用证书-山西AAA企业信用评级网 | 柔软云母板-硬质-水位计云母片组件-首页-武汉长丰云母绝缘材料有限公司 | 细胞染色-流式双标-试剂盒免费代做-上海研谨生物科技有限公司 | 水轮机密封网 | 水轮机密封产品研发生产厂家 |