Click here to Skip to main content
15,921,295 members
Home / Discussions / C / C++ / MFC
   

C / C++ / MFC

 
AnswerRe: Create really long timers in MFC Pin
KarstenK4-Jul-08 1:07
mveKarstenK4-Jul-08 1:07 
GeneralRe: Create really long timers in MFC Pin
cagespear4-Jul-08 1:23
cagespear4-Jul-08 1:23 
GeneralRe: Create really long timers in MFC Pin
cagespear4-Jul-08 1:53
cagespear4-Jul-08 1:53 
AnswerRe: Create really long timers in MFC Pin
CPallini4-Jul-08 1:41
mveCPallini4-Jul-08 1:41 
GeneralRe: Create really long timers in MFC Pin
cagespear4-Jul-08 1:51
cagespear4-Jul-08 1:51 
GeneralRe: Create really long timers in MFC Pin
CPallini4-Jul-08 2:01
mveCPallini4-Jul-08 2:01 
AnswerRe: Create really long timers in MFC Pin
MANISH RASTOGI4-Jul-08 2:09
MANISH RASTOGI4-Jul-08 2:09 
AnswerRe: Create really long timers in MFC Pin
Yves4-Jul-08 4:57
Yves4-Jul-08 4:57 
With this small class you can create a timer up to 1193 Hours

#pragma once<br />
<br />
#include <string><br />
<br />
typedef void (*TIMER_PROC)(UINT idEvent, void* obj);<br />
<br />
class CTimer  <br />
{<br />
public:<br />
   enum eTIME_TYPE<br />
   {<br />
      eONE_SHOT,<br />
      ePERIOIDIC<br />
   };<br />
<br />
public:<br />
   //--CONSTRUCTOR-------------------------------------<br />
	CTimer(eTIME_TYPE _eType, DWORD _dWaitPeriod, TIMER_PROC _pFunct, LPVOID _pSegment);<br />
   //--DESTRUCTOR--------------------------------------<br />
	virtual ~CTimer();<br />
<br />
public:<br />
   //--PUBLIC METHODS----------------------------------<br />
   inline const char*    GetErrorMessage(){ return m_szError.c_str(); }<br />
   UINT  Start();<br />
   void  Stop();<br />
   bool  SetPeriod(DWORD _dwVal);<br />
   eTIME_TYPE   TimerType() { return m_eTimerType; }<br />
   UINT  GetTimerID();<br />
<br />
protected:<br />
   //--PROTECTED ATTRIBUTES----------------------------<br />
   TIMER_PROC     m_pCALLBACKFUN;<br />
   void*          m_pSegm;<br />
   eTIME_TYPE     m_eTimerType;<br />
   DWORD          m_WaitPeriod;<br />
   DWORD          m_ThreadID;<br />
   HANDLE         m_hQuitEvent;<br />
   HANDLE         m_hThread;<br />
   HANDLE         m_hAdvisorThread;<br />
   HANDLE         m_hAdvise;<br />
   HANDLE         m_hQuitAdvisor;<br />
   std::string    m_szError;<br />
<br />
private:<br />
   //--PRIVATE METHODS---------------------------------<br />
   static void TimerThread(void* _pParam);<br />
   static void AdvisorThread(void* _pParam);<br />
};


