看你的代码,当该线程给suspend后,就不会继续执行,除非你在线程外部resume它。
我的做法是,用主线程去控制所有其它线程的suspend、resume、priority等情况。

解决方案 »

  1.   

    //mainform中的显示不变,为什么????????????? 这句话不好理解 
      

  2.   

    在主表单中有一个edit显示mythread中进行自加的变量.
    当线程挂起后,edit中的值不再改变,但是当线程resume后,edit中的值仍不变.
    按道理它应该继续增加才对.其实,我也只是一个主线程,一个计算edit中显示值的线程.我想实现当主线程中某一条件触发时.另一个线程能够挂起,然后当条件中的代码执行完,它再继续.
      

  3.   

    如果这样写
          mythread:=TTestthread.create(false); //执行一个自加,并在mainform中显示
          mythread.suspend;  
          mythread.resume; 
          程序能够实现.
          但是如果
       mythread:=TTestthread.create(false); //执行一个自加,并在mainform中显示
          mythread.suspend; 
           其他的代码  
          mythread.resume
          主窗体中的edit 不再变化了 . ??????
      

  4.   

    to BCB(:)):
         我看过原先关于线程的文章.有许多你的发言,望多加指点.
     
      

  5.   

    对于csdn我都要失去信心了,怎么发表的问题回答者寥寥呢?
    我在怀疑我上网的时间是不是超过斑竹 :)
      

  6.   

    不知道是否是言多必失,直言了当反而让人很难接受.
    为什么过了许天,还是这个样子呢????
    是否我自己该多加学习才是,但csdn是一个提供解决问题,大家把经验共享的地方,对于我这个初学者,你们的回答会让我更仔细思考.怎么……………………
      

  7.   


      线程间的通信最好用信号量,如Tevent
      
      

  8.   

    建议把你的      mythread.suspend; 
          其他的代码  
          mythread.resume中的"其他代码"也贴出来,否则我感觉象猜迷语一样
      

  9.   

    仔细想了你的问题,其实你的问题很简单(如果我没有理解错的话),你先consider一下:你Create(false)线程时,它已经开始运行,当你自己执行Suspend时,线程已经运行了一段(尽管非常非常短)时间,当前的线程执行点已经不是初始点了。所以之后的Resume依然会使线程继续运行(毫无疑问),但是也许已经错过了你需要计算的代码的其中的一部分,当然无法得到结果(或正确的结果)了。解决do solve:你需要,并且是绝对需要使你的线程的执行点处在一个理想的位置,以至于你的计算过程保持完整,好的,看看创建线程的Create(Suspended:Boolean),当Suspended为TRUE时,创建完线程对象后会自动Suspend线程,此时执行点就是初始点,直到你使用Resume恢复运行。呵呵,此时你应该知道怎么做了吧。----------------------------------------------------------------------------
    如果这样写
          mythread:=TTestthread.create(false); //执行一个自加,并在mainform中显示
    *********************** 这之间的时间足够短,使得线程还不足以运行到影响结果运算的代码
          mythread.suspend;  
          mythread.resume; 
          程序能够实现.
          但是如果
      mythread:=TTestthread.create(false); //执行一个自加,并在mainform中显示
    *********************** 此处耽误了时间,难说了:(
          mythread.suspend; 
          其他的代码  
          mythread.resume
          主窗体中的edit 不再变化了 .
    ----------------------------------------------------------------------------修改后:      mythread:=TTestthread.create(TRUE);  // TRUE,TRUE and TRUE
          其他的代码                            // 做任何与线程有关的操作(比如赋值)
          mythread.resume;                     // 确保从线程初始点运行
     
      

  10.   

    笔误! 更正一下:----------------------------------------------------------------------------
    如果这样写
    。以下全是废话
    ----------------------------------------------------------------------------修改后:      mythread:=TTestthread.create(TRUE);  // TRUE,TRUE and TRUE
          其他的代码                            // 做任何与线程有关的操作(比如赋值)
          mythread.resume;                    // 确保从线程初始点运行
      

  11.   

    操作线程同步、互斥的方法还有:互斥锁   Mutex   
    事件点   Event
    信号量   Semaphore
    临界区   CriticalSection但是这些操作一般需要在线程内部才能使用,一般情况下Delphi提供封装的TCriticalSection和TEvent已经足够了,但是有些时候为了完成“不可能”的任务(mission impossible),这些“九阴真经”级别的操作还是必须的。呵呵
    另外更正airhorse一下:TEvent不是信号量
      

  12.   

    上面的方法未免太过繁琐。我没有用内核对象。
    但我用一个全局变量模拟了内核对象,实现了他们的功能,而且极其简单。
    我觉得这样更好。
    如果要的话,流个mail。我给你寄个我刚编的代码。
    通过一个全局变量,完全操纵两个线程顺次运行。
      

  13.   

    to ch81,
    请问一下,你的两个线程是不是时刻轮询这个全局变量来判断当前的运行状态?(运行、阻塞)
      

  14.   

    to ch81,
    我不得不告诉你,你的设计存在着非常严重的缺陷!
    你的基本原理和内核对象是一样的,但是两者差异的地方要远远大于相同的地方,因为:
    如果采用内核对象的话,在线程阻塞等待调度时,系统将撤回此线程的CPU调度时间,并将这些多余的CPU调度时间用于其他线程的调度,从而对CPU的利用率提高,并且客观上加速了其他线程的运行。
    但是你的方法效果刚好相反,采用人工线程阻塞时,不断地轮询同步、信号量,不仅没有节省出线程阻塞时多余的CPU调度时间,反而系统会为你的代码中的密集循环轮询分配更多的CPU调度时间,显而易见,势必影响了系统中其他线程的运行效率;而且此时线程处于阻塞态,没有有效代码运行,所以整体效率为0%。
    你可以在Win2000下面打开任务管理器的CPU使用图对比一下上面的差别:同样一个线程阻塞,用内核对象时,线程(所在进程)CPU占用率为0%;而使用人工阻塞时,线程(所在进程)CPU占用率立刻到了接近100%,几乎所有的CPU动力都被作成了无用功。使用系统内核对象的调度控制,线程受控于系统内核,而系统内核负责调度整个系统中所有的线程,会优化分配CPU调度时间,整个系统都会收益;而人工调度……我想没有比这更糟糕的了 :)
    其实WindowsAPI的内核对象非常容易操作,难道几条API指令都难么?
    :)
      

  15.   

    互斥锁  Mutex  
    事件点  Event
    临界区  CriticalSection    的底层封装都是,信号量,他们都只是信号量的一个简单使用,看看有关操作系统的书吧,
      

  16.   

    : eDRIVE(EncoreUneFois) :
    对,你讲得很好,这个方面我是欠考虑了。我只是实现了内核的功能。
    但微软肯定自家作了优化。那还是用内核对象。也很简单。
      

  17.   

    全部的底层操作都是P/V调度操作,Mutex、Event、CriticalSection、Semaphore都是P/V操作的某种封装实现形式。但是在抽象层的使用上却不尽相同,之所以这样人们才赋予这些操作的专有名称,提到信号量容易使人误解为Semaphore,因为不明白你到底指的是抽象层的“信号量”还是实现层的“信号量”。