用Sleep或WaitForSingleObject实现线程的休眠
2016-01-26 20:02
531 查看
Sleep函数可以实现这个功能:
Sleep( DWORD dwMilliseconds );
其中dwMillisenconds为要休眠的毫秒数,当dwMillisenconds为0时,CPU将把时间切片转给优先级较高的进程。
但Sleep函数有个不好的地方,你不能让它在中途停下来,如果我们要让蜘蛛在两个链接点之间的休眠10秒(10000毫秒)或者更长,而期间又想控制蜘蛛停止工作,会造成界面出现死机状态,因此Sleep函数只适合很短时间内(通常1000毫秒)的休眠,如果想让休眠时间长一点,可以考滤使用WaitForSingleObject。
WaitForSingleObject的用法:
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果时间是有信号状态返回WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT。
例子:
// 头文件中声明一个事件句柄
HANDLE m_hEvent;
// 程序初始化的地方创建事件
m_hEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
// 线程执行到WaitForSingleObject时等待10000毫秒
// 如果参数dwMillisenconds为INFINITE则无限时等待到m_hEvent有信号
// 如果是超过休眠时间则返回WAIT_TIMEOUT
// 如果m_hEvent有信号(程序其它地方设置m_hEvent为受信状态),
// 则在等待时间之内返回WAIT_OBJECT_0,
ResetEvent(m_hEvent);
DWORD dwWait = ::WaitForSingleObject(m_hEvent, 10000);
if( dwWait == WAIT_TIMEOUT)
{
TRACE0("超时 /n");
...控制程序流程...
}
else if( dwWait == WAIT_OBJECT_0)
{
TRACE0("m_hEvent受信 /n");
...控制程序流程...
}
// 在程序的外部或其它线程中想设置m_hEvent为受信状态
// 在WaitForSingleObject处等待的线程将继续执行
::SetEvent(pSpider->m_hEvent);
// 在程序最后关闭对像,对应CreateEvent
::CloseHandle(m_hEvent);
Sleep( DWORD dwMilliseconds );
其中dwMillisenconds为要休眠的毫秒数,当dwMillisenconds为0时,CPU将把时间切片转给优先级较高的进程。
但Sleep函数有个不好的地方,你不能让它在中途停下来,如果我们要让蜘蛛在两个链接点之间的休眠10秒(10000毫秒)或者更长,而期间又想控制蜘蛛停止工作,会造成界面出现死机状态,因此Sleep函数只适合很短时间内(通常1000毫秒)的休眠,如果想让休眠时间长一点,可以考滤使用WaitForSingleObject。
WaitForSingleObject的用法:
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果时间是有信号状态返回WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT。
例子:
// 头文件中声明一个事件句柄
HANDLE m_hEvent;
// 程序初始化的地方创建事件
m_hEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
// 线程执行到WaitForSingleObject时等待10000毫秒
// 如果参数dwMillisenconds为INFINITE则无限时等待到m_hEvent有信号
// 如果是超过休眠时间则返回WAIT_TIMEOUT
// 如果m_hEvent有信号(程序其它地方设置m_hEvent为受信状态),
// 则在等待时间之内返回WAIT_OBJECT_0,
ResetEvent(m_hEvent);
DWORD dwWait = ::WaitForSingleObject(m_hEvent, 10000);
if( dwWait == WAIT_TIMEOUT)
{
TRACE0("超时 /n");
...控制程序流程...
}
else if( dwWait == WAIT_OBJECT_0)
{
TRACE0("m_hEvent受信 /n");
...控制程序流程...
}
// 在程序的外部或其它线程中想设置m_hEvent为受信状态
// 在WaitForSingleObject处等待的线程将继续执行
::SetEvent(pSpider->m_hEvent);
// 在程序最后关闭对像,对应CreateEvent
::CloseHandle(m_hEvent);
相关文章推荐
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
- java.lang.RuntimeException: Parcelable encountered IOException writing serializable object
- 【IOS学习基础】NSObject.h学习
- 6 Object类、StringBuffer、StringBuilder
- Objective-c与js交互
- SQL Server Object Explorer in VS
- lua语言完成游戏逻辑,移植到ios 接入支付宝 完成lua和object-c的交互(各个模块独立)
- Formatting the event object
- Swift实战(2)--在工程中添加object-C的类或者第三方框架
- Objective-C Runtime 入门教程
- Mybatis查询表数据及其列名,返回List<Map<String,Object>>
- IOS 回调/通知主线程刷新-Objective-c,JavaScript交互篇
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
- 韩顺平 javascript教学视频_学习笔记16_Object类_闭包_成员函数再说明_聪明的猪小练习
- 019: class, objects and instance: property
- Objective-C之成魔之路【16-使用文件】
- Objective C类方法load和initialize的区别
- @dynamic 模拟NSManagedObject类的内部实现,AFN的非常规用法
- [[dic objectForKey:@"name"] description]
- Object-C类、方法、构造函数(2)