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

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

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

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

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

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

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


原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2016-01-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏漏斗社区

工具|nessus自定义扫描策略

我们是谁? nessus工具! 我们要做什么? 扫描漏洞! 什么时候扫? 天天扫! 序言 有些时候我们并不希望进行全面的扫描和检测,仅需要针对某些漏洞进行安全...

5736
来自专栏月色的自留地

在Mac上使用vs-code快速上手c语言学习(入门文,老鸟退散)

9604
来自专栏张戈的专栏

替代crontab,统一定时任务管理系统cronsun简介

摘 要 cronsun 是一个分布式任务系统,单个节点和 Linux 机器上的 crontab 近似。是为了解决多台 Linux  机器上 crontab 任...

1.5K13
来自专栏康怀帅的专栏

SSH 隧道与转发内网穿透(转载)

大家都知道 SSH 是一种安全的传输协议,用在连接服务器上比较多。不过其实除了这个功能,它的隧道转发功能更是吸引人。下面是个人根据自己的需求以及在网上查找的资料...

5675
来自专栏前端儿

移动前端页面与Chrome的远程真机调试

前几日刚入手新手机小米5,系统真心流畅呀。为啥要买小米5呢,因为要提高生产力呀,好好玩移动前端开发呀哈哈哈

4683
来自专栏bboysoul

ubuntu安装kali工具包

网上关于这方面的教程很多,大部分都是关于更换源的,今天我要推荐的方法原理一样,不过比较方便。今天要推荐的脚本是katoolin,它可以近似完美帮我们解决安装ka...

1042
来自专栏杂烩

Http_load压力测试工具 原

    尝试过Spring的jmeter,不过好像有点难驾驭,测个文件url还行,但带个参数就各种问题不断了。

1133
来自专栏IMWeb前端团队

关于javascript错误捕获

``` javascript的出错我们应该都很熟悉,例如`xxx undefined`,`SyntaxError`等。 我们team将出现错误的javas...

2207
来自专栏码匠的流水账

聊聊phantomjs的优化措施

phantomjs相当于一个后台浏览器,有点内嵌jetty的味道,通常在自动化测试或者爬虫领域用。

1881
来自专栏前端布道

Angular开发实践(一):环境准备及框架搭建

引言 在工作中引入Angular框架将近一年了,在这一年中不断的踩坑和填坑,当然也学习和积累了很多的知识,包括MVVM框架、前后端分离、前端工程化、SPA优化等...

3827

扫码关注云+社区

领取腾讯云代金券