Delphi线程的终止

  当线程对象的Execute()执行完毕的时候,我们就认为此线程终止了。这时候,它会调用Delphi的一个标准例程EndThread(),这个例程再调用API函数ExitThread()。由ExitThread()来清除线程所占用的栈。

  当结束使用TThread对象的时候,应该确保已经把这个Object Pascal对象从内存中清除了。这才能确保所有内存占有都释放掉,尽管在进程终止时候会自动清除所有的线程对象,但是及时清除已经不再使用的对象,可以使内存的使用效率提高。利用将FreeOnTerminate的属性设置为True的方法来及时清除线程对象时最方便的方法,这只需要在Execute()退出前设置就行了,设置的方法如下

procedure TTestThread.Execute();
var
    i : Integer;
begin
    FreeOnTerminate := True;
    for i:=1 to 200000 do
        Inc(Answer, Round(Abs(Sin(Sqrt(i)))));
end;

  这样,当一个线程终止的时候,就会触发OnTerminate事件,就有机会在事件处理过程内清除线程对象了

  提示:OnTerminate事件是在主线程的环境中发生的。这就意味着,在处理这个事件的处理过程中,你可以不需要借助Synchronize()而自由地访问VCL

  要记住,Execute()需要经常性的检查Terminated属性的值,来确认是否要提前退出。尽管这将意味着当使用线程工作时,你必须关心更多的事情,但它能确保在线程结束时,能够完成必要的清除。下面是一段在Execute()增加处理操作的简单代码

procedure TTestThread.Execute;
var
    i : Integer;
begin
    FreeOnTerminate := True;
    for i:=1 to 2000000 do
    begin
        if Terminated then
            break;
        inc(Answer, Round(Abs(Sin(Sqrt(i)))));
    end;
end;

  注意,在某些紧急情况下,你可以使用Win32 API函数TerminateThread()来终止一个线程。但是除非没有其他的方法,否则不要使用它。例如,当线程代码陷入死循环的时候。TerminateThread()的声明如下

function TerminateThread(hThread : THandle; dwExitCode : DWORD);

  TThread的Handle属性可以作为第一个参数,因此,TerminateThread()长被这样调用

TerminateThread(MyHosedThread.Handle, 0);

  如果选择使用这个函数,应该考虑它的负面影响。

  首先,此函数在Windows NT与Windows95/98下面并不相同。在Windows95/98下,这个函数能够自动清除线程所占用的栈;而在Windows NT下,这进程被终止之前栈仍被保留。

  其次,无论线程代码中是否有 try... finally 块,这个函数都会使线程立即停止执行。这就意味着,被线程打开的文件没有被关闭、有线程申请的内存没有被释放等情况。而且,这个函数在终止县曾的时候也不通知DLL,当DLL关闭时,这也容易出现问题

时间: 2024-08-24 14:20:12

Delphi线程的终止的相关文章

多线程的基本概念和Delphi线程对象Tthread介绍

多线程的基本概念和Delphi线程对象Tthread介绍 作者:xiaoru WIN 98/NT/2000/XP是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU运行时间和资源,或者说,把CPU 时间划成片,每个片分给不同的线程,这样,每个线程轮流的“挂起”和“唤醒”,由于时间片很小,给人的感觉是同时运行的. 多线程带来如下好处: 1)避免瓶颈: 2)并行操作: 3)提高效率:多线程的两个概念: 1) 进程:也称任务,程序载入内存,并分配资源,称为“一个进程”. 注意

TMsgThread, TCommThread -- 在delphi线程中实现消息循环(105篇博客,好多研究消息的文章)

在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使用很方便,但是有时候我们需要在线程类中使用消息循环,delphi没有提供. 花了两天的事件研究了一下win32的消息系统,写了一个线程内消息循环的测试. 但是没有具体应用过,贴出来给有这方面需求的DFW参考一下.希望大家和我讨论. {----------------------------------------------------------------------------- Unit

Delphi线程池

unit uThreadPool; {   aPool.AddRequest(TMyRequest.Create(RequestParam1, RequestParam2, ...)); } interfaceuses  Windows,  Classes; // 是否记录日志// {$DEFINE NOLOGS} type  TCriticalSection = class(TObject)  protected    FSection: TRTLCriticalSection;  publi

等待线程的终止

在一些情形下,我们必须等待线程的终止.例如,我们的程序在执行其他的任务时,必须先初始化一些必须的资源.可以使用线程来完成这些初始化任务,等待线程终止,再执行程序的其他任务. 为了达到这个目的,我们使用Thread类的join()方法.当一个线程对象的join()方法被调用时,调用它的线程将被挂起,直到这个线程对象完成它的任务. package concurrency; import java.util.Date; import java.util.concurrent.TimeUnit; pub

delphi 线程教学第六节:TList与泛型

第六节: TList 与泛型 TList 是一个重要的容器,用途广泛,配合泛型,更是如虎添翼. 我们先来改进一下带泛型的 TList 基类,以便以后使用. 本例源码下载(delphi XE8版本): FooList.Zip unit uFooList; interface uses   Generics.Collections; type   TFooList <T>= class(TList<T>)   private     procedure FreeAllItems;   

挂起起线程与终止线程的区别

Program1 p1 = new Program1(); Thread th = new Thread(new ThreadStart(p1.ThreadRunMethord));//创建一个新的子线程 if (th.ThreadState != ThreadState.Running)//判断子线程未开始时运行 { th.Start();//启动子线程 } Thread.Sleep(1000);//主线程休眠1秒钟 Console.WriteLine("子线程被挂起而暂停"); i

线程的终止stop与线程的中断interrupted

线程除了运行完毕,自动进入死亡状态,也可以手动进行停止,Thread类也提供了2个类方法来进行线程的停止. 一.stop 如图所示,stop方法已经被标记为过时的,不推荐的.因为这这个方法太过于暴力,会立即杀死进程,导致数据不能同步,带来很难排查的错误. 下面是一段造成错误信息的代码: 1 public class StopThreadUnsafe { 2 public static User u = new User(); 3 4 public static class User { 5 pr

java 线程的终止与线程中断

关于线程终止: 1.一般来讲线程在执行完毕后就会进入死亡状态,那该线程自然就终止了. 2.一些服务端的程序,可能在业务上需要,常驻系统.它本身是一个无穷的循环,用于提供服务.那对于这种线程我们该如何结束它呢. 一.线程的终止 在Thread类中JDK给我们提供了一个终止线程的方法stop(); 该方法一经调用就会立即终止该线程,并立即释放对象锁.如果当一个线程执行一半业务而调用了该方法,可能就会产生数据不一致问题. 数据一致性:同一时间点,你在节点A中获取到key1的值与在节点B中获取到key1

在delphi线程中实现消息循环

http://delphi.cjcsoft.net//viewthread.php?tid=635 在delphi线程中实现消息循环 Delphi的TThread类使用很方便,但是有时候我们需要在线程类中使用消息循环,delphi没有提供. 花了两天的事件研究了一下win32的消息系统,写了一个线程内消息循环的测试. 但是没有具体应用过,贴出来给有这方面需求的DFW参考一下.希望大家和我讨论. {--------------------------------------------------