利用for循环实现程序的延时
2014-03-25 20:42
405 查看
程序中延时的方法很多,如直接调用Sleep函数
也可用for循环来实现一个延时,例如:
int m=0;
for (int x=0;x<20000;x++)
{
for (int y=0;y<20000;y++)
{
m++;
}
}
也可用下面这个函数
/*
功能:带windows消息处理的毫秒界别延时
参数:
ms:延迟时间(单位:毫秒)
*/
bool CTools::delayMsMessage(const unsigned int ms)
{
//局部变量
unsigned int preTickMs = 0;
unsigned int nextTickMs = 0;
unsigned int counter = 0;
MSG msg;
DebugInfo * debugInfo = DebugInfo::getInstance();
//获取当前时刻
if( CTools::getTickCountMs(preTickMs) == false )
{
debugInfo->print("CTools::delayMsMessage,获取当前时刻失败\n");
return false;
}
nextTickMs = preTickMs;
//循环等待
while( (nextTickMs - preTickMs) <= ms )
{
//内部计数器递增
counter++;
//处理消息队列
if( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//再次查询时刻
if( CTools::getTickCountMs(nextTickMs) == false )
{
debugInfo->print("CTools::delayMsMessage,获取当前时刻失败\n");
return false;
}
}
return true;
}
其中,
/*
功能:获取当前时刻(精度:毫秒)
参数:
ms:当前时刻(单位:毫秒)
说明:
由于计数器数据位可以达到64bit;
计数的时间可以达到1千万天。
而其实也可以转成用低32bit来计数;
计数的时间可以达到1000秒左右。
其实用低32bit就能满足要求,常用的
定时不会超过1分钟。
*/
bool CTools::getTickCountMs(unsigned int &ms)
{
//局部变量
LARGE_INTEGER freq;
LARGE_INTEGER time;
unsigned int iFreq = 0;
unsigned int iTime = 0;
DebugInfo * debugInfo = DebugInfo::getInstance();
//为了尽可能保留精度,使用了双精度
//浮点数来进行运算
double fTime = 0.0;
//获取时钟频率
if( !QueryPerformanceFrequency(&freq) )
{
debugInfo->print("CTools::getTickCountMs,不能获取时钟频率\n");
return false;
}
//获取时钟计数器数值
if( !QueryPerformanceCounter(&time) )
{
debugInfo->print("CTools::getTickCountMs,不能获取时钟计数值\n");
return false;
}
//将计数值转换成微秒数
fTime = (float)time.LowPart;
fTime /=(float)freq.LowPart;
fTime *= 1000.0;
ms = (unsigned int)fTime;
return true;
}
也可用for循环来实现一个延时,例如:
int m=0;
for (int x=0;x<20000;x++)
{
for (int y=0;y<20000;y++)
{
m++;
}
}
也可用下面这个函数
/*
功能:带windows消息处理的毫秒界别延时
参数:
ms:延迟时间(单位:毫秒)
*/
bool CTools::delayMsMessage(const unsigned int ms)
{
//局部变量
unsigned int preTickMs = 0;
unsigned int nextTickMs = 0;
unsigned int counter = 0;
MSG msg;
DebugInfo * debugInfo = DebugInfo::getInstance();
//获取当前时刻
if( CTools::getTickCountMs(preTickMs) == false )
{
debugInfo->print("CTools::delayMsMessage,获取当前时刻失败\n");
return false;
}
nextTickMs = preTickMs;
//循环等待
while( (nextTickMs - preTickMs) <= ms )
{
//内部计数器递增
counter++;
//处理消息队列
if( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//再次查询时刻
if( CTools::getTickCountMs(nextTickMs) == false )
{
debugInfo->print("CTools::delayMsMessage,获取当前时刻失败\n");
return false;
}
}
return true;
}
其中,
/*
功能:获取当前时刻(精度:毫秒)
参数:
ms:当前时刻(单位:毫秒)
说明:
由于计数器数据位可以达到64bit;
计数的时间可以达到1千万天。
而其实也可以转成用低32bit来计数;
计数的时间可以达到1000秒左右。
其实用低32bit就能满足要求,常用的
定时不会超过1分钟。
*/
bool CTools::getTickCountMs(unsigned int &ms)
{
//局部变量
LARGE_INTEGER freq;
LARGE_INTEGER time;
unsigned int iFreq = 0;
unsigned int iTime = 0;
DebugInfo * debugInfo = DebugInfo::getInstance();
//为了尽可能保留精度,使用了双精度
//浮点数来进行运算
double fTime = 0.0;
//获取时钟频率
if( !QueryPerformanceFrequency(&freq) )
{
debugInfo->print("CTools::getTickCountMs,不能获取时钟频率\n");
return false;
}
//获取时钟计数器数值
if( !QueryPerformanceCounter(&time) )
{
debugInfo->print("CTools::getTickCountMs,不能获取时钟计数值\n");
return false;
}
//将计数值转换成微秒数
fTime = (float)time.LowPart;
fTime /=(float)freq.LowPart;
fTime *= 1000.0;
ms = (unsigned int)fTime;
return true;
}
相关文章推荐
- 【程序29】 TestAdd3.java 题目:求一个3*3矩阵对角线元素之和 1.程序分析:利用双重for循环控制输入二维数组, //再将a[i][i]累加后输出。
- 利用for循环实现的隔行变色
- for循环实现C语言精确延时
- 深入应用c++11读书笔记--使用c++11让程序更简洁、更现代-2.自己实现一个支持范围for循环的类~
- 利用System.arraycopy代替for循环实现数组复制
- for循环实现C语言精确延时
- 自定义iterator 利用增强for循环实现文件行的读取
- c程序运行机制与for循环的底层实现
- 利用Scrip实现走马灯效果[无缝连接、循环滚动]
- 利用HttpModuler实现 WEB程序同一时间只让一个用户 登陆
- Asp.net利用一般处理程序实现文件下载功能
- 【实践】用for-in 循环实现三联联动
- 利用AJAX实现简单的用户登录程序(处理服务端返回的文本数据)
- 利用预编译器 实现 .NET下不同类型程序的 通用 类库
- 利用多线程提高程序性能(for Android)
- 增强型的 for 循环实现方法 (三种方法)
- java程序利用接口实现发短信功能
- 利用数组和循环实现杨辉三角 (code)
- SQL Server 中利用STUFF和FOR XML PATH()实现多行数据的拼接
- 利用死循环巧妙实现,回车对话框不关闭