大家考虑好了吗?你的答案是什么呢?我的答案是有时候可以使用,但是很多时候都不能用,尤其不能长时间等待时使用。为什么?其实前一句话就已经回答这个问题了。想想我们的程序要是长时间去调用Sleep这个函数,线程会无条件的停止在这里,这就是问题所在,注意这个“无条件”等待是关键。我现在就举例来说明一下,如果你的程序在在执行Sleep,而且时间相对较长,结果有用户要退出程序该怎么办?这个时候,你的线程就是上面说的“无条件”等在这里,一般来说,安全退出应用程序是需要每个线程都安全退出的,但现在你的这个线程正在等待,要是等待时间一小时,难道你的程序点击退出后,需要一小时后才正在退出?这是个极端例子,但即使是三秒钟来说也是不好的,至少程序体验太差,按退出都要3秒才完!另外还有很多情况是需要在程序中等待中断,这可是永久等待,这种情况下也需要退出程序或者类似的情况怎么处理了?
所以等待这个问题看似简单,实际并不是看起来这么简单。要解决这个问题,一般做法是采用同步对象来解决,这种办法在各个平台都是类似的,只要找相应的函数就行了,我这里就以Windows平台来说明。
在Windows平台下,典型的同步对象有信号量和事件,我们就用事件来完成这个等待:
基本的Sleep功能就用同步对象的超时功能来解决实现等待,API函数是WaitForSingleObject,而需要退出时,只要设置一个事件信号就可以了,这样就解决了这个问题。另外一种情况就是往往出现终端等待或者永久等待的情况,这个同样可以用事件来完成,但是在等待的函数一般应选取等待多对象的函数,对应的API是WaitForMultipleObjects,这个函数一个对象作为永久信号等待对象,一个是最为退出这种情况的临时退出等待对象。
在我的程序中,我更多的是使用上面的等待而不是Sleep函数,要是读者遇到这种类似的问题,不防试试上述解决办法。