请教两个关于线程方面的问题:1:线程中有terminate,可是不是立即终止的。请问用什么办法立即停止一个线程的执行呢?2:我在Tmythread.execute中,运行从1到1000000的数,我想创建100个线程,每个线程运行10000个,如何实现?多谢了,分不够再开贴。

解决方案 »

  1.   

    请问用什么办法立即停止一个线程的执行呢?
    ---------------------------------------
    这是不可能,没有"立刻"这种事情,Windows 都不是实时操作系统.
      

  2.   

    VOID ExitThread( UINT fuExitCode ); 结束自己    
     
    BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode);结束别的
      

  3.   

    某些紧急情况下,你可以使用TerminateThread()来终止一个线程。但是,除非没有别的办法了,否则不要用它。
    例如,当线程代码陷入死循环时。TerminateThread()的声明如下:
    function TerminateThread(hThread:THandle;dwExitCode:DWORD);TThread的Handle属性可以作为第一个参数,因此,TerminateThread()常这样调用:
    TerminateThread(MyHosedThread.Handle,0)
    如果选择使用这个函数,应该考虑到它的负面影响。
    首先,此函数在Windows NT与在Windows 95/98下并不相同。在Windows 95/98 下,这个函数能够自动清除线程所占用的栈;而在Windows NT下,在进程被终止前栈仍然保留。
    其次,无论线程代码中是否有try...finally块,
    这个函数都会使线程立即停止执行。这意味着,被线程打开的文件没有被关闭、由线程申请的
    内存没有被释放等情况。而且,这个函数在终止线程的时候也不通知D L L,当D L L关闭时,这也容易出现问题
      

  4.   

    TerminateThread 可以立即结束 除非没有别的办法了否则不要用它TerminateThread(my.handle,0)
      

  5.   

    一般情况下,利用将FreeOnTerminate的属性设为True的方法来及时清除线程对象是最方便的办法,这只需要在Excute()退出前设置就行了。
    设置方法如下:
    Procedure TTestThread.execute;
    Var
       i                : integer;
    Begin
       Inherited;
       FreeOnTerminate:=true;
       For i := 1 To 10000000 Do
          Begin
          if Terminated then break;
            inc(count);
            Synchronize(getcount);
          End;
    End;
      

  6.   

    至于第二个问题,你看看这个,我只是简单的加一,你可以自己改Unit Unit1;InterfaceUses
       Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
       Dialogs, StdCtrls;Type
       TForm1 = Class(TForm)
          Edit1: TEdit;
          Button1: TButton;
          ListBox1: TListBox;
          Procedure Button1Click(Sender: TObject);
          Procedure FormCreate(Sender: TObject);
       private
          { Private declarations }
       public
          { Public declarations }
          threadlist: Tlist;
       End;
       TTestThread = Class(TThread)
       private   public
          Procedure getcount;
          Procedure execute; override;   End;
    Var
       Form1            : TForm1;
       count            : integer;
    Implementation{$R *.dfm}{ TTestThread }Procedure TTestThread.execute;
    Var
       i                : integer;
    Begin
       Inherited;
       FreeOnTerminate := true;
       For i := 1 To 10000 Do
          Begin
             If Terminated Then
                break;
             inc(count);
          End;
    End;Procedure TTestThread.getcount;
    Begin
    End;Procedure TForm1.Button1Click(Sender: TObject);
    Var
       i                : integer;
    Begin
       Try
          For i := 1 To 100 Do
             Begin
                threadlist.Add(TtestThread.Create(false));
                sleep(100);
                ListBox1.Items.Add(inttostr(count));
             End
       Except
          showmessage('erro');
       End
    End;Procedure TForm1.FormCreate(Sender: TObject);
    Begin
       threadlist := TList.Create;
    End;End.
      

  7.   

    请问myling(阿德),100个线程同时执行一段代码,i的值不会混乱吧。还是要每一个线程判断一下:thread1:1-10000,thread2:10001-20000....thread100:900001-1000000小弟初学,还请指教。
      

  8.   

    i的值?你是说count吧?可能!看你的execute是不是一个时钟周期+sleep(100)内能完成的了一般的操作会满足,但是也有例外其实你说的那样可以这样设置一个类内的变量重载类的构造函数,加上参数,根据参数设置变量这样,每个线程的变量就互不干扰了 :)