How to Wait for a Given Time Period

Explains how to use timers to suspend a thread for a given time period.

  1. Create a CTimer object.

  2. Add the CTimer object to the current active scheduler using CActiveScheduler::Add().

    CTimer does not add itself to the active scheduler.

  3. Start the timer to complete after a set period by calling CTimer::After(), passing the required period in microseconds.

    The CTimer::After() method inreturn calls CActive::SetActive() to indicate that the active object has issued a request.

Example

The following code snippet uses CTimer, which is an active object, to generate events.

class CDelayUpdate : public CTimer { public:

   /**
   * static factory "constructor" function
   */
   static CDelayUpdate* NewL();
    
   /**
   * Destructor
   */
   ~CDelayUpdate();


public:

/**
 * Called to start the delayed update
 */
void startUpdate();

/**
 * Called to stop further updates
 */
void stopUpdate();


public: //From CActive

   /**
   * Implements cancellation of an outstanding request.
   */
   virtual void DoCancel();

   /**
   Handles an active object's request completion event.
   */
   void RunL();


private:

   /**
   * Default constructor
   */
   CDelayUpdate();
    
   /**
   * Second phase constructor
   */
void ConstructL();
	
    

private: // Data

TInt iCounter;  // count a few loops

};

// CDelayUpdate* CDelayUpdate::NewL() {

   CDelayUpdate* self = new (ELeave) CDelayUpdate();
   CleanupStack::PushL(self);
   self->ConstructL();
   CleanupStack::Pop(self);
   return self;   

}

CDelayUpdate::CDelayUpdate()

:  CTimer(CActive::EPriorityStandard)

{

iCounter = 0;
   CActiveScheduler::Add(this);

}

void CDelayUpdate::ConstructL() {

   CTimer::ConstructL();

}

CDelayUpdate::~CDelayUpdate() {

   Cancel();
   //delete any objects owned by this class

}

void CDelayUpdate::startUpdate() {

   if (IsActive()) {
   	// probably a programming error so could panic instead
       return;
   }
   //perform anything before timer starts

   After ( TTimeIntervalMicroSeconds32 (4000000) ); // 4 seconds
    

}

void CDelayUpdate::stopUpdate() {

   if (IsActive()) {
    Cancel();
}
   else {
       //probably a programming error so could panic
   }

}

void CDelayUpdate::RunL() {

   //RDebug::Print(_L("CDelayUpdate:runL"));
    
if (iCounter < 5) {

       //do something
        
       After ( 1000000 ); // 1 second
       iCounter++;
   }

}