The implementation
//--FILE INCLUDES--------------------------------------------------------<br />
#include <windows.h> <br />
#include "Timer.h"<br />
<br />
<br />
//!--CONSTRUCTOR-----------------------------------------------------------<br />
//<br />
//  Method Name:  CTimer(..., ...., ...)<br />
//<br />
/*!<br />
    Notes         Constructor.<br />
*/<br />
//-------------------------------------------------------------------------<br />
CTimer::CTimer(eTIME_TYPE _eType, DWORD _dWaitPeriod, TIMER_PROC _pFunct, LPVOID _pSegment)<br />
{<br />
   m_pCALLBACKFUN = NULL;<br />
   m_pSegm = NULL;<br />
   m_eTimerType = _eType;<br />
   m_WaitPeriod = _dWaitPeriod;<br />
   if( m_WaitPeriod == 0 )<br />
      m_WaitPeriod = 1;<br />
   m_hThread = m_hAdvisorThread = NULL;<br />
   m_ThreadID=0;<br />
   m_pCALLBACKFUN = _pFunct;<br />
   m_pSegm = _pSegment;<br />
   m_hQuitEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);<br />
   m_hQuitAdvisor = ::CreateEvent(NULL, TRUE, FALSE, NULL);<br />
   m_hAdvise =  ::CreateEvent(NULL, FALSE, FALSE, NULL);<br />
   m_hAdvisorThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)AdvisorThread, this, 0, 0);<br />
}<br />
<br />
<br />
//!--DESTRUCTOR-------------------------------------------------------------<br />
//<br />
// Method Name:  ~CTimer()<br />
//<br />
/*!<br />
<br />
   Notes         Destructor. Clean-up<br />
*/			<br />
//--------------------------------------------------------------------------<br />
CTimer::~CTimer()<br />
{<br />
   try<br />
   {<br />
      Stop();<br />
      ::SetEvent(m_hQuitAdvisor);<br />
      if( m_hAdvisorThread )<br />
      {<br />
        switch( ::WaitForSingleObject(m_hAdvisorThread, 200) )<br />
        {<br />
         case WAIT_TIMEOUT:<br />
            // No Response close anyway.<br />
            ::TerminateThread(m_hAdvisorThread, 0);<br />
            ::CloseHandle(m_hAdvisorThread);<br />
            m_hAdvisorThread = NULL;<br />
            break;<br />
         }<br />
      }<br />
      if( m_hQuitAdvisor != INVALID_HANDLE_VALUE )<br />
         ::CloseHandle(m_hQuitAdvisor);<br />
   }<br />
   catch(...)<br />
   {}<br />
}<br />
<br />
<br />
///////////////////////////////////////////////////////////////////////////<br />
//                         Private Functions<br />
///////////////////////////////////////////////////////////////////////////<br />
<br />
<br />
//-METHOD IMPLEMENTATION----------------------------------------------------<br />
//<br />
// Method Name:   AdvisorThread<br />
//<br />
/*!Access:        Private<br />
<br />
   Parameters<br />
<br />
   IN             Description<br />
<br />
   <void*>        As usual.<br />
<br />
   OUT            Description<br />
<br />
   <None><br />
<br />
   Notes:         We advise Parent Here.<br />
                  If by mistake the parent keep Hand on CallBack<br />
                  it would stuck the thread. But here even if this happened<br />
                  the class would still working.<br />
                  The best is to use a WatchDog ... at this moment don't want to.<br />
*/<br />
//--------------------------------------------------------------------------<br />
void CTimer::AdvisorThread(void* _pParam)<br />
{<br />
   CTimer* me = (CTimer*)_pParam;<br />
   bool bContinue = true;<br />
   HANDLE  hEvent[2];<br />
   hEvent[0] = me->m_hQuitAdvisor;<br />
   hEvent[1] = me->m_hAdvise;<br />
<br />
   while( bContinue )<br />
   {<br />
      DWORD dw = ::WaitForMultipleObjects(2, hEvent, FALSE, INFINITE);<br />
      switch(dw)<br />
      {<br />
      case WAIT_OBJECT_0 + 0:<br />
         bContinue =false;<br />
         break;<br />
      case WAIT_OBJECT_0 + 1:<br />
         if( me->m_pCALLBACKFUN )<br />
            me->m_pCALLBACKFUN(me->m_ThreadID, me->m_pSegm);<br />
         break;<br />
      }<br />
   }<br />
   ::CloseHandle(me->m_hAdvisorThread);<br />
   me->m_hAdvisorThread = NULL;<br />
}<br />
<br />
<br />
//-METHOD IMPLEMENTATION----------------------------------------------------<br />
//<br />
// Method Name:   TimerThread<br />
//<br />
/*!Access:        Private<br />
<br />
   Parameters<br />
<br />
   IN             Description<br />
<br />
   <void*>        As usual.<br />
<br />
   OUT            Description<br />
<br />
   <None><br />
<br />
   Notes:         <br />
*/<br />
//--------------------------------------------------------------------------<br />
void CTimer::TimerThread(void* _pParam)<br />
{<br />
   CTimer* me = (CTimer*)_pParam;<br />
   bool bContinue = true;<br />
<br />
   while( bContinue )<br />
   {<br />
      switch ( ::WaitForSingleObject(me->m_hQuitEvent, me->m_WaitPeriod))<br />
      {<br />
         case WAIT_OBJECT_0:<br />
            bContinue = false;<br />
            break;<br />
         case WAIT_TIMEOUT:<br />
            if( me->m_eTimerType == eONE_SHOT )<br />
               ::SetEvent(me->m_hQuitEvent);<br />
            ::SetEvent(me->m_hAdvise);<br />
            break;<br />
      }//end switch<br />
   }//end while<br />
   ::CloseHandle(me->m_hThread);<br />
   me->m_hThread = NULL;<br />
}<br />
<br />
<br />
///////////////////////////////////////////////////////////////////////////<br />
//                         Public Functions<br />
///////////////////////////////////////////////////////////////////////////<br />
<br />
<br />
<br />
//-METHOD IMPLEMENTATION----------------------------------------------------<br />
//<br />
// Method Name:   Start<br />
//<br />
/*!Access:        Public<br />
<br />
   Parameters<br />
<br />
   IN             Description<br />
<br />
   <None><br />
<br />
   OUT            Description<br />
<br />
   <UINT>         Return a unique identifier.<br />
<br />
   Notes:         Start The Process Timer<br />
*/<br />
//--------------------------------------------------------------------------<br />
UINT CTimer::Start()<br />
{<br />
   if( m_hThread == NULL )<br />
   {<br />
     ::ResetEvent(m_hQuitEvent);<br />
      m_hThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TimerThread, this,<br />
				                     0, &m_ThreadID);<br />
   }<br />
   return m_ThreadID;<br />
}<br />
<br />
<br />
//-METHOD IMPLEMENTATION----------------------------------------------------<br />
//<br />
// Method Name:   Stop<br />
//<br />
/*!Access:        Public<br />
<br />
   Parameters<br />
<br />
   IN             Description<br />
<br />
   <None><br />
<br />
   OUT            Description<br />
<br />
   <None><br />
<br />
   Notes:         Stop Timer ...<br />
*/<br />
//--------------------------------------------------------------------------<br />
void  CTimer::Stop()<br />
{<br />
   ::SetEvent(m_hQuitEvent);<br />
   DWORD dWaitMax = m_WaitPeriod * 2;<br />
   if( dWaitMax == 0 )<br />
      dWaitMax = 500;<br />
<br />
   if( m_hThread )<br />
   {<br />
     switch( ::WaitForSingleObject(m_hThread, dWaitMax) )<br />
     {<br />
      case WAIT_TIMEOUT:<br />
         // No Response close anyway.<br />
         ::TerminateThread(m_hThread, 0);<br />
         ::CloseHandle(m_hThread);<br />
         m_hThread = NULL;<br />
         break;<br />
      }<br />
   }<br />
   m_ThreadID =0;<br />
}<br />
<br />
<br />
//-METHOD IMPLEMENTATION----------------------------------------------------<br />
//<br />
// Method Name:   SetPeriod<br />
//<br />
/*!Access:        Public<br />
<br />
   Parameters<br />
<br />
   IN             Description<br />
<br />
   <DWORD>        New periode Value<br />
<br />
   OUT            Description<br />
<br />
   <bool>         true if succeeded.<br />
<br />
   Notes:         Use it if Timer is not Working.<br />
*/<br />
//--------------------------------------------------------------------------<br />
bool  CTimer::SetPeriod(DWORD _dwVal)<br />
{<br />
   if( m_hThread )<br />
   {<br />
      m_szError = "Thread is working..could not set.";<br />
      return false;<br />
   }<br />
   m_WaitPeriod = _dwVal;<br />
   return true;<br />
}<br />
<br />
<br />
UINT  CTimer::GetTimerID()<br />
{<br />
   return m_ThreadID;<br />
}<br />

