![[Delphi]DELPHI 线程的终止和退出.doc_第1页](http://file.renrendoc.com/FileRoot1/2020-1/7/432fc4e6-36ca-42aa-b461-97a523a51af1/432fc4e6-36ca-42aa-b461-97a523a51af11.gif)
![[Delphi]DELPHI 线程的终止和退出.doc_第2页](http://file.renrendoc.com/FileRoot1/2020-1/7/432fc4e6-36ca-42aa-b461-97a523a51af1/432fc4e6-36ca-42aa-b461-97a523a51af12.gif)
![[Delphi]DELPHI 线程的终止和退出.doc_第3页](http://file.renrendoc.com/FileRoot1/2020-1/7/432fc4e6-36ca-42aa-b461-97a523a51af1/432fc4e6-36ca-42aa-b461-97a523a51af13.gif)
![[Delphi]DELPHI 线程的终止和退出.doc_第4页](http://file.renrendoc.com/FileRoot1/2020-1/7/432fc4e6-36ca-42aa-b461-97a523a51af1/432fc4e6-36ca-42aa-b461-97a523a51af14.gif)
![[Delphi]DELPHI 线程的终止和退出.doc_第5页](http://file.renrendoc.com/FileRoot1/2020-1/7/432fc4e6-36ca-42aa-b461-97a523a51af1/432fc4e6-36ca-42aa-b461-97a523a51af15.gif)
已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在Delphi中使用线程,当窗体关闭时,如果窗体中启用了线程,一般需要手动关闭,以释放资源。 常用来结束线程的代码为:PcmThrd.Terminate;PcmThrd.WaitFor;即先触发Terminate方法,然后等待线程的结束。这种方法要求线程不能使用 FreeOnTerminate := True; ,否则在WaitFor即将结束的时候会引发“无效句柄”的错误。这种方法在窗体关闭的时候会等待一段事件(因为WaitFor)。因此,如果不是在主窗体中结束线程时,其实我们可以不必使用WaitFor。而是采用如下方法:将FreeOnTerminate := True;这样在窗体关闭的代码中直接调用PcmThrd.Terminate;即可。注意:如果设置了PcmThrd.OnTerminate := SomeFunction;那么在调用PcmThrd.Terminate;前尽量将PcmThrd.OnTerminate := nil,以免结束线程后SomeFunction中的变量出现空指针错误。当然,这不是绝对的,需要根据具体程序而定DELPHI 线程的终止和退出 1)自动退出: 一个线程从execute()过程中退出,即意味着线程的终止,此时将调用windows的exitthread()函数来清除线程所占用的堆栈。 如果线程对象的 freeonterminate 属性设为true,则线程对象将自动删除,并释放线程所占用的资源。 这是消除线程对象最简单的办法。 2)受控退出: 利用线程对象的terminate属性,可以由进程或者由其他线程控制线程的退出。只需要简单的调用该线程的terminate方法,并设直线程对象的terminate属性为true。 在线程中,应该不断监视terminate的值,一旦发现为true,则退出,例如在execute()过程中可以这样写: while not terminated do begin . end; 3)退出的api 函数: 关于线程退出的api 函数声明如下:code function terminatethread(hthread:thandle;dwexitcode:dword); 不过,这个函数会使代码立刻终止,而不管程序中有没有 try.finally 机制,可能会导致错误,不到万不得已,最好不要使用。 4) 利用挂起线程的方法(suspend) 利用挂起线程的suspend方法,后面跟个free,也可以释放线程,例如: thread1.suspend; /挂起 thread2.free; /释放遇到的 Code:1400 无效窗口句柄 的问题,关闭不了程序最近写程序,遇到的 Code:1400 无效窗口句柄 的问题,关闭不了程序?!似乎是在线程里调用了主窗体的东西,使得释放的先后次序被打乱了,所以句柄有问题!但是要找到问题的根源太麻烦了,这时有招必杀技!大家要记好了,有类似的无法关闭程序的问题,一句搞定!ExitProcess(0);简单的说就是终止自己的进程!虽然是暴力了一点,但是绝对有效!但是这种方法不会触发onclose之类的事件,可以说是不触发任何事件,无痛无痒地结束了进程,干净利落,所以要记得在结束之前保存必要的数据,做必要的操作,最好是释放一下内存,在Win下结束进程是非常不干净的,会有内存残留。获取线程状态Function CheckThreadFreed(aThread: TThread): Byte;var i: DWord; IsQuit: Boolean; begin if Assigned(aThread) then begin IsQuit := GetExitCodeThread(aThread.Handle, i); if IsQuit then /If the function succeeds, the return value is nonzero. /If the function fails, the return value is zero. begin if i = STILL_ACTIVE then /If the specified thread has not terminated, /the termination status returned is STILL_ACTIVE. Result := 1 else Result := 2; /aThread未Free,因为Tthread.Destroy中有执行语句 end else Result := 0; /可以用GetLastError取得错误代码 end else Result := 3; end;快速关闭线程/=ThrdMain.pas=VarhEventDead:Thandle;constructor ThrdMain.Create;beginhEventDead := CreateEvent(0,true,False,SMSdesktop);/创建对象事件inherited Create(False);end;/创建对象关闭事件function ThrdMain.WaitEventDead: Boolean;begin /创建线程varThread_Main:ThrdMain ;(调用自我创建的线程对象)Thread_Main:=ThrdMain.Create ;/关闭线程Thread_Main.WaitEventDead ;Thread_Main.WaitFor ;/=ThrdMain.pas=varhEventDead:Thandle;constructor ThrdMain.Create;beginhEventDead := CreateEvent(0,true,False,SMSdesktop);/创建对象事件inherited Create(False);end;/创建对象关闭事件function ThrdMain.WaitEventDead: Boolean;beginGbl_ReadSMS:=False;WaitForSingleObject(hEventDead,500);/表示在0.5秒内强制关闭end; 多线程的检查,与关闭线程procedure TDemoThread.Execute;begininherited;if Assigned(FOnHintText) then FOnHintText(Self);end;procedure TForm1.ShowThreadDemo(Sender: TObject);vari: Integer;beginfor i := 0 to 1000 dobegin Memo1.Lines.Add(IntToStr(i);end;end;procedure TForm1.Button2Click(Sender: TObject);varvI: DWord;IsQuit: Boolean;beginDemo := TDemoThread.Create(True); /True:创建时不启动线程Demo.FreeOnTerminate := True; /设置程结束时自动释放Demo.FOnHintText := ShowThreadDemo;/Demo.OnTerminate:= ShowThreadDemo;Demo.Resume; /启劫线程end;procedure TForm1.FormDestroy(Sender: TObject);varvI: DWord;IsQuit: Boolean;beginif Demo <> nil thenbegin vi := CheckThreadFreed(Demo); /检查当前线程是否在执行 if (vi = 1) or (vi = 2) then TerminateThread(Demo.Handle, vi); /如果线程在执行则强行退出 Demo.Free;end;if Demo nil thenbegin Demo.Terminate ; Demo.WaitFor ;end; /等待线程结束,并终止它end;procedure TForm1.Button1Click(Send
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第三节 生活中的圆周运动说课稿-2025-2026学年高中物理粤教版2019必修 第二册-粤教版2019
- 第5课 四点底与皿字底教学设计-2025-2026学年小学书法练习指导五年级上册西泠版
- 化肥厂咨询供应商考核办法
- 2025合同样本:网络直播主播合同示范文本
- 广东省廉江市实验学校高中政治 6.2 股票、债券和保险1说课稿(必修1)
- 第1课 走进人工智能 说课稿- 2024-2025学年浙教版(2023)初中信息技术八年级下册
- 木材销售合同
- 第3节 测量液体和固体的密度说课稿-2025-2026学年初中物理人教版2024八年级上册-人教版2024
- 2.2.2大气热力环流-教学设计2023-2024学年高中地理人教版(2019)必修一
- 古诗词诵读《桂枝香·金陵怀古》教学设计高中语文必修下册同步教学设计(统编版2019)
- 重离子、质子治疗前景与适应症-武汉
- 组织行为学(-)(英文版)课件
- 商务谈判(完整版)课件
- 小学数学教师新课标考试试题
- 小学数学北师大四年级上册五方向与位置四上《用数对确定位置》北师大版李雪梅PPT
- 步进电机控制系统课件
- 2022年混凝土预制U型槽单元工程质量评定表
- 井喷及井喷失控案例教育
- 职业发展与就业创业指导ppt课件完整版
- 挠度计算模板表格(自动版)
- 宝钢集团生产安全事故案例汇编
评论
0/150
提交评论