VC中的Sleep函数

VC中的Sleep函数在延时应用中很好用,比如通信程序中,一方需等待另一方若干个毫秒后再处理,或者在死循环中,让出CPU不至于资源占用100%等等;

但是,在界面操作中不要使用Sleep函数,比如按钮事件中,不要调用这个函数,否则会出现意外的情况!!那么如何处理延时一段时间执行呢?使用定时器,将按钮事件中调用Sleep函数中的地方,改为启动一个一段时间执行后的定时器:SetTimer(定时器编号,毫秒数后执行,NULL);执行的动作放到定时器回调函数中执行,如果仅执行一次的,那么进到回调函数后首先将定时器关闭(即不是周期执行);

这样做的好处是,所有的“操作”(处理),都是在“本类”中。


另一个方案是启动一个线程:AfxBeginThread(处理回调函数,传递给回调函数的参数);但是也不建议使用!!因为,一般使用该函数都是这样使用,调用时:

  1. AfxBeginThread(Fn, this);<SPAN style="WHITE-SPACE: pre">    </SPAN>//this是“目前正在处理这个类”的指针  
AfxBeginThread(Fn, this);	//this是“目前正在处理这个类”的指针

而在回调函数Fn中一般:

  1. UINT Fn( LPVOID pParam )  
  2. {  
  3.     CMyDlg *pDlg = (CMyDlg *)pParam;//切换到“正在处理”的类中   
  4.   
  5.     //其他处理   
  6.   
  7.     return 1L;  
  8. }  
UINT Fn( LPVOID pParam )
{
	CMyDlg *pDlg = (CMyDlg *)pParam;//切换到“正在处理”的类中

	//其他处理

	return 1L;
}

这涉及到RTTI,微软MFC在这方面做得不是太好(我在使用codeproject上的一些派生类控件就遇到了几个不解的问题,不知道是微软MFC的问题,还是那些派生类控件的问题),保守一点,使用定时器,可以避免这方面的弯路!


2. Sleep()的精度是可以保证的,如Sleep(4),能保证延时4个毫秒,但是不能用GetTickCOunt()函数来探测(最小精度15毫秒,不信自己验证),而是需使用:

  1. #include <windows.h>   
  2. #include <stdio.h>   
  3.   
  4. //链接库   
  5. #pragma comment(lib, "Winmm.lib")   
  6.   
  7. void main()  
  8. {  
  9.     timeBeginPeriod(1);  
  10.     Sleep(100);  
  11.   
  12.     int j=0;  
  13.   
  14.     //探测10次Sleep的延时   
  15.     for(int i=0; i<10; i++)  
  16.     {  
  17.   
  18.         DWORD s = timeGetTime();//开始时间(毫秒级)   
  19.   
  20.         //延时函数   
  21.         Sleep(2);  
  22.         //for (j=0; j<10000000; j++);//测算34~40毫秒,所以for循环每条指令为3~4个ns   
  23.   
  24.         DWORD e = timeGetTime();//结束时间(毫秒级)   
  25.   
  26.         printf("%d\n", e-s);//   
  27.     }  
  28.   
  29. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值