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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

delphi之多线程编程.docx

1、delphi之多线程编程delphi之多线程编程(一)本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅。所有代码均亲自测试 delphi7下测试有效。图片均为自己制作。多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以仅仅是看上去会一些,明白了2+2的时候,其实我还不知道1+1。开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解.先试试这个:procedureTForm1.Button1Click(Sender:TObject);vari:Integer;beginfori:=0to500000dobeginCanvas.TextOut

2、(10,10,IntToStr(i);end;end;上面程序运行时, 我们的窗体基本是 死 的, 可以在你在程序运行期间拖动窗体试试.Delphi 为我们提供了一个简单的办法(Application.ProcessMessages)来解决这个问题:procedureTForm1.Button1Click(Sender:TObject);vari:Integer;beginfori:=0to500000dobeginCanvas.TextOut(10,10,IntToStr(i);Application.ProcessMessages;end;end;这个 Application.Proces

3、sMessages; 一般用在比较费时的循环中, 它会检查并先处理消息队列中的其他消息.但这算不上多线程, 譬如: 运行中你拖动窗体, 循环会暂停下来.在使用多线程以前, 让我们先简单修改一下程序:functionMyFun:Integer;vari:Integer;beginfori:=0to500000dobeginForm1.Canvas.Lock;Form1.Canvas.TextOut(10,10,IntToStr(i);Form1.Canvas.Unlock;end;Result:=0;end;procedureTForm1.Button1Click(Sender:TObject)

4、;beginMyFun;end;细数上面程序的变化:1、首先这还不是多线程的, 也会让窗体假 死 一会;2、把执行代码写在了一个函数里, 但这个函数不属于 TForm1 的方法, 所以使用 Canvas 是必须冠以名称(Form1);3、既然是个函数, (不管是否必要)都应该有返回值;4、使用了 500001 次 Lock 和 Unlock.Canvas.Lock 好比在说: Canvas(绘图表面)正忙着呢, 其他想用 Canvas 的等会;Canvas.Unlock : 用完了, 解锁!在 Canvas 中使用 Lock 和 Unlock 是个好习惯, 在不使用多线程的情况下这无所谓, 但

5、保不准哪天程序会扩展为多线程的; 我们现在学习多线程, 当然应该用.在 Delphi 中使用多线程有两种方法: 调用 API、使用 TThread 类; 使用 API 的代码更简单.functionMyFun(p:Pointer):Integer;stdcall;vari:Integer;beginfori:=0to500000dobeginForm1.Canvas.Lock;Form1.Canvas.TextOut(10,10,IntToStr(i);Form1.Canvas.Unlock;end;Result:=0;end;procedureTForm1.Button1Click(Send

6、er:TObject);varID:THandle;beginCreateThread(nil,0,MyFun,nil,0,ID);end;代码分析:CreateThread 一个线程后, 算上原来的主线程, 这样程序就有两个线程、是标准的多线程了;CreateThread 第三个参数是函数指针, 新线程建立后将立即执行该函数, 函数执行完毕, 系统将销毁此线程从而结束多线程的故事.CreateThread 要使用的函数是系统级别的, 不能是某个类(譬如: TForm1)的方法, 并且有严格的格式(参数、返回值)要求, 不管你暂时是不是需要都必须按格式来;因为是系统级调用, 还要缀上 stdc

7、all, stdcall 是协调参数顺序的, 虽然这里只有一个参数没有顺序可言, 但这是使用系统函数的惯例.CreateThread 还需要一个 var 参数来接受新建线程的 ID, 尽管暂时没用, 但这也是格式; 其他参数以后再说吧.这样一个最简单的多线程程序就出来了, 咱们再用 TThread 类实现一次typeTMyThread=class(TThread)protectedprocedureExecute;override;end;procedureTMyThread.Execute;vari:Integer;beginFreeOnTerminate:=True;这可以让线程执行完毕后

8、随即释放fori:=0to500000dobeginForm1.Canvas.Lock;Form1.Canvas.TextOut(10,10,IntToStr(i);Form1.Canvas.Unlock;end;end;procedureTForm1.Button1Click(Sender:TObject);beginTMyThread.Create(False);end;TThread 类有一个抽象方法(Execute), 因而是个抽象类, 抽象类只能继承使用, 上面是继承为 TMyThread.继承 TThread 主要就是实现抽象方法 Execute(把我们的代码写在里面), 等我们的

9、 TMyThread 实例化后, 首先就会执行 Execute 方法中的代码.按常规我们一般这样去实例化:procedureTForm1.Button1Click(Sender:TObject);varMyThread:TMyThread;beginMyThread:=TMyThread.Create(False);end;因为 MyThread 变量在这里毫无用处(并且编译器还有提示), 所以不如直接写做 TMyThread.Create(False);我们还可以轻松解决一个问题, 如果: TMyThread.Create(True) ?这样线程建立后就不会立即调用 Execute, 可以在

10、需要的时候再用 Resume 方法执行线程, 譬如:procedureTForm1.Button1Click(Sender:TObject);varMyThread:TMyThread;beginMyThread:=TMyThread.Create(True);MyThread.Resume;end;/可简化为:procedureTForm1.Button1Click(Sender:TObject);beginwithTMyThread.Create(True)doResume;end;一、入门、functionCreateThread(lpThreadAttributes:Pointer;安

11、全设置dwStackSize:DWORD;堆栈大小lpStartAddress:TFNThreadStartRoutine;入口函数lpParameter:Pointer;函数参数dwCreationFlags:DWORD;启动选项varlpThreadId:DWORD输出线程ID):THandle;stdcall;返回线程句柄在 Windows 上建立一个线程, 离不开 CreateThread 函数;TThread.Create 就是先调用了 BeginThread (Delphi 自定义的), BeginThread 又调用的 CreateThread.既然有建立, 就该有释放, Cre

12、ateThread 对应的释放函数是: ExitThread, 譬如下面代码:procedureTForm1.Button1Click(Sender:TObject);beginExitThread(0);此句即可退出当前程序,但不建议这样使用end;代码注释:当前程序是一个进程, 进程只是一个工作环境, 线程是工作者;每个进程都会有一个启动线程(或叫主线程), 也就是说: 我们之前大量的编码都是写给这个主线程的;上面的 ExitThread(0); 就是退出这个主线程;系统不允许一个没有线程的进程存在, 所以程序就退出了.另外: ExitThread 函数的参数是一个退出码, 这个退出码是给

13、之后的其他函数用的, 这里随便给个无符号整数即可.或许你会说: 这个 ExitThread 挺好用的; 其实不管是用 API 还是用 TThread 类写多线程, 我们很少用到它; 因为:1、假如直接使用 API 的 CreateThread, 它执行完入口函数后会自动退出, 无需 ExitThread;2、用 TThread 类建立的线程又绝不能使用 ExitThread 退出; 因为使用 TThread 建立线程时会同时分配更多资源(譬如你自定义的成员、还有它的祖先类(TObject)分配的资源等等), 如果用 ExitThread 给草草退出了, 这些资源将得不到释放而导致内存泄露. 尽管 Delphi 提供了 EndThread(其内部调用 ExitThread), 这也不需要我们手动操作(假如非要手动操作也是件很麻烦的事情, 因为很多时候你不知道线程是什么时候执行完毕的).除了 CreateThread, 还有一个 CreateRemoteThread, 可在其他进程中建立线程, 这不应该是现在学习的重点;现在先集中精力把 CreateThread 的参数搞彻底.倒着来吧, 先谈谈 CreateThread 将要返回的 线程句柄.句柄

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

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