精华内容
参与话题
问答
  • SetTimer函数的用法

    2016-11-15 10:30:04
    什么时候我们需要用到SetTimer函数呢?当你需要每个一段时间执行一件事的的时候就需要使用SetTimer函数了。使用定时器方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有...
    什么时候我们需要用到SetTimer函数呢?当你需要每个一段时间执行一件事的的时候就需要使用SetTimer函数了。使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。 

    1.1 用WM_TIMER来设置定时器

    先请看SetTimer这个API函数的原型 

    UINT_PTR SetTimer(
      HWND hWnd,          // 窗口句柄
      UINT_PTR nIDEvent,      // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
      UINT uElapse,         // 时间间隔,单位为毫秒
      TIMERPROC lpTimerFunc     // 回调函数
    );

    例如 
    SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器
    在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了

    于是SetTimer函数的原型变为: 

    UINT SetTimer(

      UINT nIDEvent,

      UINT nElapse,

      void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD)

    ) 

     当使用SetTimer函数的时候,就会生成一个计时器。函数中nIDEvent指的是计时器的标识,也就是名字。nElapse指的是时间间隔,也就是每隔多长时间触发一次事件。第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就是使用系统默认的回调函数,系统默认认的是onTime函数。这个函数怎么生成的呢?你需要在需要计时器的类的生成onTime函数:在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成onTime函数了。然后在函数里添加代码,让代码实现功能。每隔一段时间就会自动执行一次。 

    例: 

    SetTimer(1,1000,NULL); 

    1:计时器的标识;

    1000:时间间隔,单位是毫秒; 

    NULL:使用onTime函数。 

    当不需要计时器的时候调用KillTimer(nIDEvent); 

    例如:KillTimer(1); 

    1.2 调用回调函数

    此方法首先写一个如下格式的回调函数(在SetTimer函数表示回调函数TIMERPROC不为空时,需要调用自定义的回调函数)

    void CALLBACK TimerProc(

      HWND hWnd,

      UINT uMsg,

      UINT idEvent,

      DWORD dwTime

    );
    然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。

    如果要加入两个或者两个以上的timer怎么办? 

    继续用SetTimer函数吧,上次的timer的ID是1,这次可以是2,3,4。。。。 

    SetTimer(2,1000,NULL); 

    SetTimer(3,500,NULL); 

    嗯,WINDOWS会协调他们的。当然onTimer函数体也要发生变化,要在函数体内添加每一个timer的处理代码: 

    onTimer(nIDEvent) 

    { 

    switch(nIDEvent) 

    { 

    case 1:..; 

     break; 

    case 2:..; 

     break; 

    case 3:..; 

     break; 

    } 

    }

     

    在使用定时器时注意SetTimer中表示定义时标识的nIDEvent参数,以及OnTimer或自定义的回调函数中nIDEvent参数,还有KillTimer中的这个参数,如果要用它们对特定的定时器进行操作时,注意保持它们的一致。

    案例一:秒表

    VS2013/MFC基于对话框编程:[14]定时器消息

    案例二:定时删除指定目录下的文件

    void CDelFilesOnTimeDlg::OnBnClickedStartdel()
    {
    	// TODO:  在此添加控件通知处理程序代码
    	KillTimer(1);
    	DelFileOnTime();
    	SetTimer(1, m_IntervalHr * 1000, NULL);
    }
    
    void CDelFilesOnTimeDlg::OnTimer(UINT_PTR nIDEvent)
    {
    	// TODO:  在此添加消息处理程序代码和/或调用默认值
    
    	switch (nIDEvent)
    	{
    	case 1:
    		DelFileOnTime();
    		break;
    	}
    
    	CDialogEx::OnTimer(nIDEvent);
    }
    
    void CDelFilesOnTimeDlg::DelFileOnTime(){
    
    	//查找目录下指定时间以前的文件
    	CString strDir = m_SelFolder;
    	SearchFile(m_SelFolder);
    }
    
    int CDelFilesOnTimeDlg::SearchFile(CString strDir){
    
    	CFileFind filefind;
    	CString szDir = strDir; //文件目录
    	CString delfilepath;
    
    	UpdateData(FALSE);
    	szDir = "C:\\Users\\Administrator\\Desktop\\新建文件夹 (3)";
    	if (szDir.Right(1) != "\\")szDir += "\\";
    	m_Filetype = "*.txt";
    	szDir += m_Filetype;
    	//szDir += "*.*";
    	BOOL bRes = filefind.FindFile(szDir);
    	while (bRes)
    	{
    		bRes = filefind.FindNextFile();
    		if (!filefind.IsDirectory() && !filefind.IsDots())
    		{
    			delfilepath = "";
    			delfilepath = filefind.GetFilePath();
    			DeleteFile(delfilepath);
    			m_nNum++;
    			
    			if (m_nNum == 9999){ m_nNum = 0; }
    		}
    
    	}
    
    	filefind.Close();
    
    	return 0;
    }
    


    展开全文
  • SetTimer函数用法

    2015-03-09 22:49:27
    SetTimer是一种API函数,位于user32.dll中。你想每隔一段时间执行一件事的的时候,你可以使用它。 使用定时器方法比较简单,通常告诉Windows一个时间间隔,然后Windows以此时间间隔周期性触发程序。通常有两种...
    SetTimer是一种API函数,位于user32.dll中。你想每隔一段时间执行一件事的的时候,你可以使用它。 使用定时器的方法比较简单,通常告诉Windows一个时间间隔,然后Windows以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。不需要指定定时器时,可以调用对应的KillTimer函数销毁指定的时钟。

    1简介编辑

    SetTimer函数
    创建或设置一个定时器,该函数创建的定时器与Timer控件(定时器控件)效果相同。

    2函数的用法编辑

    1.1 用WM_TIMER来设置定时器
    SetTimer函数的原型
    UINT_PTR SetTimer(
    HWND hWnd, // 窗口句柄
    UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
    UINT nElapse, // 时间间隔,单位为毫秒
    TIMERPROC lpTimerFunc // 回调函数
    );
    返回值:
    类型:UINT_PTR
    如果函数成功,hWnd参数为0,则返回新建立的时钟编号,可以把这个时钟编号传递给KillTimer来销毁时钟.
    如果函数成功,hWnd参数为非0,则返回一个非零的整数,可以把这个非零的整数传递给KillTimer来销毁时钟.
    如果函数失败,返回值是零.若想获得更多的错误信息,调用GetLastError函数.
    例如
    SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器
    在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄
    于是SetTimer函数的原型变为:
    UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD))
    当使用SetTimer函数的时候,就会生成一个定时器,函数中nIDEvent指的是定时器的标识,也就是名字。nElapse指的是时间间隔,也就是每隔多长时间触发一次事件。第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就是使用系统默认的回调函数,系统默认的是OnTimer函数。这个函数怎么生成的呢?你需要在需要计时器的类的生成OnTimer函数:在ClassWizard里,选择需要计时器的类,添加WM_TIMER消息映射,就自动生成OnTimer函数了。然后在函数里添加代码,让代码实现功能。每隔一段时间就会自动执行一次。
    例:
    SetTimer(NULL,1,1000,NULL);
    NULL 默认是主进程调用
    1:计时器的名称;
    1000:时间间隔,单位是毫秒;
    NULL:使用OnTimer函数。
    当不需要计时器的时候调用KillTimer(nIDEvent);
    例如:KillTimer(1);
    1.2 调用回调函数
    此方法首先写一个如下格式的回调函数
    void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);
    然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。
    二. 或许你会问,如果我要加入两个或者两个以上的 timer怎么办?
    继续用SetTimer函数吧,上次的timer的ID是1,这次可以是2,3,4。。。。
    SetTimer(2,1000,NULL);
    SetTimer(3,500,NULL);
    嗯,WINDOWS会协调他们的。当然OnTimer函数体也要发生变化,要在函数体内添加每一个timer的处理代码:
    OnTimer(nIDEvent)
    {
    switch(nIDEvent)
    {
    case 1:........;
    break;
    case 2:.......;
    break;
    case 3:......;
    break;
    }
    }
    Timer事件,即定时器事件,是在游戏编程中,经常使用的一个事件。借助它可以产生定时执行动作的效果。这篇文章,就和大家一起探讨一下如何使用SetTimer()函数。
    1、SetTimer定义在哪里?
    SetTimer表示的是定义个定时器。根据定义指定的窗口,在指定的窗口(CWnd)中实现OnTimer事件,这样,就可以相应事件了。
    SetTimer有两个函数。一个是全局的函数::SetTimer()
    UINT SetTimer(
    HWND hWnd, // handle of window for timer messages
    UINT nIDEvent, // timer identifier
    UINT uElapse, // time-out value
    TIMERPROC lpTimerFunc // address of timer procedure
    );
    其中hWnd 是指向CWnd的指针,即处理Timer事件的窗口类。说到窗口类(CWnd),我们有必要来看一下CWnd的继承情况:CWnd有以下子类:CFrameWnd,CDialog,CView,CControlBar等类。这也意味这些类中都可以定义SetTimer事件。
    同时,SetTimer()在CWnd中也有定义,即SetTimer()是CWnd的一个成员函数。CWnd的子类可以调用该函数,来设置触发器。
    UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );
    参数含义:
    nIDEvent:是指设置这个定时器的iD,即身份标志,这样在OnTimer()事件中,才能根据不同的定时器,来做不同的事件响应。这个ID是一个无符号的整型。
    nElapse
    是指时间延迟。单位是毫秒。这意味着,每隔nElapse毫秒系统调用一次OnTimer()。
    void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD)
    Specifies the address of the application-supplied TimerProc callback function that processes the WM_TIMER messages. If this parameter is NULL, the WM_TIMER messages are placed in the application’s message queue and handled by the CWnd object。
    意思是,指定应用程序提供的TimerProc回调函数的地址,来处里这个Timer事件。如果是NULL,处理这个Timer事件的定义这个Timer的CWnd对象。他将WM_TIMER消息传递给这个对象,通过实现这个对象的OnTimer()事件来处理这个Timer事件。
    所以,一般情况下,我们将这个值设为NULL,有设置该定时器的对象中的OnTimer()函数来处理这个事件。
    同样的,我们再看看KillTimer()和OnTimer()的定义:
    KillTimer同SetTimer()一样,他也有两个,一个是全局的::KillTimer(),另一个是CWnd的一个函数。他的声明如下:
    BOOL KillTimer(
    HWND hWnd, // handle of window that installed timer
    UINT uIDEvent // timer identifier
    );
    //CWnd函数
    BOOL KillTimer( int nIDEvent );
    这两个函数表示的意思是将iD为nIDEVENT的定时器移走。使其不再作用。其用法如同SetTimer()一样。
    再看看OnTimer()
    CWnd::OnTimer
    afx_msg void OnTimer( UINT nIDEvent );
    OnTimer()是响应CWnd对象产生的WM_Timer消息。nIDEvent表示要响应TIMER事件的ID。
    二、Timer事件的使用:
    由以上的分析,我们应该很清楚,如何来使用Timer事件。假定我们在视图上画一个渐变的动画。我们首先在菜单栏上添加一个菜单项,给这个菜单添加命令响应:
    pView->SetTimer(1,1000,NULL);//pView是视图类的指针,这里是在视图类当中设置一个定时器。
    添加完毕,再给视图类添加一个WM_Timer事件的响应。在OnTimer()函数中编写函数,进行响应。
    Timer的精度:
    Timer使用的是时间中断响应计时,windows的时间中断每1/18秒触发一次,所以Timer最低精度约在55ms,低于这个时间则精度不够。
    展开全文
  • MFC SetTimer函数的用法

    2016-02-16 16:07:50
    OnTimer()函数是响应用SetTimer()函数设定时钟发送时钟消息,你没设定时钟,就不会有时钟消息,OnTimer()里语句当然也不会被调用。 Settimer是设置一个计时器并开始执行计时器Ontimer中代码,Ontimer是...

    <span style="color:#ff0000;">OnTimer()函数是响应用SetTimer()函数设定的时钟发送的时钟消息的,你没设定时钟,就不会有时钟消息,OnTimer()里的语句当然也不会被调用。</span>

    Settimer是设置一个计时器并开始执行计时器Ontimer中的代码,Ontimer是计时器所执行的代码。KillTimer用于停止计时器。 Settimer是设置,Ontimer是响应Settimer消息的。

        SetTimer函数的用法 
    1  函数原型及变形

    SetTimer这个API函数的原型 
    UINT_PTR SetTimer( 
    HWND hWnd, // 
    窗口句柄 
    UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器 
    UINT uElapse, // 时间间隔,单位为毫秒 
    TIMERPROC lpTimerFunc // 回调函数 
    );

    注意:设置第二个参数时要注意,如果设置的等待时间比处理时间短,程序就会出问题了。
    回调函数:在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL 也就是使用系统默认的回调函数,系统默认认的是onTime函数。
    例如 
    SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器 
    MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了 

    于是SetTimer函数的原型变为: 
    UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD)) ,用法如:SetTimer(1,1000,NULL);

    用法如下:
    
    SetTimer(1,1000,NULL);
    
    1:计时器的名称;
    
    1000:时间间隔,单位是毫秒;
    
    NULL:使用onTime函数


    2)函数生成方法

    ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成onTime函数了。然后在函数里添加代码,让代码实现功能。 
    每隔一段时间就会自动执行一次。

    在每次时间到1s时会触发WM_TIMER消息,其消息响应函数如下: 
    void CXXX::OnTimer(UINT_PTR nIDEvent) 
    { 
    // TODO: 在此添加消息处理程序代码和/或调用默认值 
            // 此处加入如下代码就好了: 
            switch() 
            { 
            case 1: 
                  //做该做的事情 
                    //当不需要的时候在此处调用KillTimer(1); 
                  break; 
            default: 
                  break; 
            } 
    CDialog::OnTimer(nIDEvent); 
    }

    3 回调函数的格式
    void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime); 

    二. 多个Timer
    把ID的值设为〉1的数,如:SetTimer(3,500,NULL);
    由WINDOWS会协调他们的然onTimer函数要在函数体内添加每一个timer的处理代码: 

    onTimer(nIDEvent) 
    
    { 
    switch(nIDEvent) 
    
    { 
    case 1:........; 
    break; 
    case 2:.......; 
    break; 
    case 3:......; 
    break; 
    } 

    三、KillTimer:取消定时器不再使用定时器后,我们应该调用KillTimer来取消定时。

           KillTimer的原型:

                  BOOL KillTimer(HWND hWnd,          // 窗口句柄

                         UINT_PTR uIDEvent   // ID);

           在MFC程序中我们可以直接调用KillTimer(int nIDEvent)来取消定时器




    展开全文
  • 1 )用WM_TIMER来设置定时器 先请看SetTimer这个API函数的原型  UINT_PTR SetTimer( HWND hWnd, // 窗口句柄 UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器 UINT uElapse, ...

    1 )用WM_TIMER来设置定时器   先请看SetTimer这个API函数的原型  

     UINT_PTR SetTimer(   

    HWND hWnd, // 窗口句柄   

    UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器   

    UINT uElapse, // 时间间隔,单位为毫秒  

    TIMERPROC lpTimerFunc // 回调函数   );  

     例如  SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器  在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了   于是SetTimer函数的原型变为:  UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,UINT ,DWORD))   当使用SetTimer函数的时候,就会生成一个计时器。函数中nIDEvent指的是计时器的标识,也就是名字。nElapse指的是时间间隔,  也就是每隔多长时间触发一次事件。第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,  也就是使用系统默认的回调函数,系统默认认的是onTime函数。这个函数怎么生成的呢?你需要在需要计时器的类的生成onTime函数:  在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成onTime函数了。然后在函数里添加代码,让代码实现功能。  每隔一段时间就会自动执行一次。 

     SetTimer计时器是系统资源,使用完毕应及时用KillTimer销毁,关于SetTimer的返回值:如果hWnd为NULL,返回值为新建立的timer的ID,如果hWnd非NULL,返回一个非0整数,如果SetTimer调用失败则返回0 ,简言之,SetTimer的返回值用于将来的销毁。

    例1:

      SetTimer(1,1000,NULL);   1:计时器的名称;   1000:时间间隔,单位是毫秒;  NULL:使用onTime函数。   当不需要计时器的时候调用KillTimer(nIDEvent);   例如:KillTimer(1);   2) 调用回调函数   此方法首先写一个如下格式的回调函数   void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);   然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。   二. 或许你会问,如果我要加入两个或者两个以上的 timer怎么办?  继续用SetTimer函数吧,上次的timer的ID是1,这次可以是2,3,4。。。。  SetTimer(2,1000,NULL);   SetTimer(3,500,NULL);   嗯,WINDOWS会协调他们的。当然onTimer函数体也要发生变化,要在函数体内添加每一个timer的处理代码:  onTimer(nIDEvent)   {   switch(nIDEvent)   {   case 1:........;   break;   case 2:.......;   break;   case 3:......;   break;   }

      }

    例2:

      for(int i = 0; i< 100000; i++)
    {
      SetTimer(1,2000,NULL);
    }
    //如果这个循环运行时间远超过了这个二秒的定时器,是不是也要一直运行完这个循环后,再过两秒后才会进入OnTime()函数?

    1。应该是这样的,设置定时器应该只要一次就够了,只要不KillTimer()。系统每隔2秒都会自动调用OnTimer()
    2。如果来一次定时器消息对应的函数所需要的CPU工作时间会超过2秒的话,系统也会继续运行本次消息对应的函数,不管需要多长时间都会继续运行;当运行完成了本次定时器消息函数后,系统会立即调用下一次定时器消息,也就是实际的定时器消息间隔时间应该是定时器设置时间减去本次定时器消息函数执行所需要的时间,如果你的消息函数执行时间超过2秒的话,那么系统执行完本次函数后,就会立即执行下一次定时器消息,而基本不需要等待了

    转载于:https://www.cnblogs.com/fx427103/p/3957650.html

    展开全文
  • ULONG TimerID=SetTimer(NULL,0,1000,(TIMERPROC)TimerFunc); if(TimerID==0) { MessageBox(NULL,"SetTimer error",NULL,MB_OK); //return FALSE; } } 问题: 1.回调函数里不会执行弹...
  • MFC——SetTimer函数的用法

    千次阅读 2017-11-21 09:33:15
    当你需要每隔一段时间执行一件事的的时候就需要使用SetTimer函数了。使用定时器方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和...
  • delphisetTimer函数用来做定时器,可以实现每隔一段时间运行某个程序,需要用到两个函数,SetTimer函数和KillTimer函数。下面是一个简单例子:vari :Integer = 0;procedure TimerProc(hwnd:HWND;uMsg,idEvent:UINT...
  • 什么时候我们需要用到SetTimer函数呢?当你需要每个一段时间执行一件事的的时候就需要使用SetTimer函数了。 使用定时器方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常...
  • 什么时候我们需要用到SetTimer函数呢?当你需要每个一段时间执行一件事的的时候就需要使用SetTimer函数了。 使用定时器方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常...

空空如也

1 2 3 4 5 ... 20
收藏数 1,943
精华内容 777
关键字:

settimer