线程中
写法一:
while(true)
begin 
   if 条件成立 then
     do sth
   else
     什么也做;
end;写法二:
while(true)
begin 
   if 条件成立 then
     do sth
   else
   begin
      Application.ProcessMessage   ;
      sleep(20000);
   end;  
end;请问哪种方法规范?

解决方案 »

  1.   

    线程里面最好sleep一下挂起,让出cpu资源
      

  2.   

    Application.ProcessMessage   似乎是多余的了
      

  3.   

    while(true)
    begin 
      if 条件成立 then
         do sth;
      sleep(20000);
    end;
      

  4.   

    不用Application.ProcessMessage吧。
      

  5.   

    好几个朋友建议不用Application.ProcessMessage,但是我发现线程中的只用sleep的话,则主线程的一些事件也无法响应了,所以就加上了。不知道是否错误?不过测试到么有出现什么问题。
      

  6.   

    感觉都不规范while (true)
    是一个死循环,如果没有Break的话
    除非杀死线程,否则用TThread.Terminate()是停不掉的
    再怎么调用Application.ProcessMessage和Sleep都是没有用的while  not Terminated 比较合适调用Application.ProcessMessage是为了让线程能够接收到外部消息,比如终止,挂起等
    用sleep是为了让线程暂停一下,解决CPU占用100%问题
    两个函数目标不一样,都有必要
      

  7.   

    一般如果线程运行的时候,不想让线程被终止的话
    才用while (true)写一个死循环在死循环里Application.ProcessMessage就没有必要了
    因为即使收到终止消息线程也终止不掉
      

  8.   

    谢谢各位大侠出手,思路有些清晰了。
    使用while(true)是因为这个线程必须一直运行,一直到退出程序。
    大头鸟你好,看来Application.ProcessMessage 和   sleep(20000)同时使用不会出错吧?
      

  9.   

    在线程里可以同时用Application.ProcessMessage 和sleep(20000)
    如果线程里要操作可视化控件或者发送消息什么的
    最好用Application.ProcessMessage ,否则就会出现程序停止响应的情况
      

  10.   

    线程里使用application.processmessages是在找死或为了程序容易出错
      

  11.   

    阿呆你好,能否详细解释一下。我现在的线程里面都用了application.processmessages
      

  12.   

    你可以查看一下application.processmessages的原代码, 它里面使用了很多全局变量, 而且主线程一直在调用, 现在你另一个线程也在调用而且没有任何同步措施...结果嘛, 正常情况下一段时间内不会有事, 因为大部分人写的线程都没有消息循环处理(windows默认也没有建立消息队列), 但是你调用过一次application.processmessages后你的线程就建立了消息队列了, 呵呵, 如果不巧来一个线程消息的话......
      

  13.   

    好几个朋友建议不用Application.ProcessMessage,但是我发现线程中的只用sleep的话,则主线程的一些事件也无法响应了,所以就加上了。不知道是否错误?不过测试到么有出现什么问题。----------那可能是因为你同步的范围太大了。
      

  14.   

    看来“都有必要”这话确实太片面,
    收回.Application.ProcessMessage和sleep
    都是有一定针对性的,不能当作万金油用楼主也不要太死板,到处都用和绝对不用都不可取
    还是应该具体问题具体分析,根据实际需要自己决定
      

  15.   

    阿呆说的对,因为线程使用了Application.ProcessMessage,调试时时间久了出了一些故障,线程有时候死了。