QuestionRe: Create really long timers in MFC Pin
David Crow4-Jul-08 11:38
David Crow4-Jul-08 11:38 
Questionfile writing help Pin
projectip4-Jul-08 0:38
projectip4-Jul-08 0:38 
QuestionRe: file writing help Pin
CPallini4-Jul-08 0:56
mveCPallini4-Jul-08 0:56 
AnswerRe: file writing help Pin
projectip4-Jul-08 8:55
projectip4-Jul-08 8:55 
QuestionRe: file writing help Pin
CPallini4-Jul-08 23:23
mveCPallini4-Jul-08 23:23 
AnswerRe: file writing help Pin
KarstenK4-Jul-08 0:57
mveKarstenK4-Jul-08 0:57 
AnswerRe: file writing help Pin
vineeshV4-Jul-08 2:02
vineeshV4-Jul-08 2:02 
QuestionRe: file writing help Pin
David Crow4-Jul-08 11:40
David Crow4-Jul-08 11:40 
QuestionCannot open XML File Pin
manju#1234-Jul-08 0:36
manju#1234-Jul-08 0:36 
AnswerRe: Cannot open XML File Pin
KarstenK4-Jul-08 1:03
mveKarstenK4-Jul-08 1:03 
GeneralRe: Cannot open XML File Pin
manju#1234-Jul-08 2:17
manju#1234-Jul-08 2:17 
GeneralRe: Cannot open XML File Pin
manju#1234-Jul-08 2:52
manju#1234-Jul-08 2:52 
AnswerRepost Pin
SandipG 4-Jul-08 1:05
SandipG 4-Jul-08 1:05 
AnswerRe: Cannot open XML File [modified] Pin
mohit_108228-Dec-09 0:49
mohit_108228-Dec-09 0:49 
QuestionCombo Box in and Progress Bar in CListCtrl Pin
sudhir_Kumar3-Jul-08 23:59
sudhir_Kumar3-Jul-08 23:59 
AnswerRe: Combo Box in and Progress Bar in CListCtrl Pin
Iain Clarke, Warrior Programmer4-Jul-08 0:13
Iain Clarke, Warrior Programmer4-Jul-08 0:13 
AnswerRe: Combo Box in and Progress Bar in CListCtrl Pin
Naveen4-Jul-08 0:17
Naveen4-Jul-08 0:17 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.