做一个线程,如何控制该线程只能在规定的时间内结束,否则就强制把该线程释放掉?请给段源码谢谢!

解决方案 »

  1.   

    添加一个timer,在ontimer中添加:
    if (now=....) then
    begin
      if (not thrd.suspended) then
      begin
        thrd.terminated ;
      end ;
    end ;
      

  2.   

    你外面加个TIMER控件不就得了,启动时就启动一个TIMER,到时就停止
      

  3.   

    在TImer事件中记时,到了就 Thread.Suspend;Thread.Terminated;
    或者 
     BOOL TerminateThread(    HANDLE hThread, // handle to the thread 
        DWORD dwExitCode  // exit code for the thread 
       );
      

  4.   

    terminate仅是通知线程去自己结束自己。。也就是将terminated属性设为TRUE。要用它,则线程里面必须这样。。
    while  not terminated do
    begin
      ....end;
      

  5.   

    如果我 在
    while  not terminated do
    begin
      ....end;
    中间就死循环了呢?不就永远到不了
    while  not terminated do
    这句了呢?
      

  6.   

    只有当线程不能自己结束了。。不到实在不得已,不要用TerminateThread强制杀掉线程。。
      

  7.   

    方法1
    在循环体类加 
    if terminated then break;
    主程序里加定时器.
    方法2
    只有当线程不能自己结束了。。不到实在不得已,不要用TerminateThread强制杀掉线程。。
      

  8.   

    说句不太对题的话吧:一般在子线程的代码都不会太长太复杂,保证其无Bug才是合理而也不算很难的做法。
      

  9.   

    呵呵,主要是我想查找一个局域网上的一个DCOM服务器,但不知道用什么函数去查,就只好枚举每台计算机,用DCOM的OPEN去查看,但OPEN的时候,有时候会无故的停在那里,一天都返回不了,所以才想把OPEN做到线程里,然后用定时器做定时,但在主线程里加了定时器,定时器却不工作!所以才求救啊!!难道是我的线程错了??第一次做线程,大家看看代码:
    type
      TmycheckThread= class(TThread)
      private
        MYDCOMC: TDCOMConnection;
      protected
        procedure Execute;override;
      public
        Constructor Create(str:string);
    end;var  mycheck:TmycheckThread;
         ax:bool;
      
    constructor TmycheckThread.Create(str: string);
    begin
      MyDCOMC:=TDCOMConnection.Create(nil);
      Mydcomc.ComputerName:=str;
      MYdcomc.ServerName:='服务器名';
      form1.Timer1.Enabled:=true;
      FreeOnTerminate:=True;
      inherited Create(true);
    end;procedure TmycheckThread.Execute;
    var i:integer;
    begin
      try
      mydcomc.Open;
      mydcomc.Close;
      ax:=true;
      form1.Timer1.Enabled:=false;
      MyDCOMC.Free;
      EXCEPT
      ax:=false;
      form1.Timer1.Enabled:=false;
      MyDCOMC.FREE;
      end;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    mycheck.Terminate;
    mycheck.Free;
    end;procedure TForm1.Button5Click(Sender: TObject);
    var i:integer;
    begin
    button5.Enabled:=false;
    mycheck:=TmycheckThread.Create(计算机名称);
    mycheck.Execute;
    IF ax THEN
    listbox2.Items.Add(计算机名称)
    else
    listbox3.Items.Add(计算机名称);
    end;
    button5.Enabled:=true;
    end;大家看看有什么地方不对的啊?????
      

  10.   

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    mycheck.Terminate;
    mycheck.Free;
    end;
    在timer里只让线程释放了,以后怎么处理的?
      

  11.   

    看来楼上一系列回答都白费了。。楼主没有用心看。别的不说。。这儿就是非常糟糕的错误。procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      mycheck.Terminate;//不是在回贴里面说了吗?它只改变Terminated属性值。。
      mycheck.Free;//调用它的时候,线程可没有正常停下来。
    end;