首页 [Delphi]DELPHI线程的终止和退出

[Delphi]DELPHI线程的终止和退出

举报
开通vip

[Delphi]DELPHI线程的终止和退出[Delphi]DELPHI线程的终止和退出 在Delphi中使用线程,当窗体关闭时,如果窗体中启用了线程,一般需要手动关闭,以释放资源。 常用来结束线程的代码为: PcmThrd.Terminate; PcmThrd.WaitFor; 即先触发Terminate方法,然后等待线程的结束。 这种方法要求线程不能使用 FreeOnTerminate := True; ,否则在WaitFor即将结束的时候会引发“无效句柄”的错误。 这种方法在窗体关闭的时候会等待一段事件(因为WaitFor)。 因此,如...

[Delphi]DELPHI线程的终止和退出
[Delphi]DELPHI线程的终止和退出 在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================== Var hEventDead:Thandle; constructor ThrdMain.Create; begin hEventDead := CreateEvent(0,true,False,‘SMSdesktop‘);//创建对象事件 inherited Create(False); end; //创建对象关闭事件 function ThrdMain.WaitEventDead: Boolean; begin //创建线程 var Thread_Main:ThrdMain ;(调用自我创建的线程对象) Thread_Main:=ThrdMain.Create ; //关闭线程 Thread_Main.WaitEventDead ; Thread_Main.WaitFor ; //=========ThrdMain.pas================== var hEventDead:Thandle; constructor ThrdMain.Create; begin hEventDead := CreateEvent(0,true,False,‘SMSdesktop‘);//创建对象事件 inherited Create(False); end; //创建对象关闭事件 function ThrdMain.WaitEventDead: Boolean; begin ReadSMS:=False; Gbl_ WaitForSingleObject(hEventDead,500);// 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示在0.5秒内强制关闭 end; 多线程的检查,与关闭线程 procedure TDemoThread.Execute; begin inherited; if Assigned(FOnHintText) then FOnHintText(Self); end; procedure TForm1.ShowThreadDemo(Sender: TObject); var i: Integer; begin for i := 0 to 1000 do begin Memo1.Lines.Add(IntToStr(i)); end; end; procedure TForm1.Button2Click(Sender: TObject); var vI: DWord; IsQuit: Boolean; begin Demo := TDemoThread.Create(True); //True:创建时不启动线程 Demo.FreeOnTerminate := True; //设置程结束时自动释放 Demo.FOnHintText := ShowThreadDemo; //Demo.OnTerminate:= ShowThreadDemo; Demo.Resume; //启劫线程 end; procedure TForm1.FormDestroy(Sender: TObject); var vI: DWord; IsQuit: Boolean; begin if Demo <> nil then begin vi := CheckThreadFreed(Demo); //检查当前线程是否在执行 if (vi = 1) or (vi = 2) then TerminateThread(Demo.Handle, vi); //如果线程在执行则强行退出 Demo.Free; end; {if Demo<> nil then begin Demo.Terminate ; Demo.WaitFor ; end;} //等待线程结束,并终止它 end; procedure TForm1.Button1Click(Sender: TObject); begin Demo.Free; end; procedure TForm1.Button4Click(Sender: TObject); var vI: DWord; IsQuit: Boolean; begin //判断当前线程的状态 vI := CheckThreadFreed(Demo); ShowMessage(IntToStr(vI)); end;
本文档为【[Delphi]DELPHI线程的终止和退出】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_180829
暂无简介~
格式:doc
大小:21KB
软件:Word
页数:7
分类:企业经营
上传时间:2017-11-01
浏览量:71