以前买oppo r7s时带的游戏,一个像印度人似的闯关,一共有三条命,里头有怪物,还得躲着它们走,可以加到

更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
按住视频可进行拖动
&正在加载...
收藏成功,可进入
查看所有收藏列表
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
oppo手机截屏新玩法,学会这招让智能生活更有趣!
正在检测客户端...
您尚未安装客户端,正在为您下载...安装完成后点击按钮即可下载
, 可在设置中重新打开噢!
30秒后自动关闭
oppo手机截屏新玩法,学会这招让智能生活更有趣!">oppo手机截屏新玩法,学会这招让智能生活更有趣!
请选择打赏金额:
播放量12.7万
播放量数据:快去看看谁在和你一起看视频吧~
更多数据:
Copyright (C) 2017
All Rights Reserved
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
正在为您下载爱奇艺客户端安装后即可快速下载海量视频
正在为您下载爱奇艺客户端安装后即可免费观看1080P视频
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制vishal是名字还是姓氏? 微信上被一个印度人加到,问他名字叫Vishal,全名是Vishal Bhoiwala。
答案长度必须超过10个字,请勿发布无效或违法言论。
(共有1个回答)
一般名字放前面,姓放在后面。Bhoiwala比沃瓦拉
办理流程:1、带好三证(结婚证、身份证、房产证)正本及复印件。2、去房屋所在地区的房地产交易中心,先在预检窗口告知是来办理房产证增加或是减去配偶姓名事宜的,窗口
房子贷款没还清之前,是不能在房产证上面加名字的,以为房产证还处于抵押状态,必须提前将还款还完,在银行办理房产证解压手续,才能对房产证办理加名字手续,房产证加名字
可以的,婚后买卖无论是否添加名字,都是夫妻双方财产。
房产证上加名字及办理费用,主要分为三种情况:
第一种情况:有房无贷
办理流程是:1、带好三证(结婚证
林内燃气热水器好吗?哈哈,这个你孤陋寡闻了。林内燃气热水器是日本牌子来的,而且已经有90多年的历史了,这个牌子是很出名的,你还以为人家是小品牌呢,可是没有关系啊
一、第一种情况:有房无贷
在有房无贷的情况下,房产证上加名字的办理流程是:
1、带好三证(结婚证、身份证、房产证)正本及复印件。
2、去房屋所在地区的房地
杭州三套房认定标准: 银行认定第三套房贷款的八种人群归纳下: 第一种:个人名下有两套商业贷款记录,一套已还清并出售,另一套未还清,这种情况如若再次贷款,会被银行
房产证上可以写几个名字: 按揭购房时,合同上只能写一个人名字。因为按揭购房只能按照谁贷款谁签字的原则进行处理,保证购房合同、贷款合同和房产证上签名统一,其原因是
小产权房无法在房管局备案,不能取得房产证,否则怎么叫小产权呢。小产权房说白了,就是没产权的房子。所以不存在你说的“过户”问题。只能在购房协议上改名字。就是把卖方
未满5年的不能交易,只能等年满5年。如果等不到年满5年,现在可以由政府回购。 1、在取得房产证满5年,可以过户。 2、目前产权归谁所有,要视出资情况,如果只有女
你好,一般买二手房可以贷款,但是也要看你要买的房子有没房产证等,还有看你个人资质。比如收入证明,银行流水等。还要看你是第几套房,你的城市有没限购你是不是外地人等
大家都关注
(C)2017 列表网&琼ICP备号-12&增值电信业务经营许可证B2-&&figure&&img src=&/v2-0d20f484a87cc3ae590be2b3325516bc_b.jpg& data-rawwidth=&792& data-rawheight=&532& class=&origin_image zh-lightbox-thumb& width=&792& data-original=&/v2-0d20f484a87cc3ae590be2b3325516bc_r.jpg&&&/figure&&p&在我们公众号里,有老铁想了解一些窗户的干货,因此,今天就来聊一聊窗户,争取把大家的疑问、买窗户常见的一些坑点说清楚,聊!明!白! &/p&&figure&&img src=&/v2-ad24bd3f0bba2_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&700& data-rawheight=&206& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/v2-ad24bd3f0bba2_r.jpg&&&/figure&&p&你们想聊什么咱就聊什么。 &/p&&figure&&img src=&/v2-1abc4e5cb2e0ddafa44df9_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&200& data-rawheight=&200& class=&content_image& width=&200&&&/figure&&p&&br&&/p&&p&&b&1、窗户进化论:缺点!再见!&/b&&/p&&p&买窗户要买什么样的,当然是保温好、隔音棒、结实耐用还便宜……的了。&/p&&p&但是!很多窗户并不是都满足以上全部条件。大多数人都喜欢知其然知其所以然,咱们先来扒一扒窗户的进化过程,也能更容易理解窗户里面的门道。&/p&&p&家装最早的窗户都是&b&木窗&/b&的,88~93年木头窗户都是主流。木头窗户的缺点很明显,怕淋雨,容易变形,不耐用。&/p&&figure&&img src=&/v2-ca3fe42a8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&940& data-rawheight=&596& class=&origin_image zh-lightbox-thumb& width=&940& data-original=&/v2-ca3fe42a8_r.jpg&&&/figure&&p&所以93~95年,开始以&b&钢窗&/b&为主,过了2年人们发现,钢窗的缺点也出来了,主要还是铁太多,容易生锈。&/p&&p&所以96年开始,&b&铝合金推拉窗&/b&大行其道。各位80后上中学的时候,教学楼用的都是这种铝合金推拉窗。优点很明显,不会生锈,但缺点也很明显,缝大,不严实。&/p&&figure&&img src=&/v2-f614a69e57cca43b9f72_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1024& data-rawheight=&699& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&/v2-f614a69e57cca43b9f72_r.jpg&&&/figure&&p&注意,这个时候铝合金只有推拉窗,没有平开。主要因为技术不成熟,推拉窗都是用铆钉来固定窗框的。想平开怎么办?&/p&&p&所以98年,&b&塑钢窗&/b&开始流行,优点很明显,能平开,也弥补了铝合金推拉窗的密封性差的问题。&/p&&p&叫塑钢窗是因为窗框材料都是用PVC树脂做的,不结实,只是在里面都加了钢衬。所以塑钢的缺点就是跟铝合金比,不够结实。时间长了,塑料还容易变色。&/p&&figure&&img src=&/v2-1bceef_b.jpg& data-size=&normal& data-rawwidth=&640& data-rawheight=&433& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-1bceef_r.jpg&&&figcaption&可以看到塑钢窗里面加的钢衬&/figcaption&&/figure&&p&所以02年,&b&平开方式的铝合金门窗&/b&开启了新时代。跟塑钢相比坚固结实,不怕变色。但还有一点点不美丽的地方,仍落于塑钢窗下风,就是铝合金的导热性好,隔温差,保温性能还赶不上塑钢窗。&/p&&p&所以04年,断桥铝窗户终于登上了舞台,全称是隔热静电断桥铝窗户,名字都有点360°托马斯回旋外加720°空翻的逼格感,本质还是铝合金窗户,就是中间加了根隔热条。&/p&&p&&br&&/p&&p&终于满足了几个主要的需求:&/p&&p&&b&①结实:铝合金&/b&&/p&&p&&b&②密封:无缝焊接&/b&&/p&&p&&b&③不变色:非塑料&/b&&/p&&p&&b&④隔热保温:用隔热条做了断桥隔离&/b&&/p&&p&&b&⑤静音:封闭工艺&/b&&/p&&figure&&img src=&/v2-0d20f484a87cc3ae590be2b3325516bc_b.jpg& data-size=&normal& data-rawwidth=&792& data-rawheight=&532& class=&origin_image zh-lightbox-thumb& width=&792& data-original=&/v2-0d20f484a87cc3ae590be2b3325516bc_r.jpg&&&figcaption&中间黑色的隔热条就是断桥,一般都是尼龙材料&/figcaption&&/figure&&p&窗户的进化就是一个群众不断追求、厂家不断研发的过程。每隔几年就会更新换代,弥补之前的产品缺陷。&/p&&figure&&img src=&/v2-52f610e4f62ee4952719bfb61e35bdd9_b.jpg& data-size=&normal& data-rawwidth=&850& data-rawheight=&470& class=&origin_image zh-lightbox-thumb& width=&850& data-original=&/v2-52f610e4f62ee4952719bfb61e35bdd9_r.jpg&&&figcaption&左边断桥铝窗户能清楚看到隔热条,右边塑钢窗能清楚看到绿色的钢衬&/figcaption&&/figure&&p&&br&&/p&&p&&b&2、断桥铝好,但是坑也多&/b&&/p&&p&断桥铝窗户的特点是环节多,配件多,型材厂、组装厂分开,生产商到代理商到经销商到安装售后会有一套的坑。&/p&&p&首先,一个窗户包括窗框、玻璃、五金、胶条等不同部件,我们常说的哪个牌子的窗户,其实主要说的是窗框,也就是型材厂家的品牌,其他的部件也都由组装商采购组装。&/p&&p&&br&&/p&&p&&b&窗框&/b&:也就是型材。铝矿采出来的都是先熔成纯铝锭,铝锭再熔化,加入其他金属,制成铝合金棒,然后再用型材机拉成各种型材,型材再加工成窗框。&/p&&figure&&img src=&/v2-6d73f75cd650a1051bc89fa_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&922& data-rawheight=&365& class=&origin_image zh-lightbox-thumb& width=&922& data-original=&/v2-6d73f75cd650a1051bc89fa_r.jpg&&&/figure&&p&注意了,杂牌子可能会用废铝回收做成铝棒,这个看型材是不是光滑靓丽。&/p&&p&窗框型材这方面,买窗户的时候你经常会听到60、65、70这样的数字。这其实是指窗框的宽度。&/p&&p&&b&60指的是窗框型材含隔热条宽60mm&/b&,65指65mm,依此类推,具体是窗框哪个地方的宽度呢,请看下图——&/p&&figure&&img src=&/v2-8d960eb648dedb67deb3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&811& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&811& data-original=&/v2-8d960eb648dedb67deb3_r.jpg&&&/figure&&figure&&img src=&/v2-3b0766adc03e40bba9c1ba_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&715& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&715& data-original=&/v2-3b0766adc03e40bba9c1ba_r.jpg&&&/figure&&p&&b&60型材的壁厚≥1.4mm,不足1.4属于达不到国家标准&/b&;65的一般和60的一样,只是隔热条宽了;70的壁厚是1.6mm或1.8mm。型材加工的时候就这样操作的,属于部分行规吧。&/p&&p&型材的主流品牌:凤铝、忠旺、实德、海螺、和平、亚铝、南山、中铝……&/p&&p&&br&&/p&&p&&b&隔热条&/b&:断桥铝折腾了半天,主要就是加了根隔热条。隔热条上商家也会做文章,有的用普通pvc隔热条,有的用&b&尼龙PA66隔热条&/b&。&/p&&p&正常都应该用PA66,耐高温,不怕膨胀。比较简单的检测方法,用打火机不容易烧着的就属于可以的。&/p&&figure&&img src=&/v2-ca113e5eab40ee4ecb841_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/v2-ca113e5eab40ee4ecb841_r.jpg&&&/figure&&p&&br&&/p&&p&&b&再说说玻璃&/b&:如果是高层、落地窗,或者&b&大于1.5㎡&/b&的窗户,尽量用钢化玻璃,硬度高,玻璃碎了会变成颗粒状连在一起,不会伤到人。&/p&&p&现在所有的钢化玻璃都有CCC标志,在某个角上,一般钢化玻璃需要加收费用。&/p&&p&要注意的是,最好的钢化玻璃都有3‰的自爆率,一般情况都是不受到外界冲击影响而玻璃自己裂开一片片花纹。&/p&&figure&&img src=&/v2-bab91dad2bac1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&644& data-rawheight=&413& class=&origin_image zh-lightbox-thumb& width=&644& data-original=&/v2-bab91dad2bac1_r.jpg&&&/figure&&p&查了半天资料,看原因属于生产过程中伴随的不可逆通病,目前无解。(大家不用太担心,自爆比较温和,千分之三也不算高,钢化玻璃普遍用于高铁门窗)&/p&&p&现在断桥铝窗户都会选择中空玻璃。为达到保温效果一般选择12mm及以上中空厚度,两边玻璃应该达到4~5mm的厚度。&/p&&p&双层中空推荐5mm+25mmA+5mm这种,三层的推荐5mm+9mmA+5mm+9mmA+5mm,其中A表示是中间空气层度,其它代表玻璃厚度。&/p&&p&如果商家不能做low-e膜,尽量不要镀膜,其他的镀膜都很影响室内光线。玻璃镀膜后从里面可以看到外面,外面看不到里面,还防紫外线,得加钱。&/p&&figure&&img src=&/v2-ee70d3c9173faba55de5fb15d34de2b0_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1280& data-rawheight=&1706& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/v2-ee70d3c9173faba55de5fb15d34de2b0_r.jpg&&&/figure&&p&&br&&/p&&p&&b&五金坑也比较多&/b&:买窗户的时候,商家包五金,要问清楚五金是国产还是进口,好的五金能保证开关窗户顺滑几十年。窗户再好,五金如果不好,也会影响密封、隔热、保温性能。&/p&&p&五金一般单独收费,&b&按照每套卖&/b&,注意不良商家会把五金按零件卖,不同开法的窗户五金不一样。&/p&&p&举例,平开窗的五金件主要有把手、传动器、合页、锁点、风撑这几个部分组成,这是一整套五金,不要被忽悠一个一个买。&/p&&figure&&img src=&/v2-c9efadeff_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&3120& data-rawheight=&4160& class=&origin_image zh-lightbox-thumb& width=&3120& data-original=&/v2-c9efadeff_r.jpg&&&/figure&&p&比较好的五金牌子是德国诺托和丝吉利娅。正牌诺托有比较圆润ROTO标志,手感比较重,顺畅但不松弛,就像个还没跑开的机器,很紧,但不是障碍感;中国有山寨诺托,标志是拼音NUOTUO。&/p&&p&正常五金都可以查真伪,比如丝吉利娅就在五金上有防伪码和生产批次钢印,可以查到具体的生产过程。&/p&&figure&&img src=&/v2-b0b9ce791eefd4f8fdb3779_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&800& data-rawheight=&450& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-b0b9ce791eefd4f8fdb3779_r.jpg&&&/figure&&figure&&img src=&/v2-64f55dcd873e321c2d02d56fdedab7b8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&628& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/v2-64f55dcd873e321c2d02d56fdedab7b8_r.jpg&&&/figure&&p&防伪标签上写着查询方法,撕下来就有防伪码。&/p&&figure&&img src=&/v2-02e00afec250_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&482& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/v2-02e00afec250_r.jpg&&&/figure&&p&五金这种东西,买窗户的时候多看几套,试一下就能分别出质感来。&/p&&p&&br&&/p&&p&除了上面提到的,你可能还会遇到很多名词,都跟钱有关,具体见示意图↓&/p&&p&&br&&/p&&p&&b&①一套窗户的各个部件&/b&&/p&&p&转角立柱和横梁都会单独加钱,事先商家可能不说。&/p&&figure&&img src=&/v2-9d0a0cacbfeca_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&400& data-rawheight=&320& class=&content_image& width=&400&&&/figure&&p&&br&&/p&&p&&b&②一扇窗户的各个部件&/b&&/p&&figure&&img src=&/v2-2f2af1e1e2be9eecdf7cc_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&753& data-rawheight=&612& class=&origin_image zh-lightbox-thumb& width=&753& data-original=&/v2-2f2af1e1e2be9eecdf7cc_r.jpg&&&/figure&&p&&br&&/p&&p&&b&3、下面重点聊聊钱&/b&&/p&&p&断桥铝窗户的报价,门道多到让人怀疑人生,可以说是装修主材中最头痛的主材。不过小编已扒清楚,老铁们买的时候拿着对一下就不被忽悠了。 &/p&&p&&br&&/p&&p&&b&断桥铝窗户都有哪些报价&/b&&/p&&p&先说断桥铝窗户的报价吧,一般放在台面上的报价有:&/p&&p&&b&铝材窗户&/b&:主要是窗框、窗扇和普通玻璃。&/p&&p&&b&五金件&/b&:据说进口五金ROTO假货极多。&/p&&p&&b&拐角立柱&/b&:一般200元左右/延米。L型窗需要一根,U型需要两根。&/p&&p&&b&纱窗&/b&:普通的一般100元/㎡,意美达一般150元/㎡。&/p&&figure&&img src=&/v2-c29d85afce66bbbba8bd6_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&459& data-rawheight=&327& class=&origin_image zh-lightbox-thumb& width=&459& data-original=&/v2-c29d85afce66bbbba8bd6_r.jpg&&&/figure&&p&如果你认为装窗户只需要掏这些钱,就太天真了。&/p&&p&&br&&/p&&p&&b&断桥铝窗户报价有哪些坑&/b&&/p&&p&常隐藏起来的辅料/增项有:&/p&&p&&b&①开窗超扇费&/b&:比如10平米只让你开3扇窗,想不留死角多开窗?不好意思请加钱,200多一扇。&/p&&p&&b&②密封胶/发泡胶&/b&:价格不包打胶的话,轻松打出上千元。最好事先谈好打神马品牌的胶,免得商家用劣质胶。&/p&&p&&b&③最小面积&/b&:单开窗不足1平按1平,对开窗不足2平按2平。&/p&&p&&b&④横梁&/b&:阳台内开窗想低于晾衣架的话,一般要加横梁,1延米100多。&/p&&p&&b&⑤铝管窗框/副框&/b&:想装窗套?合页不能紧贴窗框,需在两边各加个铝管/副框,200多1延米。&/p&&figure&&img src=&/v2-00bbc58a32d1ca4a28ee56_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&442& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-00bbc58a32d1ca4a28ee56_r.jpg&&&/figure&&p&&b&⑥改色&/b&:白色不好看?不好意思请加钱,改色30-50元一平米。&/p&&p&&b&⑦钢化玻璃&/b&:单块超过1.5平米的玻璃一般需要钢化,几十块一平米。&/p&&p&&b&⑧开孔&/b&:在玻璃上打烟管孔。&/p&&p&&b&⑨定位器&/b&:一般会送,也有黑心商家会收钱。&/p&&figure&&img src=&/v2-6d02a014dd40fba8ab00d3485b78ffde_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1280& data-rawheight=&960& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/v2-6d02a014dd40fba8ab00d3485b78ffde_r.jpg&&&/figure&&p&&b&⑩四连杆&/b&:如果是外开窗,商家会告诉你普通定位器阻力不足以抵抗大风,要安装一个四连杆,价格100-200不等。&/p&&p&&b&(11)镀膜费&/b&:单收。&/p&&p&&br&&/p&&p&&b&买断桥铝窗户注意哪些&/b&&/p&&p&所以下订单时候,一定要谈清楚哪些要收钱、哪些不要:&/p&&p&①确定清楚铝材的尺寸型号和厚度、材质、几道封闭,每平米价格。&/p&&p&②有无损耗,是否不足多少平米按整数算。&/p&&p&③每平米的费用除了铝材和窗户还包括什么等。&/p&&p&④最好出窗户尺寸图纸或者画一张图,让销售明确的标出来,哪些地方不收费。&/p&&p&⑤所有单价和费用都确认以后,计算一下总价,看每平米的费用是多少,如果太低,商家肯定能在其他地方找回来,适当的利润还是要给。&/p&&figure&&img src=&/v2-ca20f6fec63c5a0860cf_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&633& data-rawheight=&368& class=&origin_image zh-lightbox-thumb& width=&633& data-original=&/v2-ca20f6fec63c5a0860cf_r.jpg&&&/figure&&p&有些商家报价只要两三百一平,但是到安装的时候什么都另外加钱,那时候就很被动了,&b&尽量最开始要把所有的价格写清楚。&/b&&/p&&p&解答一下老铁的留言,铝包木断桥铝:如下图,室内侧是实木,室外侧是断桥铝。追求实木感觉,可以试试,贼贵。&/p&&figure&&img src=&/v2-0b980ff1fa42ad1e02b0be_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1000& data-rawheight=&698& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&/v2-0b980ff1fa42ad1e02b0be_r.jpg&&&/figure&&p&开发商的窗户要不要拆?得具体看用的材质你满意不满意。或者你对隔音保温有更高的要求,结果开发商给安的窗户又吵又漏风,那就果断换。现在的情况,新房换窗户的不多,二手且时间长的房子换窗户的比较多。&/p&&p&&br&&/p&&p&那断桥铝窗户一般都什么价位呢???&/p&&p&适合中产家庭、品质不错的断桥铝窗户大概&b&1000元/㎡左右(70型材、顶级五金、测量、安装以及各种辅料都包括)。&/b&&/p&&p&&br&&/p&&p&&a href=&/?target=http%3A///%3Fcanid%3Dzhihu205& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&装小蜜&i class=&icon-external&&&/i&&/a&&i&是第三方家装监理公司(20元/㎡),先请监理后装修是不被坑的唯一方法。欢迎各种合作私信&/i&&/p&
在我们公众号里,有老铁想了解一些窗户的干货,因此,今天就来聊一聊窗户,争取把大家的疑问、买窗户常见的一些坑点说清楚,聊!明!白! 你们想聊什么咱就聊什么。 1、窗户进化论:缺点!再见!买窗户要买什么样的,当然是保温好、隔音棒、结实耐用还便宜…
我家今年就是3房126平的装修,最后对比了下也是找的柠檬树装饰,福州这边的,9月份中旬活动期间和他们合作的,现在工程前期的整体感觉还是可以的,具体的等出来了完整的效果在展现吧,也是做完一部分给一部分的合同款,现在到了第三阶段了。大家可以看看怎么样!&br&&figure&&img src=&/v2-63dffb2a8135533faaade_b.jpg& data-rawwidth=&960& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&/v2-63dffb2a8135533faaade_r.jpg&&&/figure&&br&&figure&&img src=&/v2-09dc04de55dc4b7d5a475c_b.jpg& data-rawwidth=&960& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&/v2-09dc04de55dc4b7d5a475c_r.jpg&&&/figure&&br&&figure&&img src=&/v2-232d4d612ea4efe9a834937aaa15cf3e_b.jpg& data-rawwidth=&960& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&/v2-232d4d612ea4efe9a834937aaa15cf3e_r.jpg&&&/figure&&br&&figure&&img src=&/v2-02b54e8be89b2a20d00b6d0bc1c2b78b_b.jpg& data-rawwidth=&960& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&/v2-02b54e8be89b2a20d00b6d0bc1c2b78b_r.jpg&&&/figure&&br&&figure&&img src=&/v2-22bfbe66a716a55dc54c9d1c94635c08_b.jpg& data-rawwidth=&1280& data-rawheight=&960& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/v2-22bfbe66a716a55dc54c9d1c94635c08_r.jpg&&&/figure&&br&&figure&&img src=&/v2-31c6eee2bb1cd6b844f4ea4_b.jpg& data-rawwidth=&1280& data-rawheight=&960& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/v2-31c6eee2bb1cd6b844f4ea4_r.jpg&&&/figure&
我家今年就是3房126平的装修,最后对比了下也是找的柠檬树装饰,福州这边的,9月份中旬活动期间和他们合作的,现在工程前期的整体感觉还是可以的,具体的等出来了完整的效果在展现吧,也是做完一部分给一部分的合同款,现在到了第三阶段了。大家可以看看怎…
&p&不是我...但是真是迷之操作...&/p&&a class=&video-box& href=&///?target=https%3A///video/952704& target=&_blank& data-video-id=&& data-video-playable=&true& data-name=&& data-poster=&/80/v2-8bbb260cba2cc_b.jpg& data-lens-id=&952704&&
&img class=&thumbnail& src=&/80/v2-8bbb260cba2cc_b.jpg&&&span class=&content&&
&span class=&title&&&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&/video/952704&/span&
&/a&&p&&/p&
不是我...但是真是迷之操作...
&p&只要有点水平不嫌麻烦,月入3000零花钱应该不成问题。来长期做兼职的老司机带你飞。先上&/p&&figure&&img src=&/v2-02fc624d4bc5d4eeb28e08e54c5225cf_b.jpg& data-caption=&& data-rawwidth=&719& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&719& data-original=&/v2-02fc624d4bc5d4eeb28e08e54c5225cf_r.jpg&&&/figure&&p&&br&&/p&&p&&b&一、接字的初中论文&/b&&/p&&p&首先来个技术含量不那么高的,简单易上手滴。&/p&&p&我从去年开始接初中的杂志论文,100大洋的一篇论文只要1200左右的字,我现在只需不到两个小时就能完成一篇。主要是这些论文的要求都不高,只需要在网上找3至4篇主题相同的论文,组合改编就好,可以说很符合下班的闲时就可以小挣一顿大餐了。&/p&&p&&br&&/p&&figure&&img src=&/v2-cc448e1f19ddcc3ad7dce3d8a995e676_b.png& data-caption=&& data-rawwidth=&515& data-rawheight=&93& class=&origin_image zh-lightbox-thumb& width=&515& data-original=&/v2-cc448e1f19ddcc3ad7dce3d8a995e676_r.png&&&/figure&&p&最开始写的时候还存档了几篇,后来都没保存了。今天早上起来才写了一篇《苏教版初中英语的有效研究》,这类论文真的轻松又简单,比较闲的小伙伴可以做这类兼职,毕竟早上起来一两个小时坐着不太需要脑子、不需要文采,顺便写写就和在外面做超市促销价格一样了。&/p&&p&想接论文的小伙伴们不要再私聊我啦 。我朋友的任务没有这么多,已经给了十几二十个小伙伴了。 想做的可以自己在第二点的豆瓣银行里面找找,里面也有这样的任务。&/p&&p&&br&&/p&&p&&b&2.豆瓣稿费银行&/b&&/p&&p&肚子里有点墨水的小伙伴除了这种论文,可以挣钱的机会更多了。我觉得这个时代对于码字的小伙伴真的有太多机会。&/p&&p&强烈推荐一个豆瓣小组给大家,因为里面的需求大多真实有效,而且很多长期有效,有些几年前在发的需求,现在依然有人在接。我知道这个小组也是在一个公号里看到她说她的一个小伙伴在里面接任务能达到月入30000+!&/p&&p&除了这种金额很大,字数很多,能力要求高的写作需求外,还有十几个字、几十个字,要求不高就可以搞定的。里面的任务超级多,给大家推荐一个小妙招,因为量太大可能看不过来,可以先看后面的回复数,回复数越多的,越靠谱&/p&&figure&&img src=&/v2-d421dd64f69cad0f33e42fe_b.png& data-caption=&& data-rawwidth=&750& data-rawheight=&1334& class=&origin_image zh-lightbox-thumb& width=&750& data-original=&/v2-d421dd64f69cad0f33e42fe_r.png&&&/figure&&p&&br&&/p&&p&&b&3.自由人协作平台&/b&&/p&&p&这个网站上的需求是比较靠谱的,里面任务有难有易,除了一般的接文写作,还有ps,翻译,设计等,我觉得给的报酬还是相当合理的。大家没事可以翻翻有没有适合自己的。唯一不好的这需要竞标,不过只要你会营销自己就能得到好的任务。遇到合适的,可以长期合作,或许能成就自己的第二职业呢!网页图片就是刚才的第一张图。&/p&&p&&br&&/p&&figure&&img src=&/v2-02fc624d4bc5d4eeb28e08e54c5225cf_b.jpg& data-caption=&& data-rawwidth=&719& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&719& data-original=&/v2-02fc624d4bc5d4eeb28e08e54c5225cf_r.jpg&&&/figure&&p&4.爱标客&/p&&p&去年有一段时间我闲赋在家,我朋友给我介绍了一个兼职。他室友做了快两年了,就是每天下课回去抽一个小时批改一下作文,每个月挣一千多。作文水平就是初中生写的小作文,主要是检查单词拼写错误和一些基本的语法错误。但是对于批改者的要求必须要六级550分以上。(爱标客接任务需要提交身份证,收工资的银行卡这些,对于自己隐私信息保护较高的小伙伴自己好好斟酌一下。我室友当时就担心没做这个任务。还有现在爱标客的任务也不多啦,大家不要都跑去接这个任务。)&/p&&p&英语不好的也没关系,里面还有各种方言翻译啊、改数学题啊各种兼职&-&
我也不懂这些是搞什么鬼的!我也只做过英语作文批改,所以保证的也只有这个啦!这个英语批改是要加群的,咨询我的人太多了,加群的人也太多了。爱标客不需要这么多人。所以在此改为值乎提问,我可以回复英语和数理化批改的联系方式,或在值乎里听我给别人的回答。&/p&&p&5.猪八戒网&/p&&p&这是一个比价大众的兼职平台了,大伙儿应该都了解,我就上个图给大家看看,有能力的小伙伴快去竞标吧!我再来补充一下玩猪八戒网需要注意的问题。因为猪八戒网是一个需要竞标的兼职网站。网站大了就会有不良发布骗标。评论里就有小伙伴说他被骗过。所以我们要学会鉴别。猪八戒网站规则是发布需求-接需求-竞标-中标,一个好的标可能有很多人竞争,你努力后可能没中标,最倒霉的可能被骗方案。所以你可以绕过这些复杂的程序,直接联系发布者,告诉他你有多牛x,然后发作品链接给她,直接私下达成协议。(虽然不符合网站规定,但你必须学会维护自己的利益和收益。这个方法也是一个老司机告诉我的,我深以为然,特来分享给大家,愿大家都能搞自己的努力挣到money)&/p&&p&&br&&/p&&figure&&img src=&/v2-cfe327dfc9b6fbe7e5e885_b.jpg& data-caption=&& data-rawwidth=&719& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&719& data-original=&/v2-cfe327dfc9b6fbe7e5e885_r.jpg&&&/figure&&p&&br&&/p&&p&6、简书&/p&&p&上面介绍了很多兼职平台,不过都是自己写了给他人做嫁衣的感觉。在这个个人品牌越来越重要的时代,写作能力强一点的小伙伴,除了接以上兼职练练手随便挣一点外快以外,可以把自己的专注力放在简书等写作平台上。首推简书是我觉得这是一个对于纯粹的写作爱好者比较好的平台。你可以先尝试一下各种主题,最后找到适合你的风格。只要你写的可以,写不了多久就会有各种编辑来找你约稿了。&/p&&figure&&img src=&/v2-f6cfb520b5818a5eedb8_b.jpg& data-caption=&& data-rawwidth=&623& data-rawheight=&119& class=&origin_image zh-lightbox-thumb& width=&623& data-original=&/v2-f6cfb520b5818a5eedb8_r.jpg&&&/figure&&p&这是我在简书写了第四篇影评后收到的约稿。但是他要首发,我当时正调到总公司太忙就没写了。&/p&&p&除了被约稿外,简书还有很多有奖征文。一些主题群里,群主会发有奖征文,获奖的除了奖金外还有可能出书哦!除了这些群主的小征文外,还有简书主办的有奖征文,比如之前的对话文章,头奖一万!还有七夕征文那些,都是有奖金哒!慢慢练习,小伙伴们,向签约作者前进!!!&/p&&p&7、抱大腿&/p&&p&我在漫长的找兼职的遇见不少大牛,像接初中论文那个是以前的学长,他现在创业做学术杂志,知道我喜欢码字所以发单给我。所以还是那句话,个人品牌特别重要,因为我的个人品牌打造的其中一点就是爱码字,现在我周围朋友都会有偿邀请我写东西,最厉害的是我凭这点,入公司不到一年就被调到总公司去负责公司公众号运营。&/p&&p&还有一个大牛从满街跑业务又累又没钱,转行后用不到迅速月薪近3万并成为知乎大V。我从关注他的知乎到加入他的学习群,学习到超多。他的学习群和知乎回答经常会抛出一些大兼职,不比我回答里面的小打小闹。有兴趣的朋友可以看看。(好舍不得分享出来的,感觉又会多了一批人和我抢活儿了&-&)&/p&&p&&a href=&/question//answer/?utm_medium=social&utm_source=wechat_session&from=singlemessage&isappinstalled=1& class=&internal&&陈珂:有哪些在下班后的闲时稍做点,就有 3000 元月收入的兼职?&/a&&/p&&p&&br&&/p&&p&8.公众号投稿。有很多大号都开通了投稿,而且稿费相当客观。一般一篇有200-500左右。有些号是根据阅读量给稿费,有些还能给到千字千元
大家都知道现在写公众号文章有相当多的技巧。如果不了解的可以关注我的公众号:鹿十七。&b&回复“投稿”还可以收到我目前收集的可以投稿的大号哦!回复“兼职”可以收到我收集的最新一期兼职信息。&/b&&/p&&p&&b&&br&&/b&&/p&&p&&b&扫描二维码关注了解更多,爱你哟!&/b&&/p&&p&&figure&&img data-rawwidth=&258& data-rawheight=&258& src=&/v2-c287e707d62e193e90e7_b.jpg& class=&content_image& width=&258&&&/figure&&br&&/p&&p&补充:第二次回答获得这么多赞好惶恐啊!由于觉得关注这个的朋友可能学生和初入社会小伙伴比较多。所以在最后我有几句话觉得该说一下。大学生们不要把你的时间都花费到做兼职上面来了,如果喜欢自己的专业就好好学习,如果不喜欢自己的专业就找到自己热爱的方向。就算是你喜欢旅游,我身边也有很多把旅游做成自己的工作,甚至开公司的。所以,大家在做兼职之外一定要有磨炼自己技能,加强自己的特色这个意识。最后一次补充啦,最后愿大家早日财富自由。你一定要努力,但千万不要着急,么么哒。&/p&
只要有点水平不嫌麻烦,月入3000零花钱应该不成问题。来长期做兼职的老司机带你飞。先上 一、接字的初中论文首先来个技术含量不那么高的,简单易上手滴。我从去年开始接初中的杂志论文,100大洋的一篇论文只要1200左右的字,我现在只需不到两个小…
&figure&&img src=&/v2-1e7e0fae554ecb9f3fb157_b.jpg& data-rawwidth=&1575& data-rawheight=&367& class=&origin_image zh-lightbox-thumb& width=&1575& data-original=&/v2-1e7e0fae554ecb9f3fb157_r.jpg&&&/figure&&p&事件系统在 Qt 中扮演了十分重要的角色,不仅 GUI 的方方面面需要使用到事件系统,Signals/Slots 技术也离不开事件系统(多线程间)。我们本文中暂且不描述 GUI 中的一些特殊情况,来说说一个非 GUI 应用程序的事件模型。&/p&&p&如果让你写一个程序,打开一个套接字,接收一段字节然后输出,你会怎么做?&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&argc&/span&&span class=&p&&,&/span& &span class=&kt&&char&/span& &span class=&o&&*&/span&&span class=&n&&argv&/span&&span class=&p&&[])&/span&
&span class=&p&&{&/span&
&span class=&n&&WORD&/span& &span class=&n&&wVersionRequested&/span&&span class=&p&&;&/span&
&span class=&n&&WSADATA&/span& &span class=&n&&wsaData&/span&&span class=&p&&;&/span&
&span class=&n&&SOCKET&/span& &span class=&n&&sock&/span&&span class=&p&&;&/span&
&span class=&kt&&int&/span& &span class=&n&&err&/span&&span class=&p&&;&/span&
&span class=&n&&BOOL&/span& &span class=&n&&bSuccess&/span&&span class=&p&&;&/span&
&span class=&n&&wVersionRequested&/span& &span class=&o&&=&/span& &span class=&n&&MAKEWORD&/span&&span class=&p&&(&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&);&/span&
&span class=&n&&err&/span& &span class=&o&&=&/span& &span class=&n&&WSAStartup&/span&&span class=&p&&(&/span&&span class=&n&&wVersionRequested&/span&&span class=&p&&,&/span& &span class=&o&&&&/span&&span class=&n&&wsaData&/span&&span class=&p&&);&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&err&/span& &span class=&o&&!=&/span& &span class=&mi&&0&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&n&&sock&/span& &span class=&o&&=&/span& &span class=&n&&WSASocketW&/span&&span class=&p&&(&/span&&span class=&n&&AF_INET&/span&&span class=&p&&,&/span& &span class=&n&&SOCK_STREAM&/span&&span class=&p&&,&/span& &span class=&n&&IPPROTO_TCP&/span&&span class=&p&&,&/span& &span class=&nb&&NULL&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&);&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&sock&/span& &span class=&o&&==&/span& &span class=&n&&INVALID_SOCKET&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&n&&bSuccess&/span& &span class=&o&&=&/span& &span class=&n&&WSAConnectByName&/span&&span class=&p&&(&/span&&span class=&n&&sock&/span&&span class=&p&&,&/span& &span class=&k&&const_cast&/span&&span class=&o&&&&/span&&span class=&n&&LPWSTR&/span&&span class=&o&&&&/span&&span class=&p&&(&/span&&span class=&s&&L&127.0.0.1&&/span&&span class=&p&&),&/span& &span class=&p&&...);&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&o&&!&/span&&span class=&n&&bSuccess&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&n&&WSARecv&/span&&span class=&p&&(&/span&&span class=&n&&sock&/span&&span class=&p&&,&/span& &span class=&o&&&&/span&&span class=&n&&wsaData&/span&&span class=&p&&,&/span& &span class=&p&&...);&/span&
&span class=&n&&WSACleanup&/span&&span class=&p&&();&/span&
&span class=&k&&return&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&这就是所谓的阻塞模式。当 &b&WSARecv&/b& 函数被调用后,线程将会被挂起,直到远程端有数据到达或某些系统中断被触发,程序自身将不能掌握控制权(除非使用 APC,详见 &a href=&/?target=https%3A///en-us/library/windows/desktop/msv%3Dvs.85%29.aspx& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WSARecv function&i class=&icon-external&&&/i&&/a&)。&/p&&p&Qt 则提供了一个十分友好的编程模式 —— 事件驱动,其实事件驱动早已不是什么新鲜事,GUI 应用必然使用事件驱动,而越来越多服务器应用中也开始采用事件驱动模型(典型的有 Node.js 及其他采用 Reactor 模型的框架)。&/p&&p&我们举一个简单的事件驱动的例子,来看这样一段程序:&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&argc&/span&&span class=&p&&,&/span& &span class=&kt&&char&/span& &span class=&o&&*&/span&&span class=&n&&argv&/span&&span class=&p&&[])&/span&
&span class=&p&&{&/span&
&span class=&n&&QApplication&/span& &span class=&n&&a&/span&&span class=&p&&(&/span&&span class=&n&&argc&/span&&span class=&p&&,&/span& &span class=&n&&argv&/span&&span class=&p&&);&/span&
&span class=&n&&QTimer&/span& &span class=&n&&t&/span&&span class=&p&&;&/span&
&span class=&n&&QObject&/span&&span class=&o&&::&/span&&span class=&n&&connect&/span&&span class=&p&&(&/span&&span class=&o&&&&/span&&span class=&n&&t&/span&&span class=&p&&,&/span& &span class=&o&&&&/span&&span class=&n&&QTimer&/span&&span class=&o&&::&/span&&span class=&n&&timeout&/span&&span class=&p&&,&/span& &span class=&p&&[]()&/span& &span class=&p&&{&/span&
&span class=&n&&qDebug&/span&&span class=&p&&()&/span& &span class=&o&&&&&/span& &span class=&s&&&Timer fired!&&/span&&span class=&p&&;&/span&
&span class=&p&&});&/span&
&span class=&n&&t&/span&&span class=&p&&.&/span&&span class=&n&&start&/span&&span class=&p&&(&/span&&span class=&mi&&2000&/span&&span class=&p&&);&/span&
&span class=&k&&return&/span& &span class=&n&&a&/span&&span class=&p&&.&/span&&span class=&n&&exec&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&你可能会问:“这跟 for-loop + sleep 的方式有什么区别?”嗯,从代码的层面确实不太好描述它们之间的区别。其实事件驱动与循环结构非常相似,因为它就是一个大循环,不断从消息队列中取出消息,然后再分发给事件响应者去处理。&/p&&p&所以一个消息循环可以用下面的伪代码来表示:&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&k&&while&/span& &span class=&p&&(&/span&&span class=&nb&&true&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&Message&/span& &span class=&n&&msg&/span& &span class=&o&&=&/span& &span class=&n&&GetMessage&/span&&span class=&p&&();&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&msg&/span&&span class=&p&&.&/span&&span class=&n&&isQuitRequest&/span&&span class=&p&&)&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&c1&&// Process the msg object...&/span&
&span class=&p&&}&/span&
&span class=&c1&&// Clean up here...&/span&
&span class=&k&&return&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&看起来也很简单嘛,没错,大致结构就是这样,但实现细节却是比较复杂的。&/p&&p&思考这样一个问题:&b&CPU 处理消息的时间和消息产生的时间哪个比较长?&/b&&/p&&p&按现在的 CPU 处理能力来讲,消息处理是要远远快于消息产生的速度的,试想,你每秒能敲击几次键盘,手速再快 50 次了不得了吧,但是 CPU 每秒能够处理的敲击可能高达几万次。如果 CPU 处理完一个消息后,发现没的消息处理了,接下来可能非常多的 Cycle 后 CPU 仍然捞不着消息处理,这么多 Cycle 就白白浪费了。这就非常像 &b&Mutex &/b&和 &b&Spin Lock &/b&的关系,Spin Lock 只适用于非常短暂的互斥操作,操作时间一长,Spin Lock 就会严重消耗 CPU 资源, 因为它就是一个 while 循环,使用不断 CAS 尝试获得锁。&/p&&p&回到我们上面的消息列队,&b&GetMessage &/b&这个调用如果每次不管有没有消息都返回的话,CPU 就永远闲不下了,每个线程始终 100% 的占用。这显然是不行的,所以 GetMessage 这个函数不会在没有消息时返回,相反,它会持续阻塞,直到有消息到达或者 timeout(如果指定了),这样以来 CPU 在没有消息的时候就能好好休息几千上万个 Cycle 了(线程挂起)。&/p&&h2&Qt 的消息分发机制&/h2&&p&好了,基本的原理了解了,我们可以回来分析 Qt 了。为了弄明白上面 timer 的例子是怎么回事,我们不妨在输出语句处加一个断点,看看它的调用栈:&/p&&figure&&img src=&/v2-dcb3f27a2c2b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1233& data-rawheight=&844& class=&origin_image zh-lightbox-thumb& width=&1233& data-original=&/v2-dcb3f27a2c2b_r.jpg&&&/figure&&p&QMetaObject 往上的部分已经不属于本文讨论的范围了,因为它属于 Qt 另一大系统,即 Meta-Object System,我们这里只分析到 &b&QCoreApplication::sendEvent&/b& 的位置,因为一旦这个方法被调用了,再往后就没操作系统和事件机制什么事了。&/p&&p&首先我们从一切的起点,QCoreApplication::exec 开始分析:&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&kt&&int&/span& &span class=&n&&QCoreApplication&/span&&span class=&o&&::&/span&&span class=&n&&exec&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&o&&!&/span&&span class=&n&&QCoreApplicationPrivate&/span&&span class=&o&&::&/span&&span class=&n&&checkInstance&/span&&span class=&p&&(&/span&&span class=&s&&&exec&&/span&&span class=&p&&))&/span&
&span class=&k&&return&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&n&&QThreadData&/span& &span class=&o&&*&/span&&span class=&n&&threadData&/span& &span class=&o&&=&/span& &span class=&n&&self&/span&&span class=&o&&-&&/span&&span class=&n&&d_func&/span&&span class=&p&&()&/span&&span class=&o&&-&&/span&&span class=&n&&threadData&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&threadData&/span& &span class=&o&&!=&/span& &span class=&n&&QThreadData&/span&&span class=&o&&::&/span&&span class=&n&&current&/span&&span class=&p&&())&/span& &span class=&p&&{&/span&
&span class=&n&&qWarning&/span&&span class=&p&&(&/span&&span class=&s&&&%s::exec: Must be called from the main thread&&/span&&span class=&p&&,&/span& &span class=&n&&self&/span&&span class=&o&&-&&/span&&span class=&n&&metaObject&/span&&span class=&p&&()&/span&&span class=&o&&-&&/span&&span class=&n&&className&/span&&span class=&p&&());&/span&
&span class=&k&&return&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&o&&!&/span&&span class=&n&&threadData&/span&&span class=&o&&-&&/span&&span class=&n&&eventLoops&/span&&span class=&p&&.&/span&&span class=&n&&isEmpty&/span&&span class=&p&&())&/span& &span class=&p&&{&/span&
&span class=&n&&qWarning&/span&&span class=&p&&(&/span&&span class=&s&&&QCoreApplication::exec: The event loop is already running&&/span&&span class=&p&&);&/span&
&span class=&k&&return&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&n&&threadData&/span&&span class=&o&&-&&/span&&span class=&n&&quitNow&/span& &span class=&o&&=&/span& &span class=&nb&&false&/span&&span class=&p&&;&/span&
&span class=&n&&QEventLoop&/span& &span class=&n&&eventLoop&/span&&span class=&p&&;&/span&
&span class=&n&&self&/span&&span class=&o&&-&&/span&&span class=&n&&d_func&/span&&span class=&p&&()&/span&&span class=&o&&-&&/span&&span class=&n&&in_exec&/span& &span class=&o&&=&/span& &span class=&nb&&true&/span&&span class=&p&&;&/span&
&span class=&n&&self&/span&&span class=&o&&-&&/span&&span class=&n&&d_func&/span&&span class=&p&&()&/span&&span class=&o&&-&&/span&&span class=&n&&aboutToQuitEmitted&/span& &span class=&o&&=&/span& &span class=&nb&&false&/span&&span class=&p&&;&/span&
&span class=&kt&&int&/span& &span class=&n&&returnCode&/span& &span class=&o&&=&/span& &span class=&n&&eventLoop&/span&&span class=&p&&.&/span&&span class=&n&&exec&/span&&span class=&p&&();&/span&
&span class=&n&&threadData&/span&&span class=&o&&-&&/span&&span class=&n&&quitNow&/span& &span class=&o&&=&/span& &span class=&nb&&false&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&self&/span&&span class=&p&&)&/span&
&span class=&n&&self&/span&&span class=&o&&-&&/span&&span class=&n&&d_func&/span&&span class=&p&&()&/span&&span class=&o&&-&&/span&&span class=&n&&execCleanup&/span&&span class=&p&&();&/span&
&span class=&k&&return&/span& &span class=&n&&returnCode&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&threadData 是一个 &b&Thread-Local&/b& 变量,每个线程都最多持有一个消息循环,这个方法主要做的就是启动主线程中的 &b&QEventLoop&/b&。继续分析:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&int QEventLoop::exec(ProcessEventsFlags flags)
Q_D(QEventLoop);
//we need to protect from race condition with QThread::exit
QMutexLocker locker(&static_cast&QThreadPrivate *&(QObjectPrivate::get(d-&threadData-&thread))-&mutex);
if (d-&threadData-&quitNow)
return -1;
if (d-&inExec) {
qWarning(&QEventLoop::exec: instance %p has already called exec()&, this);
return -1;
struct LoopReference {
QEventLoopPrivate *d;
QMutexLocker &
bool exceptionC
LoopReference(QEventLoopPrivate *d, QMutexLocker &locker) : d(d), locker(locker), exceptionCaught(true)
d-&inExec =
d-&exit.storeRelease(false);
++d-&threadData-&loopL
d-&threadData-&eventLoops.push(d-&q_func());
locker.unlock();
~LoopReference()
if (exceptionCaught) {
qWarning(&Qt has caught an exception thrown from an event handler. Throwing\n&
&exceptions from an event handler is not supported in Qt.\n&
&You must not let any exception whatsoever propagate through Qt code.\n&
&If that is not possible, in Qt 5 you must at least reimplement\n&
&QCoreApplication::notify() and catch all exceptions there.\n&);
locker.relock();
QEventLoop *eventLoop = d-&threadData-&eventLoops.pop();
Q_ASSERT_X(eventLoop == d-&q_func(), &QEventLoop::exec()&, &internal error&);
Q_UNUSED(eventLoop); // --release warning
d-&inExec =
--d-&threadData-&loopL
LoopReference ref(d, locker);
// remove posted quit events when entering a new event loop
QCoreApplication *app = QCoreApplication::instance();
if (app && app-&thread() == thread())
QCoreApplication::removePostedEvents(app, QEvent::Quit);
while (!d-&exit.loadAcquire())
processEvents(flags | WaitForMoreEvents | EventLoopExec);
ref.exceptionCaught =
return d-&returnCode.load();
&/code&&/pre&&/div&&p&这个方法是循环的主体,首先它处理了消息循环嵌套的问题,为什么要嵌套呢?场景可能是这样的:你想从一个模态窗口中获取一个用户的输入,然后继续逻辑的执行,如果模态窗口的显示是异步的,那编程模式就变成 CPS 了,用户输入将会触发一个 callback 进而完成接下来的任务,这在桌面开发中是不太能够被接受的(C# 玩家请绕行,你们有 await 了不起啊,摔)。如果用嵌套会是一种怎样的情景呢?需要开模态时再开一个新的 QEventLoop,由于 &b&exec()&/b& 方法是阻塞的,在窗口关闭后 &b&exit()&/b& 掉这个 event loop 就可以让当前的方法继续执行了,同时你也拿到了用户的输入。QDialog 的模态就是这样做的。&/p&&p&Qt 这里使用内部 struct 来实现 try-catch-free 的风格,使用到的就是 C++ 的 &b&RAII&/b&,非本文讨论范畴,不展开了。&/p&&p&再往下就是一个 while 循环了,在 exit() 方法执行之前,一直循环调用 &b&processEvents()&/b& 方法。&/p&&p&processEvents 实现内部是平台相关的,Windows 使用的就是标准的 Windows 消息机制,macOS 上使用的是 &b&CFRunLoop&/b&,UNIX 上则是 &b&epoll&/b&。本文以 Windows 为例,由于该方法的代码量较大,本文中就不贴出完整源码了,大家可以自己查阅 Qt 源码。概括地说这个方法&b&大体&/b&做了以下几件事:&/p&&ol&&li&初始化一个不可见窗体(下文解释为什么);&/li&&li&获取已经入队的用户输入或 Socket 事件;&/li&&li&如果 2 中没有获取到事件,则执行 &b&PeekMessage&/b&,这个函数是非阻塞的,如果有事件则入队;&/li&&li&预处理 Posted Event 和 Timer Event;&/li&&li&处理退出消息;&/li&&li&如果上述步骤有一步拿到消息了,就使用 &b&TranslateMessage&/b&(处理按键消息,将 KeyCode 转换为当前系统设置的相应的字符)+ &b&DispatchMessage &/b&分发消息;&/li&&li&如果没有拿到消息,那就阻塞着吧。注意,这里使用的是 &b&MsgWaitForMultipleObjectsEx &/b&这个函数,它除了可以监听窗体事件以外还能监听 APC 事件,比 &b&GetMessage &/b&要更通用一些。&/li&&/ol&&p&下面来说说为什么要创建一个不可见窗体。创建过程如下:&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&k&&static&/span& &span class=&n&&HWND&/span& &span class=&nf&&qt_create_internal_window&/span&&span class=&p&&(&/span&&span class=&k&&const&/span& &span class=&n&&QEventDispatcherWin32&/span& &span class=&o&&*&/span&&span class=&n&&eventDispatcher&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&QWindowsMessageWindowClassContext&/span& &span class=&o&&*&/span&&span class=&n&&ctx&/span& &span class=&o&&=&/span& &span class=&n&&qWindowsMessageWindowClassContext&/span&&span class=&p&&();&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&o&&!&/span&&span class=&n&&ctx&/span&&span class=&o&&-&&/span&&span class=&n&&atom&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&n&&HWND&/span& &span class=&n&&wnd&/span& &span class=&o&&=&/span& &span class=&n&&CreateWindow&/span&&span class=&p&&(&/span&&span class=&n&&ctx&/span&&span class=&o&&-&&/span&&span class=&n&&className&/span&&span class=&p&&,&/span&
&span class=&c1&&// classname&/span&
&span class=&n&&ctx&/span&&span class=&o&&-&&/span&&span class=&n&&className&/span&&span class=&p&&,&/span&
&span class=&c1&&// window name&/span&
&span class=&mi&&0&/span&&span class=&p&&,&/span&
&span class=&c1&&// style&/span&
&span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span&
&span class=&c1&&// geometry&/span&
&span class=&n&&HWND_MESSAGE&/span&&span class=&p&&,&/span&
&span class=&c1&&// parent&/span&
&span class=&mi&&0&/span&&span class=&p&&,&/span&
&span class=&c1&&// menu handle&/span&
&span class=&n&&GetModuleHandle&/span&&span class=&p&&(&/span&&span class=&mi&&0&/span&&span class=&p&&),&/span&
&span class=&c1&&// application&/span&
&span class=&mi&&0&/span&&span class=&p&&);&/span&
&span class=&c1&&// windows creation data.&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&o&&!&/span&&span class=&n&&wnd&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&qErrnoWarning&/span&&span class=&p&&(&/span&&span class=&s&&&CreateWindow() for QEventDispatcherWin32 internal window failed&&/span&&span class=&p&&);&/span&
&span class=&k&&return&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&cp&&#ifdef GWLP_USERDATA&/span&
&span class=&n&&SetWindowLongPtr&/span&&span class=&p&&(&/span&&span class=&n&&wnd&/span&&span class=&p&&,&/span& &span class=&n&&GWLP_USERDATA&/span&&span class=&p&&,&/span& &span class=&p&&(&/span&&span class=&n&&LONG_PTR&/span&&span class=&p&&)&/span&&span class=&n&&eventDispatcher&/span&&span class=&p&&);&/span&
&span class=&cp&&#else&/span&
&span class=&n&&SetWindowLong&/span&&span class=&p&&(&/span&&span class=&n&&wnd&/span&&span class=&p&&,&/span& &span class=&n&&GWL_USERDATA&/span&&span class=&p&&,&/span& &span class=&p&&(&/span&&span class=&n&&LONG&/span&&span class=&p&&)&/span&&span class=&n&&eventDispatcher&/span&&span class=&p&&);&/span&
&span class=&cp&&#endif&/span&
&span class=&k&&return&/span& &span class=&n&&wnd&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&在 Windows 中,没有像 macOS 的 CFRunLoop 那样比较通用的消息循环,但当你有了一个窗体后,它就帮你在应用与操作系统之间建立了一个 bridge,通过这个窗体你就可以充分利用 Windows 的消息机制了,包括 Timer、异步 Winsock 操作等。同时 Windows API 也允许你绑定一些自定义指针,这样每个窗体都与 event loop 建立了关系。&/p&&p&接下来 &b&DispatchMessage&/b& 的调用会使窗体执行其绑定的 &b&WindowProc &/b&函数,这个函数分别处理 Socket、Notifier、Posted Event 和 Timer。&/p&&p&Posted Event 是一个比较常见的事件类型,它会进而触发下面的调用:&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&kt&&void&/span& &span class=&n&&QEventDispatcherWin32&/span&&span class=&o&&::&/span&&span class=&n&&sendPostedEvents&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&n&&Q_D&/span&&span class=&p&&(&/span&&span class=&n&&QEventDispatcherWin32&/span&&span class=&p&&);&/span&
&span class=&n&&QCoreApplicationPrivate&/span&&span class=&o&&::&/span&&span class=&n&&sendPostedEvents&/span&&span class=&p&&(&/span&&span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&n&&d&/span&&span class=&o&&-&&/span&&span class=&n&&threadData&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&在 QCoreApplicaton 中,sendPostedEvents() 方法会循环取出已入队的事件,这些事件被封装入 &b&QPostEvent&/b&,真实的 &b&QEvent &/b&会被取出再传入 &b&QCoreApplication::sendEvent()&/b& 方法,在此之后的过程就与操作系统无关了。&/p&&p&一般来说,Signals/Slots 在同一线程下会直接调用 &b&QCoreApplication::sendEvent()&/b& 传递消息,这样事件就能直接得到处理,不必等待下一次 event loop。而处于不同线程中的对象在 emit signals 之后,会通过
&b&QCoreApplication::postEvent()&/b& 来发送消息:&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&kt&&void&/span& &span class=&n&&QCoreApplication&/span&&span class=&o&&::&/span&&span class=&n&&postEvent&/span&&span class=&p&&(&/span&&span class=&n&&QObject&/span& &span class=&o&&*&/span&&span class=&n&&receiver&/span&&span class=&p&&,&/span& &span class=&n&&QEvent&/span& &span class=&o&&*&/span&&span class=&n&&event&/span&&span class=&p&&,&/span& &span class=&kt&&int&/span& &span class=&n&&priority&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&receiver&/span& &span class=&o&&==&/span& &span class=&mi&&0&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&qWarning&/span&&span class=&p&&(&/span&&span class=&s&&&QCoreApplication::postEvent: Unexpected null receiver&&/span&&span class=&p&&);&/span&
&span class=&k&&delete&/span& &span class=&n&&event&/span&&span class=&p&&;&/span&
&span class=&k&&return&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&n&&QThreadData&/span& &span class=&o&&*&/span& &span class=&k&&volatile&/span& &span class=&o&&*&/span& &span class=&n&&pdata&/span& &span class=&o&&=&/span& &span class=&o&&&&/span&&span class=&n&&receiver&/span&&span class=&o&&-&&/span&&span class=&n&&d_func&/span&&span class=&p&&()&/span&&span class=&o&&-&&/span&&span class=&n&&threadData&/span&&span class=&p&&;&/span&
&span class=&n&&QThreadData&/span& &span class=&o&&*&/span&&span class=&n&&data&/span& &span class=&o&&=&/span& &span class=&o&&*&/span&&span class=&n&&pdata&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&o&&!&/span&&span class=&n&&data&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&k&&delete&/span& &span class=&n&&event&/span&&span class=&p&&;&/span&
&span class=&k&&return&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&n&&data&/span&&span class=&o&&-&&/span&&span class=&n&&postEventList&/span&&span class=&p&&.&/span&&span class=&n&&mutex&/span&&span class=&p&&.&/span&&span class=&n&&lock&/span&&span class=&p&&();&/span&
&span class=&k&&while&/span& &span class=&p&&(&/span&&span class=&n&&data&/span& &span class=&o&&!=&/span& &span class=&o&&*&/span&&span class=&n&&pdata&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&data&/span&&span class=&o&&-&&/span&&span class=&n&&postEventList&/span&&span class=&p&&.&/span&&span class=&n&&mutex&/span&&span class=&p&&.&/span&&span class=&n&&unlock&/span&&span class=&p&&();&/span&
&span class=&n&&data&/span& &span class=&o&&=&/span& &span class=&o&&*&/span&&span class=&n&&pdata&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&o&&!&/span&&span class=&n&&data&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&k&&delete&/span& &span class=&n&&event&/span&&span class=&p&&;&/span&
&span class=&k&&return&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&n&&data&/span&&span class=&o&&-&&/span&&span class=&n&&postEventList&/span&&span class=&p&&.&/span&&span class=&n&&mutex&/span&&span class=&p&&.&/span&&span class=&n&&lock&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&n&&QMutexUnlocker&/span& &span class=&n&&locker&/span&&span class=&p&&(&/span&&span class=&o&&&&/span&&span class=&n&&data&/span&&span class=&o&&-&&/span&&span class=&n&&postEventList&/span&&span class=&p&&.&/span&&span class=&n&&mutex&/span&&span class=&p&&);&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&receiver&/span&&span class=&o&&-&&/span&&span class=&n&&d_func&/span&&span class=&p&&()&/span&&span class=&o&&-&&/span&&span class=&n&&postedEvents&/span&
&span class=&o&&&&&/span& &span class=&n&&self&/span& &span class=&o&&&&&/span& &span class=&n&&self&/span&&span class=&o&&-&&/span&&span class=&n&&compressEvent&/span&&span class=&p&&(&/span&&span class=&n&&event&/span&&span class=&p&&,&/span& &span class=&n&&receiver&/span&&span class=&p&&,&/span& &span class=&o&&&&/span&&span class=&n&&data&/span&&span class=&o&&-&&/span&&span class=&n&&postEventList&/span&&span class=&p&&))&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&event&/span&&span class=&o&&-&&/span&&span class=&n&&type&/span&&span class=&p&&()&/span& &span class=&o&&==&/span& &span class=&n&&QEvent&/span&&span class=&o&&::&/span&&span class=&n&&DeferredDelete&/span& &span class=&o&&&&&/span& &span class=&n&&data&/span& &span class=&o&&==&/span& &span class=&n&&QThreadData&/span&&span class=&o&&::&/span&&span class=&n&&current&/span&&span class=&p&&())&/span& &span class=&p&&{&/span&
&span class=&kt&&int&/span& &span class=&n&&loopLevel&/span& &span class=&o&&=&/span& &span class=&n&&data&/span&&span class=&o&&-&&/span&&span class=&n&&loopLevel&/span&&span class=&p&&;&/span&
&span class=&kt&&int&/span& &span class=&n&&scopeLevel&/span& &span class=&o&&=&/span& &span class=&n&&data&/span&&span class=&o&&-&&/span&&span class=&n&&scopeLevel&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&scopeLevel&/span& &span class=&o&&==&/span& &span class=&mi&&0&/span& &span class=&o&&&&&/span& &span class=&n&&loopLevel&/span& &span class=&o&&!=&/span& &span class=&mi&&0&/span&&span class=&p&&)&/span&
&span class=&n&&scopeLevel&/span& &span class=&o&&=&/span& &span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&k&&static_cast&/span&&span class=&o&&&&/span&&span class=&n&&QDeferredDeleteEvent&/span& &span class=&o&&*&&/span&&span class=&p&&(&/span&&span class=&n&&event&/span&&span class=&p&&)&/span&&span class=&o&&-&&/span&&span class=&n&&level&/span& &span class=&o&&=&/span& &span class=&n&&loopLevel&/span& &span class=&o&&+&/span& &span class=&n&&scopeLevel&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&n&&QScopedPointer&/span&&span class=&o&&&&/span&&span class=&n&&QEvent&/span&&span class=&o&&&&/span& &span class=&n&&eventDeleter&/span&&span class=&p&&(&/span&&span class=&n&&event&/span&&span class=&p&&);&/span&
&span class=&n&&data&/span&&span class=&o&&-&&/span&&span class=&n&&postEventList&/span&&span class=&p&&.&/span&&span class=&n&&addEvent&/span&&span class=&p&&(&/span&&span class=&n&&QPostEvent&/span&&span class=&p&&(&/span&&span class=&n&&receiver&/span&&span class=&p&&,&/span& &span class=&n&&event&/span&&span class=&p&&,&/span& &span class=&n&&priority&/span&&span class=&p&&));&/span&
&span class=&n&&eventDeleter&/span&&span class=&p&&.&/span&&span class=&n&&take&/span&&span class=&p&&();&/span&
&span class=&n&&event&/span&&span class=&o&&-&&/span&&span class=&n&&posted&/span& &span class=&o&&=&/span& &span class=&nb&&true&/span&&span class=&p&&;&/span&
&span class=&o&&++&/span&&span class=&n&&receiver&/span&&span class=&o&&-&&/span&&span class=&n&&d_func&/span&&span class=&p&&()&/span&&span class=&o&&-&&/span&&span class=&n&&postedEvents&/span&&span class=&p&&;&/span&
&span class=&n&&data&/span&&span class=&o&&-&&/span&&span class=&n&&canWait&/span& &span class=&o&&=&/span& &span class=&nb&&false&/span&&span class=&p&&;&/span&
&span class=&n&&locker&/span&&span class=&p&&.&/span&&span class=&n&&unlock&/span&&span class=&p&&();&/span&
&span class=&n&&QAbstractEventDispatcher&/span&&span class=&o&&*&/span& &span class=&n&&dispatcher&/span& &span class=&o&&=&/span& &span class=&n&&data&/span&&span class=&o&&-&&/span&&span class=&n&&eventDispatcher&/span&&span class=&p&&.&/span&&span class=&n&&loadAcquire&/span&&span class=&p&&();&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&dispatcher&/span&&span class=&p&&)&/span&
&span class=&n&&dispatcher&/span&&span class=&o&&-&&/span&&span class=&n&&wakeUp&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&事件被加入列队,然后通过&b& QAbstractEventDispatcher::wakeUp() &/b&方法唤醒正在被阻塞的 MsgWaitForMultipleObjectsEx 函数:&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&kt&&void&/span& &span class=&n&&QEventDispatcherWin32&/span&&span class=&o&&::&/span&&span class=&n&&wakeUp&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&n&&Q_D&/span&&span class=&p&&(&/span&&span class=&n&&QEventDispatcherWin32&/span&&span class=&p&&);&/span&
&span class=&n&&d&/span&&span class=&o&&-&&/span&&span class=&n&&serialNumber&/span&&span class=&p&&.&/span&&span class=&n&&ref&/span&&span class=&p&&();&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&d&/span&&span class=&o&&-&&/span&&span class=&n&&internalHwnd&/span& &span class=&o&&&&&/span& &span class=&n&&d&/span&&span class=&o&&-&&/span&&span class=&n&&wakeUps&/span&&span class=&p&&.&/span&&span class=&n&&testAndSetAcquire&/span&&span class=&p&&(&/span&&span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&1&/span&&span class=&p&&))&/span& &span class=&p&&{&/span&
&span class=&c1&&// post a WM_QT_SENDPOSTEDEVENTS to this thread if there isn't one already pending&/span&
&span class=&n&&PostMessage&/span&&span class=&p&&(&/span&&span class=&n&&d&/span&&span class=&o&&-&&/span&&span class=&n&&internalHwnd&/span&&span class=&p&&,&/span& &span class=&n&&WM_QT_SENDPOSTEDEVENTS&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&唤醒的方法就是往这个线程所对应的窗体发消息。&/p&&p&&br&&/p&&p&以上就是 Qt 事件系统的一些底层的原理,虽然本文是相对 Windows 平台,但其他平台的实现也是有很多相通之处的,大家也可以自行研究一下。&/p&&p&&br&&/p&&p&了解了这些,我们可以做什么呢?我们可以轻松实现类似 Android 中 &b&HandlerThread&/b& 那样的多线程模式。步骤就是:&/p&&ol&&li&创建一个 QThread;&/li&&li&将需要在新线程中使用的对象(需 QObject 子类,因为要用到 Signals/Slots)移入新线程(&b&QObject::moveToThread()&/b&);&/li&&li&使用 Signals/Slots 或 postEvent 触发对象中的方法。&/li&&/ol&&p&&br&&/p&&p&以上。&/p&
事件系统在 Qt 中扮演了十分重要的角色,不仅 GUI 的方方面面需要使用到事件系统,Signals/Slots 技术也离不开事件系统(多线程间)。我们本文中暂且不描述 GUI 中的一些特殊情况,来说说一个非 GUI 应用程序的事件模型。如果让你写一个程序,打开一个套接…
&figure&&img src=&/v2-165bed09fa783f_b.jpg& data-rawwidth=&640& data-rawheight=&409& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-165bed09fa783f_r.jpg&&&/figure&&p&没啥事儿,就是通知大家一下&/p&&p&&br&&/p&&h2&&b&我要开挂了!&/b&&/h2&&p&听说,锤子、小米2S空气净化器基情上线,你们正蠢蠢欲动?&/p&&p&&br&&/p&&p&听说,你们家内谁谁去年买了戴森、霍尼韦尔、三个爸爸、352、亚都、夏普、三星、飞利浦、莱克、IQ Air、Blue Air 、TDB、海尔、LG、奥郎格、A.O.史密斯、各种FFU……?&/p&&p&值不值得买?有没有买错?&/p&&h2&&b&测!测!测!&/b&&/h2&&figure&&img src=&/v2-becd95116a9_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&700& data-rawheight=&479& data-thumbnail=&/v2-becd95116a9_b.jpg& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/v2-becd95116a9_r.gif&&&/figure&&p&18万采购费、100万检测费,权威实验室:清华大学建筑环境检测中心、北京市理化分析测试中心,41台空气净化器评测结果,正坐着火箭返回放心选!&/p&&p&一台空气净化器不便宜,买错你也舍不得砸。这次空气净化器评测猛料不少,要买的,别捉急。已买的,结果是喜是悲马上揭晓。总之,等我消息!请奔走相告!&/p&&p&&br&&/p&&p&&br&&/p&&p&接受评测的选手们在这里&/p&&p&↓&/p&&figure&&img src=&/v2-4163f46ddd6c6a70c130a8a4b6725178_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&1361& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-4163f46ddd6c6a70c130a8a4b6725178_r.jpg&&&/figure&&p&&br&&/p&&p&哦对了,品牌一般只会标注最高档的CADR(这个CADR可以算出适用面积),但生活中每个档位都会用到吧?于是我把高、中、低档位的CADR都测了,还有噪音。前无古人吧?也可能后无来者吧?你能看到的每个数据都是钱…&/p&&p&&br&&/p&&h2&&b&先来一波剧透图解馋&/b&&/h2&&p&&br&&/p&&p&新鲜到货的锤子畅呼吸净化器↓&/p&&p&(小米2S还在路上堵着)&/p&&figure&&img src=&/v2-82a741a04d68bff3b9010_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&480& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-82a741a04d68bff3b9010_r.jpg&&&/figure&&p&&br&&/p&&p&除霾能力测试の环境仓↓&/p&&figure&&img src=&/v2-165bed09fa783f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&409& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-165bed09fa783f_r.jpg&&&/figure&&p&关舱门,放净化器↓(图中是锤子本锤)&/p&&figure&&img src=&/v2-b71cb1503ccb76c61d78cf_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-b71cb1503ccb76c61d78cf_r.jpg&&&/figure&&p&&br&&/p&&p&释放污染物(红塔山牌香烟)↓&/p&&figure&&img src=&/v2-ee01ec5d9b70d41274eada81f0baf00e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&384& data-rawheight=&216& data-thumbnail=&/v2-ee01ec5d9b70d41274eada81f0baf00e_b.jpg& class=&content_image& width=&384&&&/figure&&p&&br&&/p&&p&谁能经受住考验?↓&/p&&figure&&img src=&/v2-0ea3e79a91d2e01dae8ed_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&358& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-0ea3e79a91d2e01dae8ed_r.jpg&&&/figure&&p&有没有虚标?&/p&&p&会不会打脸?&/p&&p&请持续关注公众号放心选,id:fangxinpingce&/p&&p&随时更新评测进度&/p&&p&&br&&/p&&p&不久的将来&/p&&p&我们再会&/p&&p&&br&&/p&&p&着急的,先戴上防霾口罩挺一挺&/p&&p&&a href=&/?target=http%3A//mp./s%3F__biz%3DMzI5MDYzMTA4MA%3D%3D%26mid%3D%26idx%3D1%26sn%3D0129d7bfd3c9fchksm%3Dec1db53fdb6a3cf8595578dca50dc626eac987a3a0d313bascene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《测了1856个口罩,只有5款值得推荐》&i class=&icon-external&&&/i&&/a&&/p&&p&溜了溜了&/p&&p&&br&&/p&&figure&&img src=&/v2-49e56fbcbc1e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&635& data-rawheight=&357& class=&origin_image zh-lightbox-thumb& width=&635& data-original=&/v2-49e56fbcbc1e_r.jpg&&&/figure&&p&&/p&
没啥事儿,就是通知大家一下 我要开挂了!听说,锤子、小米2S空气净化器基情上线,你们正蠢蠢欲动? 听说,你们家内谁谁去年买了戴森、霍尼韦尔、三个爸爸、352、亚都、夏普、三星、飞利浦、莱克、IQ Air、Blue Air 、TDB、海尔、LG、奥郎格、A.O.史密斯、…
&p&今年刚找完工作的应届生来答一发,校招主要考察基础和思维,主要涉及C++语言基础,数据结构与算法,TCP/IP协议,网络编程,Linux。&/p&&p&虽然面试技巧和心态也很重要,但这里只有24K纯技术干货。&b&点赞后,收藏吧!&/b&&/p&&p&&br&&/p&&h2&C和C++语言基础&/h2&&p&参考书籍:《C++ primer》,《effective C++》,《STL源码解析》,《深度搜索C++对象模型》&/p&&ul&&li&&b&&a href=&///?target=http%3A///yc_sunniwell/archive//1777431.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&extern关键字作用&i class=&icon-external&&&/i&&/a&&/b&&/li&&li&&b&&a href=&///?target=http%3A//blog.csdn.net/shanghairuoxiao/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&static关键字作用&i class=&icon-external&&&/i&&/a&&/b&&/li&&li&&b&volatile是干啥的&/b&&/li&&li&&b&说说const的作用,越多越好&/b&&/li&&li&&b&&a href=&///?target=http%3A//blog.csdn.net/shanghairuoxiao/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&new与malloc区别&i class=&icon-external&&&/i&&/a&&/b&&/li&&li&&b&&a href=&///?target=http%3A//blog.csdn.net/hackbuteer1/article/details/7475622& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++多态性与虚函数表&i class=&icon-external&&&/i&&/a&&/b&&/li&&/ul&&ol&&li&C++多态的实现? &/li&&li&虚函数的作用?&/li&&li&虚函数用于实现多态,这点大家都能答上来但是虚函数在设计上还具有封装和抽象的作用。比如抽象工厂模式。&/li&&li&动态绑定是如何实现的? &/li&&li&&a href=&///?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&静态多态和动态多态&i class=&icon-external&&&/i&&/a&。静态多态是指通过模板技术或者函数重载技术实现的多态,其在编译器确定行为。动态多态是指通过虚函数技术实现在运行期动态绑定的技术。&/li&&li&&b&&a href=&///?target=http%3A//blog.csdn.net/haoel/article/details/1948051/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&虚函数表&i class=&icon-external&&&/i&&/a&&/b&&/li&&li&虚函数表是针对类的还是针对对象的?同一个类的两个对象的虚函数表是怎么维护的?&/li&&li&编译器为每一个类维护一个虚函数表,每个对象的首地址保存着该虚函数表的指针,同一个类的不同对象实际上指向同一张虚函数表。&/li&&/ol&&ul&&li&&b&纯虚函数如何定义,为什么对于存在虚函数的类中析构函数要定义成虚函数&/b& &/li&&li&&b&析构函数能抛出异常吗&/b& &/li&&li&&b&构造函数和析构函数中调用虚函数吗?&/b&&/li&&li&&b&指针和引用的区别&/b&&/li&&li&&b&指针与数组千丝万缕的联系&/b&&/li&&li&&b&&a href=&///?target=http%3A///xiehongfeng100/p/4645555.html& class=& wrap external& t}

我要回帖

更多关于 oppo官网 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信