- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE
PAGE #/ 6
在Invoke或者Beginlnvoke的使用中无一例外地使用了委托 Delegate,至于
委托的本质请参考我的另一随笔:
一、为什么 Control 类提供了 Invoke 和 Beginlnvoke机制?
1、 windows 程序消息机制
WindowsGUl 程序是基于消息机制的,有个主线程维护着一个消息泵。这个 消息泵让 windows 程序生生不息。
Win dows GUI程序的消息循环
Windows 程序有个消息队列,窗体上的所有消息是这个队列里面消息的最 主要来源。这里的while循环使用了 GetMessage ()这个方法,这是个阻塞方 法,也就是队列为空时方法就会被阻塞,从而这个 while 循环停止运动,这避免 了一个程序把 cpu 无缘无故地耗尽,让其它程序难以得到响应。当然在某些需 要cpu最大限度运动的程序里面就可以使用另外的方法,例如某些 3d游戏或者
及时战略游戏中,一般会使用 PeekMessage ()这个方法,它不会被 windows 阻塞,从而保证整个游戏的流畅和比较高的帧速。
这个主线程维护着整个窗体以及上面的子控件。当它得到一个消息,就会 调用DispatchMessage方法派遣消息,这会引起对窗体上的窗口过程的调用。窗 口过程里面当然是程序员提供的窗体数据更新代码和其它代码。
public static void Main(string[] args){Form f = new Form();
3、线程外操作 GUI 控件的问题
如果从另外一个线程操作 windows 窗体上的控件,就会和主线程产生竞 争,造成不可预料的结果,甚至死锁。因此 win dows GUI编程有一个规则,就 是只能通过创建控件的线程来操作控件的数据,否则就可能产生不可预料的结 果。
public interface
ISynchronizeInvoke{[HostProtection(SecurityAction.LinkDemand,Synchronization=tru e,ExternalThreading=true)]
IAsyncResult BeginInvoke(Delegate method, object[] args);
object EndInvoke(IAsyncResult result);
object Invoke(Delegate method, object[] args);
bool InvokeRequired { get; }}}
如果从线程外操作 windows 窗体控件,那么就需要使用 Invoke 或者
Begi nln voke方法,通过一个委托把调用封送到控件所属的线程上执行。
二、消息机制 线程间和进程间通信机制
1、window 消息发送
Windows 消息机制是 windows 平台上的线程或者进程间通信机制之一。
Windows 消息值其实就是定义的一个数据结构,最重要的是消息的类型,它就 是一个整数;然后就是消息的参数。消息的参数可以表示很多东西。
Windows 提供了一些 api 用来向一个线程的消息队列发送消息。因此,一个 线程可以向另一个线程的消息队列发送消息从而告诉对方做什么,这样就完成 了线程间的通信。有些api发送消息需要一个窗口句柄,这种函数可以把消息发 送到指定窗口的主线程消息队列;而有些则可以直接通过线程句柄,把消息发 送到该线程消息队列中。用消息机制通信
SendMessage是windows api,用来把一个消息发送到一个窗口的消息队 列。这个方法是个阻塞方法,也就是操作系统会确保消息的确发送到目的消息 队列,并且该消息被处理完毕以后,该函数才返回。返回之前,调用者将会被 暂时阻塞。
PostMessage也是一个用来发送消息到窗口消息队列的 api函数,但这个方
法是非阻塞的。也就是它会马上返回,而不管消息是否真的发送到目的地,也 就是调用者不会被阻塞。
2、 Invoke and BeginInvoke
Invoke or BeginInvoke
Invoke或者Beginlnvoke方法都需要一个委托对象作为参数。委托类似于回 调函数的地址,因此调用者通过这两个方法就可以把需要调用的函数地址封送 给界面线程。这些方法里面如果包含了更改控件状态的代码,那么由于最终执 行这个方法的是界面线程,从而避免了竞争条件,避免了不可预料的问题。如 果其它线程直接操作界面线程所属的控件,那么将会产生竞争条件,造成不可 预料的结果。
使用Invoke完成一个委托方法的封送,就类似于使用 SendMessage方法来 给界面线程发送消息,是一个同步方法。也就是说在 Inv oke封送
您可能关注的文档
- 2017触电演习总结报告.docx
- 2019端午节新祝福语.docx
- 2019给爸爸的新年祝福语大全.docx
- 2019教科版小学科学二年级教.docx
- 2019考生小升初祝福语.docx
- 2019年激励人心的句子经典,经典激励.docx
- 2019年经典新年祝福语大全.docx
- 2019年最新关于食品安全知识讲座观.docx
- 2019申论名言警句.docx
- 2019新春祝福语外交.docx
- 辽宁省葫芦岛市兴城高级中学2026届化学高二第一学期期中调研试题含解析.doc
- 2025年新能源汽车电池回收处理技术标准制定及实施报告.docx
- 无人机反制系统技术标准制定2025年标准制定与技术创新.docx
- 颈内静脉小撕裂护理个案.pptx
- 铁路物流行业重载化技术创新对产业发展影响分析报告.docx
- 2025新能源汽车智能驾驶算法在自动驾驶控制策略中的应用报告.docx
- 2025年碳捕捉与封存(CCUS)技术在工业领域的应用研究报告.docx
- 图形认知课程设计中的数学思维训练模式研究.docx
- 低空经济政策落地对航空产业政策实施效果跟踪报告.docx
- 2025年风力发电项目生态环境影响评估与政策优化建议报告.docx
最近下载
- YST 582-2013 电池级碳酸锂.pdf
- 淘股吧高手语录.docx VIP
- 2024~2025学年上学期七年级第一次月考数学试题(含答案).pdf VIP
- GB-T6284-1986化工产品中水分含量测定的通用方法重量法.pdf
- MSC:人工智能赋能可持续发展和投资白皮书.pdf VIP
- 24J306 窗井、设备吊装口、排水沟、集水坑图集.docx VIP
- 2014年深圳市坪山新区主要病媒生物监测及白纹伊蚊抗药性研究.pdf VIP
- T∕CBDA 69-2023 建筑装饰装修碳排放计算标准.pdf
- 国际私法(暨南大学)中国大学MOOC 慕课 章节测验 期末考试答案.docx VIP
- 金风2.5MW机组运行维护手册(1)(1).doc VIP
文档评论(0)