我第一次执行线程用Resume没有问题(线程创建后自动Suspend),等Execute里所有的代码执行完后,我想再次执行线程,但Resume没有用,线程不会再执行了,请问是什么原因?

解决方案 »

  1.   

    线程在运行完自己的那个函数(EXECUTE),就自动退出的了。你再Resume也没有用的。想要一个线程用完之后再用,你必须在EXECUTE里建立一个循环,使得这个函数不会被终止。例如加入:
      while ..do
        ...your code
      

  2.   

    等Execute里所有的代码执行完后,你的线程已消毁了,
    你只有重新建立这个线程的实例,
      

  3.   

    当然你也可以再CREATE()它了啊;
      

  4.   

    没有清除啊,我设了FreeOnTerminate := false;
      

  5.   


    procedure TStauts_Watcher.Execute;
    begin
            while Not Terminated do
            begin
                    Synchronize(Watcher_Stauts);
                    Sleep(3000);
            end;
    end;这样你的线程才不会自动消毁
      

  6.   

    为什么不能用循环?
    var
      EventSignaled:DWORD;
      EventsToWait:array [0..1] of Thandle;
    begin
      EventsToWait[0]:=CloseEvent;
      EventsToWait[1]:=YourEvent;
      while true do
      begin
        EventSignaled := WaitForMultipleObjects(2,@EventsToWait,False, INFINITE);
        case EventSignaled of
        Wait_Object_0:
          begin
            exit;
          end;
        Wait_Object_0+1:
          begin
            do your things; 
          end;
        Wait_Failed:exit;
        end;
      end;
      
      end;
      

  7.   

    不会很多,因为WaitForMultipleObjects等待时,这个线程是死锁的它不在等候运行的线程队列中
      

  8.   

    好的,我试试你的方法,不过你的程序中我有些地方看不太懂。例如线程创建后程序执行到WaitForMultipleObjects等待,这时如果我想通过点击一个菜单或一个按钮来触发这个线程执行Wait_Object_0+1的内容,代码该怎么写呢?还有我想触发Wait_Object_0呢?还有EventsToWait这个数组是什么意思?
      

  9.   

    看看msdn吧,YourEvent也是thandle类变量
    用YourEvent:=createevent(......)来创建event,用setevnt(yourevent)来通知waitmultipleobjects,返回值便是Wait_Object_0+yourevent在eventstowait中的顺序