您的位置:首页 > 其它

利用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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: