www.pudn.com > Console_Thread.rar > 1ms.cpp


 
 
 
//************************************************************************************ 
//本程序使用了两种实现定时的方法,都是基于API的,而不是MFC 
// 
//  1. 是使用线程定时休眠的方法,启动线程ThreadProc,在线程中输出,然后Sleep 1000ms 
//    
//  2. 使用定时器方法,设置一个1000ms的定时器(SetTimer),然后捕捉该消息,然后调用回调函数 
//     TimerProc,在该函数中输出DEF,注意,SetTimer可以直接写回调函数地址,不必捕捉消息。 
//  3. 本例子已经很详细了。 
//  4. 祝你好运。 
// 
//************************************************************************************ 
 
 
 
#include "stdafx.h" 
#include  
 
DWORD WINAPI ThreadProc(  LPVOID lpParameter )//方法1 
{ 
	static DWORD tick=0; 
	DWORD tmp = GetTickCount(); 
	while(1) 
	{    
		tick = GetTickCount()-tmp;//获得系统从启动开始到现在的ms数 
		tmp = GetTickCount(); 
		printf("THREAD_PROC: abc %d, tickcount: %d\n",tick,tmp);//打印abc和上次打印到这次打印之间的毫秒间隔。 
		Sleep(1000);//每隔1000ms打印abc 
	} 
} 
VOID  TimerProc()//方法2 
{    
	static DWORD tick=0; 
	static DWORD tmp = GetTickCount(); 
  
	tick = GetTickCount()-tmp; 
	tmp = GetTickCount(); 
	printf(" TimerProc________________def %d\n",tick); 
 
} 
 
 
int main() 
{ 
	DWORD dwthread;  
    ::CreateThread(NULL,0,ThreadProc,(LPVOID)0,1024,&dwthread);//生成一个线程,在该线程里每1000ms输出一个"abc",然后SLEEP 
	SetTimer(0,0,1000,0);//设置一个定时器,定时器的回调函数为0,仅产生定时器消息,在main函数里捕捉该消息 
	MSG msg; 
	bool flag; 
     
	while(1)//该循环捕捉定时器消息,并且防止main函数退出 
	{ 
		PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);  
		while( (flag = GetMessage( &msg, NULL, 0, 0 )) != 0)  
		{    
		  if (flag == -1)  
		  {  
		   // handle the error and possibly exit  
		  }  
		  else if(msg.message==WM_TIMER)  
		  {  
			  TimerProc();//如果是定时器消息,调用timerproc 
 
		  }  
		  else  
		  {  
		   TranslateMessage(&msg);    
		   DispatchMessage(&msg);    
		  }  
		}  
	} 
 
}