免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5584 | 回复: 10
打印 上一主题 下一主题

[其他] 这个 while (True) 用来做什么的, ? [复制链接]

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-26 15:22 |只看该作者 |倒序浏览
void Thread (PVOID pvoid)
{
     double           A = 1.0 ;
     INT               i ;
     LONG             lTime ;
     volatile PPARAMS pparams ;
     
     pparams = (PPARAMS) pvoid ;
     
     while (TRUE)
     {
          WaitForSingleObject (pparams->hEvent, INFINITE) ;
         
          lTime = GetCurrentTime () ;
         
          for (i = 0 ; i < REP && pparams->bContinue ; i++)
               A = tan (atan (exp (log (sqrt (A * A))))) + 1.0 ;
         
          if (i == REP)
          {
               lTime = GetCurrentTime () - lTime ;
               PostMessage (pparams->hwnd, WM_CALC_DONE, 0, lTime) ;
          }
          else
               PostMessage (pparams->hwnd, WM_CALC_ABORTED, 0, 0) ;
     }
}

论坛徽章:
1
双子座
日期:2013-11-14 17:43:24
2 [报告]
发表于 2012-10-26 15:31 |只看该作者
本帖最后由 star_in_sky 于 2012-10-26 15:32 编辑

整体看:
while (TRUE){
WaitForSingleObject (pparams->hEvent, INFINITE) ;
.....
}
WaitForSingleObject (pparams->hEvent, INFINITE) :该线程会阻塞,直到pparms->hEvent变成信号态。外部有一个动作,会使用SetEvent函数,设置pparms-hEvent为信号态,这样WaitForSingleObject返回,继续执行lTime = GetCurrentTime () ;等后续的操作。后续的某个操作应该会设置pparms->hEvent为非信号态(或者是在建立pparms->hEvent的时候,把这个信号量设置为自动恢复为非信号态) ,然后重新进入WaitForSingleObject继续等待。

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
3 [报告]
发表于 2012-10-26 15:38 |只看该作者
回复 2# star_in_sky

为什么要 while(True) ??  线程不是一直死循环的吗 ??

论坛徽章:
0
4 [报告]
发表于 2012-10-26 15:42 |只看该作者
不会死循环的.
通过调用WaitForSingleObject (pparams->hEvent, INFINITE) ;
线程需要一直等待直到获取到信号量,才能继续执行。
在等待的期间,操作系统会将线程挂起。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
5 [报告]
发表于 2012-10-26 15:48 |只看该作者
这个循环没有退出机制,只能强行干掉线程了

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
6 [报告]
发表于 2012-10-26 15:51 |只看该作者
回复 4# star1983653


    while (TRUE) 意义是什么 ?

论坛徽章:
0
7 [报告]
发表于 2012-10-26 15:57 |只看该作者
while(1)的这个用法,一般用于周期性执行某个任务的线程。

通过控制信号量的释放时间,可以控制这个线程的运行周期。

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
8 [报告]
发表于 2012-10-26 16:15 |只看该作者
回复 5# hellioncu


为什么要有个 while (True)

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
9 [报告]
发表于 2012-10-26 16:23 |只看该作者
__BlueGuy__ 发表于 2012-10-26 16:15
回复 5# hellioncu


如果不循环,那么线程执行一次就结束了,一般来说用了线程不是只为了执行一次

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
10 [报告]
发表于 2012-10-26 16:26 |只看该作者
回复 9# hellioncu

谢谢,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP