前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【专业技术】Windows编程技巧小结

【专业技术】Windows编程技巧小结

作者头像
程序员互动联盟
发布2018-03-15 16:43:45
7040
发布2018-03-15 16:43:45
举报
我们在编写程序的时候,常常会需要一些线程的delay函数。这个问题说简单也简单,说复杂也复杂。比如很多人读知道delay直接用Windows的API函数Sleep啊,确实没错,这个可以实现一个指定毫秒数的等待,我本身也会常常使用它,那么我要问一个问题,这个问题不管是在Windows、Linux还是其他系统都会存在。这个问题就是:是否每个地方的等待函数都可以用Sleep(Linux下pthread_delay函数)?这个看似简单的问题,我估计不少人都会被问住,回答是吧,感觉可能不会这么简单;如果不是,那能举个例子出来吗?

大家考虑好了吗?你的答案是什么呢?我的答案是有时候可以使用,但是很多时候都不能用,尤其不能长时间等待时使用。为什么?其实前一句话就已经回答这个问题了。想想我们的程序要是长时间去调用Sleep这个函数,线程会无条件的停止在这里,这就是问题所在,注意这个“无条件”等待是关键。我现在就举例来说明一下,如果你的程序在在执行Sleep,而且时间相对较长,结果有用户要退出程序该怎么办?这个时候,你的线程就是上面说的“无条件”等在这里,一般来说,安全退出应用程序是需要每个线程都安全退出的,但现在你的这个线程正在等待,要是等待时间一小时,难道你的程序点击退出后,需要一小时后才正在退出?这是个极端例子,但即使是三秒钟来说也是不好的,至少程序体验太差,按退出都要3秒才完!另外还有很多情况是需要在程序中等待中断,这可是永久等待,这种情况下也需要退出程序或者类似的情况怎么处理了?

所以等待这个问题看似简单,实际并不是看起来这么简单。要解决这个问题,一般做法是采用同步对象来解决,这种办法在各个平台都是类似的,只要找相应的函数就行了,我这里就以Windows平台来说明。

在Windows平台下,典型的同步对象有信号量和事件,我们就用事件来完成这个等待:

基本的Sleep功能就用同步对象的超时功能来解决实现等待,API函数是WaitForSingleObject,而需要退出时,只要设置一个事件信号就可以了,这样就解决了这个问题。另外一种情况就是往往出现终端等待或者永久等待的情况,这个同样可以用事件来完成,但是在等待的函数一般应选取等待多对象的函数,对应的API是WaitForMultipleObjects,这个函数一个对象作为永久信号等待对象,一个是最为退出这种情况的临时退出等待对象。

在我的程序中,我更多的是使用上面的等待而不是Sleep函数,要是读者遇到这种类似的问题,不防试试上述解决办法。


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员互动联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档