CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

绝对有挑战性的问题!线程中while(true){ }中,有一语句,判断某条件不成立就返回好,还是判断某条件不成立延时后返回?

楼主net_morning(矿泉水)2005-09-02 12:49:07 在 Delphi / VCL组件开发及应用 提问

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

1 楼jinjazz(近身剪)回复于 2005-09-02 12:58:09 得分 1

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

2 楼jinjazz(近身剪)回复于 2005-09-02 12:58:47 得分 1

Application.ProcessMessage       似乎是多余的了Top

3 楼LocustWei(LocustWei)回复于 2005-09-02 13:07:54 得分 1

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

4 楼boatzm(晓舟怕麻烦)【IUnKnown】(#_#!)回复于 2005-09-02 13:38:24 得分 1

不用Application.ProcessMessage吧。Top

5 楼net_morning(矿泉水)回复于 2005-09-02 13:53:27 得分 0

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

6 楼sdzeng(大头鸟)回复于 2005-09-02 14:03:06 得分 1

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

7 楼sdzeng(大头鸟)回复于 2005-09-02 14:08:41 得分 1

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

8 楼net_morning(矿泉水)回复于 2005-09-02 14:13:16 得分 0

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

9 楼sdzeng(大头鸟)回复于 2005-09-02 14:28:02 得分 1

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

10 楼Idle_(阿呆)回复于 2005-09-02 22:39:01 得分 5

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

11 楼net_morning(矿泉水)回复于 2005-09-03 11:01:33 得分 0

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

12 楼Idle_(阿呆)回复于 2005-09-03 18:57:59 得分 4

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

13 楼gpg(snake)回复于 2005-09-03 21:20:26 得分 1

为什么不用消息。Top

14 楼gpg(snake)回复于 2005-09-03 21:21:31 得分 1

错了,是为什么不用事件。Top

15 楼dext(德克斯特)回复于 2005-09-03 22:53:47 得分 1

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

16 楼sdzeng(大头鸟)回复于 2005-09-04 00:34:19 得分 1

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

17 楼net_morning(矿泉水)回复于 2005-09-04 11:02:20 得分 0

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

相关问题

  • 有挑战性的sql语句
  • 绝对有挑战性的问题:两个线程,中的insert和update语句完全一样,会出现问题吗?
  • 问一个比较有挑战性的查询语句
  • 这个SQL语句怎么写?(极具挑战性)高手进
  • 求一段具有挑战性的sql语句
  • 求一段具有挑战性的sql语句
  • SQL语句问题,有挑战性。(高分回报)
  • 用ACCESS插入语句,有点挑战性,在线等
  • 一个具有挑战性的update语句!实在找不出问题来。
  • 请皱老大继续帮忙完成有挑战性的select语句

关键词

  • 线程
  • sleep
  • 消息
  • application
  • processmessage
  • 成立
  • 调用
  • 条件
  • 终止
  • 响应

得分解答快速导航

  • 帖主:net_morning
  • jinjazz
  • jinjazz
  • LocustWei
  • boatzm
  • sdzeng
  • sdzeng
  • sdzeng
  • Idle_
  • Idle_
  • gpg
  • gpg
  • dext
  • sdzeng

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo