- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
多线程编程_4
delphi多线程编程4
接下来该是 WaitableTimer 对象的回调函数了.多线程编程(16) - 多线程同步之 WaitableTimer (等待定时器对象)[续二]。 想过没有? WaitableTimer 是在 定时等待, 前面例子中的 WaitForSingleObject 等待函数 也在等待, 这就 双重等待 了, 这不好, 太浪费资源. 其实作为同步工具, 前面的几种方法(事件、信号、临界区)基本够用了; WaitableTimer 的作用并不是为了重复前面的功能, 它的主要功用类似 TTimer 类; 譬如每隔多长时间执行一段代码、或在指定的时间去执行一段代码. 既然有了方便的 TTimer, 何必再使用 WaitableTimer 呢? 因为 WaitableTimer 比 TTimer 精确的多, 它的间隔时间可以精确到毫秒、它的指定时间甚至是精确到 0.1 毫秒; 而 TTimer 驱动的 WM_TIMER 消息, 是消息队列中优先级最低的, 也就是再同一时刻 WM_TIMER 消息总是被最后处理. 还有重要的一点 WaitableTimer 可以跨线程、跨进程使用. 继续探讨一个重要的点: 很多时候为了让线程不**, 线程也在等待, 既然有等待, 那 WaitableTimer 非常精确的定时又有什么价值呢? 对这个问题的思考, 可以让我们很好地理解 APC 函数. SetWaitableTimer 有个回调函数(其实是个过程), Windows 要求它的格式是:procedure TimerAPCProc( lpArgToCompletionRoutine: Pointer; dwTimerLowValue: DWORD; dwTimerHighValue: DWORD); stdcall; 函数名中有 APC 的字样, 指示这是个 APC 函数(尽管这个名称无所谓, 这是官方命名), 那什么是 APC 函数? APC(Asyncroneus Procedure Call): 异步过程调用. 原来每个线程除了有单独的消息队列, 还有一个 APC 队列(等待执行的 APC 函数); 如果线程发现 APC 队列中有情况, 马上会跳过去执行, 执行完毕后才回来接着处理消息队列.
说起来麻烦, 使用的时候只按上面格式传入函数指针就行; 不过能进入 APC 队列的回调函数和其他回调函数还有一个很大的不同: SetWaitableTimer 按格式调用 APC 函数后, 需要在 当前线程 见到一个 等待, 此 APC 函数才可以进入队列. 这好像很费解, 例说一下: APC 队列有那么高的优先级, 因为对资源的优先使用会对其他消息有很大的影响, 肯定不能随便进入, 这是不是像生活中的贵宾席或贵宾通道? 也就是说, 要进入 APC 队列只有 SetWaitableTimer 的调用还不够, 还要通过 等待函数 介绍一下. WaitForSingleObject 吗? 不是, 它不够级别; 下面是 Windows 认可的、可以介绍 APC 入列的等待函数:SleepEx();WaitForSingleObjectEx();WaitForMultipleObjectsEx();MsgWaitForMultipleObjectsEx();SignalObjectAndWait(); 为什么是用等待函数来把关? 因为上面几个等待函数也可以等待是否有 APC 函数想入列. 上面给出的几个等待函数, 就 SleepEx 的参数最少, 先用它吧:function SleepEx( dwMilliseconds: DWORD; {毫秒数} bAlertable: BOOL {布尔值}): DWORD; stdcall;//第一个参数和 Sleep 的那个参数是一样的, 是线程等待(或叫挂起)的时间, 时间一到不管后面参数如何都会返回.//第二个参数如果是 False, SleepEx 将不会关照 APC 函数是否入列;//若是 True, 只要有 APC 函数申请, SleepEx 不管第一个参数如何都会把 APC 推入队列并随 APC 函数一起返回.//注意: SetWaitableTimer 和 SleepEx 必须在同一个线程才可以.
本例效果图: 多线程编程(16) - 多线程同步之 WaitableTimer (等待定时器对象)[续二] 代码文件:unit Unit1;interfaceuses Windows, Messages, Sys
文档评论(0)