各位仁兄,你们好!
    虽然小弟已经搞Delphi很多年了,但是有个问题我一直没搞清楚,请大家指教:
    一个线程被挂起的时候,它是不是就停在当前执行的地方(我是这么理解的)?有没有办法让它停在我程序中指定的地方?
    我现在实现的方法比较麻烦,就是在线程里重写一个方法,需要挂起时,执行自己写的方法,方法中置一个标志,并不真的挂起,在线程代码中判断那个标志,被置位了就清楚标志,并挂起自己,恢复时采用线程自己的Resume
    有更好的方法请告诉我啊,谢谢

解决方案 »

  1.   

    可以,你可以通过同步对象来完成
    在线程中 WaitForSingleObject 或 WaitForMultiObjects 等待事件,主线程中不使用 SuspendThread 挂起,而通过 SetEvent 使得工作线程进入到另外一个 WaitForSingleObject
    当给他另外一个 Event 的时候就可以解除挂起
    系统所谓挂起本身实际上也是使线程处于对某个事件的等待状态,只不过现在不在内核中完成而转为在用户态实现而已
      

  2.   

    按楼主的说法不会是每一句都要判断吧,不知道我理解的对不对,
    例如一个线程对象的 Execute 过程中:
    procedure TTestThread.Execute();
    begin
      while not Terminated do
      begin
        Line 1;
        //判断是否挂起?
        Line 2;
        //判断是否挂起?
        Line...;
        //判断是否挂起?
        Line N;
        //判断是否挂起?
      end;
    end;
    这样的话不晕死啊。
    我觉得楼主还是把想达到的效果说的在具体一些,我们可能会有更好的答案。
      

  3.   

    qrlvls(空 气) 是VC版的高手,呵呵
      

  4.   

    应该重新看看delphi中线程的同步的概念,在我看来同步可以理解为阻塞式的执行方式,与多线程是截然相反的
      

  5.   

    能否给出“线程的同步”的简单例程呢?
    我现在主程序要挂起线程的时间是随机的(并不知道线程执行到何处),但是线程执行某些动作时,不能被挂起,一定要完成那些指令,所以有这个冲突,我现在处理的方法如下:
    线程体:
      DoSomething1;
      DoSomething2;
      DoSomething3;
      //以下是能挂起的地方
      if CanSuspend then 
      //CanSuspend是自己定义的成员,由主程序在需要挂起线程时置位,然后等待线程挂起
      //主程序判断到线程的Suspended置位时,就处理事情,最后Resume线程
      begin
         CanSupend:=False;
         Self.Suspend;
      end
      else
        回线程头; 
    线程结束我觉得这方法不好,或者说不转业,所以寻求更好的方法,请各位支持!谢谢!