delphi多线程编程4

delphi多线程编程4

ID:41032321

大小:334.00 KB

页数:15页

时间:2019-08-14

delphi多线程编程4_第1页
delphi多线程编程4_第2页
delphi多线程编程4_第3页
delphi多线程编程4_第4页
delphi多线程编程4_第5页
资源描述:

《delphi多线程编程4》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、delphi多线程编程4接下来该是WaitableTimer对象的回调函数了.多线程编程(16)-多线程同步之WaitableTimer(等待定时器对象)[续二]。  想过没有?WaitableTimer是在"定时等待",前面例子中的WaitForSingleObject等待函数"也在等待",这就"双重等待"了,这不好,太浪费资源.  其实作为同步工具,前面的几种方法(事件、信号、临界区)基本够用了;WaitableTimer的作用并不是为了重复前面的功能,它的主要功用类似TTimer类;譬如每隔多长时间执行一段代码、或在指定的时间去执行一段代码.  既然有了方便的TTi

2、mer,何必再使用WaitableTimer呢?  因为WaitableTimer比TTimer精确的多,它的间隔时间可以精确到毫秒、它的指定时间甚至是精确到0.1毫秒;  而TTimer驱动的WM_TIMER消息,是消息队列中优先级最低的,也就是再同一时刻WM_TIMER消息总是被最后处理.  还有重要的一点WaitableTimer可以跨线程、跨进程使用.  继续探讨一个重要的点:很多时候为了让线程不**,线程也在等待,既然有等待,那WaitableTimer非常精确的定时又有什么价值呢?对这个问题的思考,可以让我们很好地理解APC函数.  SetWaitableTi

3、mer有个回调函数(其实是个过程),Windows要求它的格式是:procedureTimerAPCProc( lpArgToCompletionRoutine:Pointer; dwTimerLowValue:DWORD; dwTimerHighValue:DWORD);stdcall;  函数名中有APC的字样,指示这是个APC函数(尽管这个名称无所谓,这是官方命名),那什么是APC函数?  APC(AsyncroneusProcedureCall):异步过程调用.  原来每个线程除了有单独的消息队列,还有一个APC队列(等待执行的APC函数);如果线程发现APC队列

4、中有情况,马上会跳过去执行,执行完毕后才回来接着处理消息队列.说起来麻烦,使用的时候只按上面格式传入函数指针就行;不过能进入APC队列的回调函数和其他回调函数还有一个很大的不同:  SetWaitableTimer按格式调用APC函数后,需要在"当前线程"见到一个"等待",此APC函数才可以进入队列.  这好像很费解,例说一下:APC队列有那么高的优先级,因为对资源的优先使用会对其他消息有很大的影响,肯定不能随便进入,这是不是像生活中的贵宾席或贵宾通道?  也就是说,要进入APC队列只有SetWaitableTimer的调用还不够,还要通过"等待函数"介绍一下.  Wai

5、tForSingleObject吗?不是,它不够级别;下面是Windows认可的、可以介绍APC入列的等待函数:SleepEx();WaitForSingleObjectEx();WaitForMultipleObjectsEx();MsgWaitForMultipleObjectsEx();SignalObjectAndWait();  为什么是用等待函数来把关?因为上面几个等待函数也可以等待是否有APC函数想入列.  上面给出的几个等待函数,就SleepEx的参数最少,先用它吧:functionSleepEx( dwMilliseconds:DWORD;{毫秒数} b

6、Alertable:BOOL   {布尔值}):DWORD;stdcall;//第一个参数和Sleep的那个参数是一样的,是线程等待(或叫挂起)的时间,时间一到不管后面参数如何都会返回.//第二个参数如果是False,SleepEx将不会关照APC函数是否入列;//若是True,只要有APC函数申请,SleepEx不管第一个参数如何都会把APC推入队列并随APC函数一起返回.//注意:SetWaitableTimer和SleepEx必须在同一个线程才可以.本例效果图:  多线程编程(16)-多线程同步之WaitableTimer(等待定时器对象)[续二]  代码文件:un

7、itUnit1;interfaceuses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms, Dialogs,ExtCtrls,StdCtrls;type TForm1=class(TForm)  Button1:TButton;  procedureButton1Click(Sender:TObject);  procedureFormDestroy(Sender:TObject); end;var Form1:TForm1;impleme

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。