首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待Thread.finalization并保持应用程序响应的正确方法是什么

等待Thread.finalization并保持应用程序响应的正确方法是什么
EN

Stack Overflow用户
提问于 2010-11-16 11:07:56
回答 5查看 9.9K关注 0票数 13

实际上我正在使用这段代码,工作正常,但我想知道是否正确的方式。

代码语言:javascript
复制
  while WaitForSingleObject(MyThread.Handle, 0) = WAIT_TIMEOUT do
    Application.ProcessMessages;

  ShowMessage('i am done');
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-11-16 11:49:27

调用Application.ProcessMessages通常被认为是一种代码气味。如果你的主线程无事可做,那就让它空闲。

如果你经营一家公司,需要你的一名员工跑到商店去拿一些急需的补给,你会在门口徘徊,直到他回来,还是更愿意坐在办公室休息等他,因为你听到他走进门,才发现补给在这里?不管怎样,他都会花同样多的时间,但第一种方法会让你筋疲力尽。

类似地,不是让UI监视线程,而是让线程向UI报告。要做到这一点,一种方法是让线程使用PostMessage向启动它的窗体发送定制消息,并在窗体上放置一个消息处理程序来响应它。

票数 8
EN

Stack Overflow用户

发布于 2010-11-18 10:54:49

VCL TThread类有它自己的WaitFor()方法,当在主线程上下文中调用时,该方法在内部抽出主消息队列:

代码语言:javascript
复制
MyThread.WaitFor; 
ShowMessage('i am done'); 
票数 13
EN

Stack Overflow用户

发布于 2010-11-16 11:49:44

它看起来是正确的(如果正确意味着它完成了工作)。我要改变的是等待更多一点的时间(50ms看起来很适合保持应用程序的响应性),同时不占用CPU。

代码语言:javascript
复制
while WaitForSingleObject(MyThread.Handle, 50) = WAIT_TIMEOUT do
  Application.ProcessMessages;
ShowMessage('i am done');

当然还有其他方法可以做到……但我通常会应用其中一个主要的工程原理:

如果它能工作,不要碰它!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4190872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档