ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:297.90KB ,
资源ID:16616700      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16616700.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(delphi多线程编程4Word文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

delphi多线程编程4Word文档格式.docx

1、lpArgToCompletionRoutine: Pointer;dwTimerLowValue: DWORD;dwTimerHighValue: DWORD); stdcall;函数名中有 APC 的字样, 指示这是个 APC 函数(尽管这个名称无所谓, 这是官方命名), 那什么是 APC 函数?APC(Asyncroneus Procedure Call): 异步过程调用.原来每个线程除了有单独的消息队列, 还有一个 APC 队列(等待执行的 APC 函数); 如果线程发现 APC 队列中有情况, 马上会跳过去执行, 执行完毕后才回来接着处理消息队列.说起来麻烦, 使用的时候只按上面格式

2、传入函数指针就行; 不过能进入 APC 队列的回调函数和其他回调函数还有一个很大的不同:SetWaitableTimer 按格式调用 APC 函数后, 需要在 当前线程 见到一个 等待, 此 APC 函数才可以进入队列.这好像很费解, 例说一下: APC 队列有那么高的优先级, 因为对资源的优先使用会对其他消息有很大的影响, 肯定不能随便进入, 这是不是像生活中的贵宾席或贵宾通道?也就是说, 要进入 APC 队列只有 SetWaitableTimer 的调用还不够, 还要通过 等待函数 介绍一下.WaitForSingleObject 吗? 不是, 它不够级别; 下面是 Windows 认可的

3、、可以介绍 APC 入列的等待函数:SleepEx();WaitForSingleObjectEx();WaitForMultipleObjectsEx();MsgWaitForMultipleObjectsEx();SignalObjectAndWait();为什么是用等待函数来把关? 因为上面几个等待函数也可以等待是否有 APC 函数想入列.上面给出的几个等待函数, 就 SleepEx 的参数最少, 先用它吧:function SleepEx(dwMilliseconds: 毫秒数bAlertable: BOOL 布尔值):/第一个参数和 Sleep 的那个参数是一样的, 是线程等待(或叫

4、挂起)的时间, 时间一到不管后面参数如何都会返回./第二个参数如果是 False, SleepEx 将不会关照 APC 函数是否入列;/若是 True, 只要有 APC 函数申请, SleepEx 不管第一个参数如何都会把 APC 推入队列并随 APC 函数一起返回./注意: SetWaitableTimer 和 SleepEx 必须在同一个线程才可以.本例效果图:多线程编程(16) - 多线程同步之 WaitableTimer (等待定时器对象)续二代码文件:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Clas

5、ses, Graphics, Controls, Forms,Dialogs, ExtCtrls, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);procedure FormDestroy(Sender:end;varForm1: TForm1;implementation$R *.dfmhTimer: THandle;APC 函数(过程), 函数名和参数名可以不同, 格式必须如此procedure TimerAPCProc(lpArgToCompletion

6、Routine: dwTimerLowValue: DWORD);beginForm1.Text := IntToStr(StrToIntDef(Form1.Text, 0) + 1); 标题 + 1end;procedure TForm1.Button1Click(Sender:DueTime: Int64;hTimer := CreateWaitableTimer(nil, True, nil);DueTime := 0;if SetWaitableTimer(hTimer, DueTime, 0, TimerAPCProc, nil, False) thenbeginSleepEx(IN

7、FINITE, True); INFINITE 表示一直等procedure TForm1.FormDestroy(Sender:CloseHandle(hTimer);end.窗体文件:object Form1: TForm1Left = 0Top = 0Caption = Form1ClientHeight = 113ClientWidth = 203Color = clBtnFaceFont.Charset = DEFAULT_CHARSETFont.Color = clWindowTextFont.Height = -11Font.Name = TahomaFont.Style = O

8、ldCreateOrder = FalsePixelsPerInch = 96TextHeight = 13object Button1: TButtonLeft = 64Top = 48Width = 75Height = 25Caption = Button1TabOrder = 0OnClick = Button1Clickendend在上面例子中, 每点一次鼠标, 那个回调函数才执行一次; 作为定时器, 如果想让它每秒执行一次怎么弄?但每一次执行那个 APC 函数, 都得有 SleepEx(当然不止它)给送进去, 那这样得反复调用 SleepEx 才可以.怎么调用, 用循环吗? 别说网

9、上能找到的例子我没见到不用循环的(太笨了), 就在那个 APC 函数里调用不就完了.当然这时一般要设时间间隔的, 下面我们将设间隔为 1000(1秒).但接着问题又来了, 譬如把代码修改成:SleepEx(INFINITE, True); 这里再次调用 SleepEx下面的参数 1000 表示间隔 1秒if SetWaitableTimer(hTimer, DueTime, 1000, TimerAPCProc, nil, False) then任务能完成, 但窗体死了. 怎么办? 嘿, 现在学的不是多线程吗?下面例子中, 同时使用了 CancelWaitableTimer 来取消定时器, 很

10、好理解; 效果图:Button2:procedure Button2Click(Sender:APC 函数线程入口函数function MyThreadFun(p: Pointer): Integer;SetWaitableTimer 必须与 SleepEx 在同一线程Result :ID:建立 WaitableTimer 对象if hTimer = 0 thenhTimer :CreateThread(nil, 0, MyThreadFun, nil, 0, ID); 建立线程procedure TForm1.Button2Click(Sender:CancelWaitableTimer(h

11、Timer); 取消定时器窗体文件:Left = 55Top = 32Width = 97Caption = #21551#21160#23450#26102#22120object Button2:Top = 63Caption = #21462#28040#23450#26102#22120TabOrder = 1OnClick = Button2Click使用 APC 回调函数才是 WaitableTimer 的正途, 下次该是如何给这个函数传递参数了.多线程编程(17) - 多线程同步之 WaitableTimer (等待定时器对象)续三。根据 WaitableTimer 的主要功用,

12、 现在再把它放在 线程同步 的话题中讨论有点不合适了, 就要结束它./重新看看那个 APC 回调函数的格式:dwTimerLowValue, dwTimerHighValue:TimerAPCProc 的后两个参数其实是在传递一个值, 使用时要把它们合并为一个 TFileTime 类型的时间.这个时间是 APC 函数被调用的时间, 稍稍修改上面一个例子看一下:多线程编程(17) - 多线程同步之 WaitableTimer (等待定时器对象)续三Dialogs, StdCtrls;UTCFileTime,LocalFileTime: TFileTime;SystemTime: TSystemT

13、ime;DateTime: TDateTime;把 dwTimerLowValue 与 dwTimerHighValue 和并为一个 TFileTime 格式的时间UTCFileTime.dwLowDateTime := dwTimerLowValue;UTCFileTime.dwHighDateTime := dwTimerHighValue;FileTimeToLocalFileTime(UTCFileTime, LocalFileTime); 从世界标准计时到本地时间FileTimeToSystemTime(LocalFileTime, SystemTime); 转到系统格式时间Date

14、Time := SystemTimeToDateTime(SystemTime);再转到 TDateTime= DateTimeToStr(DateTime);ClientHeight = 86ClientWidth = 256Left = 23Left = 134SetWaitableTimer 中回调函数后面的指针参数, 将被传递给 APC 函数的第一个参数;作为指针它可以携带任何数据, 这里让它携带了一个坐标点(鼠标点击窗体的位置), 下例效果图:procedure FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);pt: TPoint;AP

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1