绝对有挑战性的问题!线程中while(true){ }中,有一语句,判断某条件不成立就返回好,还是判断某条件不成立延时后返回?
线程中
写法一:
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




