• Using Timers in MFC Applications


    Timer Events in MFC Applications

    Event timers are always handy to have around and useful in nearly every project. When a timer is readily available, such as the Timer control in Visual Basic, you find all kinds of reasons to use one in an application. The lack of a timer object in MFC is, in my opinion, a serious oversight.

    Luckily, Microsoft Windows NT/95 systems provide a number of timers for use by application programs. This tutorial provides information on how to install timers in your MFC application, and how to start, process and stop the timers.

    In the final section of the tutorial, we develope a simple timer project which is capable of rough animation of an icon in the dialog window. This project is useful in any compute or I/O bound application, and illustrates the techniques involved with installing and using a system timer.

    These steps were developed and tested on a WindowsNT 4.0 workstation and Windows95 using VisualC++ 4.2 with Microsoft Foundation Classes.

    Installing a Timer

    • In the header file of the dialog using the timer,
    • Add a message number for each timer needed:

      #define

      IDT_TIMER_0

      WM_USER + 200

      #define

      IDT_TIMER_1

      IDT_TIMER_0 + 1

    • Add the timer interrupt handler

      OnTimer (UINT TimerVal)

      to the Generated Message Map:

    • locate the section under Implementation where the AFX_MSG message map is declared (usually begins with the line OnInitDialog());
    • add a line just after the last line in the message map (just before the "//}}AFX_MSG"):

      afx_msg

      void

      OnTimer (UINT TimerVal);

    • This should be the last entry in the message map.
      • In the dialog implementation (.cpp) file,
    • Locate the dialog class start
    • Find the line starting "BEGIN_MESSAGE_MAP"
    • After the last entry in the message map (before the line "//}}AFX_MSG_MAP"), add

      ON_WM_TIMER ( )

      Starting the timer

      To start the timer, you must issue a SetTimer command:

      t-number = SetTimer (t-messaget-interval, NULL)

      where:

      t-message

      The message number assigned for processing the timer request. 
      This is referred to as IDT_TIMER_0 in the installation instructions.

      t-interval

      The timer duration, in mSec.

      t-number

      The system timer number assigned to this event, or 0 if no timers available.

      For Example:

       

       

       

      UINT StartTimer (UINT TimerDuration)

       

      {

       

      UINT TimerVal;

       

       

       

      TimerVal = SetTimer (IDT_TIMER_0, TimerDuration, NULL);

       

      if (TimerVal == 0)

       

      {

       

      MessageBox ("Unable to obtain timer",

       

               "IDT_TIMER_0",

       

               MB_OK|MB_SYSTEMMODAL);

       

      }

       

       

       

      return TimerVal;

       

       

       

      }// end StartTimer

       

       

       

       

      To start the timer, pass it the value of the timer duration, in milliseconds (mSec). If the returned value is non-zero, the timer has been initialized.

      Note: You must save the assigned timer value in order to stop the timer, and also to know which timer to process in a multi-timer application.

      Stopping the Timer

      To stop the timer, issue the KillTimer command:

      t-result = KillTimer (t-number);

      where:

      t-number

      The system timer number from either the SetTimer or OnTimer methods.

      t-result

      The boolean result of the operation, TRUE indicating success.

      For Example:

       

      BOOL StopTimer (UINT TimerVal)

       

      {

       

       

       

      //

       

      // Stop the timer

       

      //

       

      if (!KillTimer (TimerVal))

       

      {

       

      return FALSE;

       

      }

       

       

       

      //

       

      // Place clean-up code following this point.

       

      //

       

       

       

       

       

      return TRUE;

       

       

       

      } // end StopTimer

       

       

       

       

      Processing Timer Events - The OnTimer Method

      After the timer has been started, the OnTimer event will be called each time the timer counts down to zero (reaches terminal count) from the requested value. This event is asynchronous to the timer - a message is placed in the message queue of the calling process and the timer is automatically restarted.

      The timer can be stopped (refer to Stopping the Timer) upon entry to the OnTimer routine, or left to run if the event will not occur again before processing the OnTimer routine has completed.

      The OnTimer method will be executed each time the timer reaches terminal count. The code in this method should be short and concise; it should be code which must be executed each time the timer reaches its terminal count, such as changing the view of an animated drawing or icon, or setting a flag to process latter, or starting a thread to handle the more complex functions.

      Example:

       

       

       

      void OnTimer (UINT TimerVal)

       

      {

       

      //////////////////////////////////////////////

       

      //

       

      // Stop the timer

       

      //

       

      //////////////////////////////////////////////

       

       

       

      if (!KillTimer (TimerVal))

       

      {

       

       

       

      }

       

       

       

      //////////////////////////////////////////////

       

      //

       

      // Process the event

       

      //

       

      //////////////////////////////////////////////

       

       

       

       

       

      //////////////////////////////////////////////

       

      //

       

      // Restart the timer, if needed, before exiting

       

      //

       

      //////////////////////////////////////////////

       

       

       

       

       

      }

       

       

      Multiple Timers

      The OnTimer method is passed an unsigned integer (UINT) to identify the timer which is interrupting. The value of this timer may be used to stop the associated timer. It can also be used in a multiple timer environment to determine what type of processing must occur.

      Example:

      Assumptions:

      • The timers are started using the example in the section on Installing a Timer.
      • The timer values are placed sequentially into the array ATimer, as follows:
        • ATimer [0] = StartTimer (200); // a 200 mSec timer
        • ATimer [1] = StartTimer (500); // a 500 mSec timer

           

       

      void OnTimer (UINT TimerVal)

       

      {

       

      int Index;

       

       

       

      /////////////////////////////////////////////////////////////////////////////

       

      //

       

      // Check timer number 0

       

      //

       

      ////////////////////////////////////////////////////////////////////////////

       

       

       

      if (TimerVal == ATimer[0])

       

      {

       

      //

       

      // Process timer 0 message!

       

      //

       

       

       

      return;

       

      }

       

       

       

      ////////////////////////////////////////////////////////////////////////////

       

      //

       

      // check timer number 1

       

      //

       

      ////////////////////////////////////////////////////////////////////////////

       

       

       

      if (TimerVal == ATimer[1])

       

      {

       

      //

       

      // Process timer 1 message!

       

      //

       

       

       

      return;

       

      }

       

       

       

      ////////////////////////////////////////////////////////////////////////////

       

      //

       

      // Not timer number 0 or 1

       

      //

       

      ////////////////////////////////////////////////////////////////////////////

       

       

       

      if (!KillTimer (TimerVal))

       

      {

       

       

       

      }

       

       

       

      CString Message;

       

      Message.format("Unkown timer interrupt: %u", TimerVal);

       

      MessageBox (Message,"OnTimer",MB_OK|MB_SYSTEMMODAL);

       

       

       

      } // end OnTimer

       

       

      From: https://www.developer.com/net/cplus/article.php/603531/Using-Timers-in-MFC-Applications.htm

  • 相关阅读:
    随笔 Frida
    [转]某种传染病第一天只有一个患者,前五天为潜伏期,不发作也不会传染人 第6天开始发作,从发作到治愈需要5天时间,期间每天传染3个人 求第N天共有多少患者 Frida
    sql 将具有相同ID的多条记录组合成一条记录 Frida
    【转】小谈C#.NET下的爬虫(蜘蛛)技术 Frida
    ECMAScript基础1 Frida
    显示隐藏层 jquery Frida
    SQL语句备份和还原数据库
    Hello!Blog~
    23个MySQL常用查询语句
    SQL Server 2008压缩数据库日志文件
  • 原文地址:https://www.cnblogs.com/time-is-life/p/8412845.html
Copyright © 2020-2023  润新知