Using CIdle

This document describes how to use the CIdle class to implement long running background tasks.

An instance of the CIdle class, an idle time active object, can be used to perform low-priority processing when no higher-priority active objects are ready to run.

An idle time active object together with its associated callback function may be used to implement potentially long running background tasks, such as spreadsheet recalculation and word processor repagination.

A typical example is a background re-calculation in a spreadsheet. Assume that the spreadsheet is encapsulated by some class CSheet .

      
       
      
      class CSheet
 {
 ...
 TInt LaunchReCalcL();
 TInt DoBackgroundRecalc();
 static TInt BackgroundRecalc(TAny *aSheet);
 ...
private:
 CIdle* iRecalc;
 ...
 };
     

Assume that a CSheet object has been created and that, as a result of user interaction or some other event, a background re-calculation is launched by a call to LaunchReCalc() . The implementation of this function would construct a CIdle object, specifying a suitably low priority. The value CActive::EPriorityIdle is recommended:

      
       
      
      TInt CSheet::LaunchReCalcL()
 {
 ...
 if (!(iRecalc))
  {
  iRecalc = CIdle::NewL(CActive::EPriorityIdle);
  }
 ...
 iRecalc->Start(TCallBack(BackgroundRecalc,this)); 
 ...
 };
     

To start the background recalculation which is performed by the DoBackGroundRecalc() member function of CSheet , start by coding:

      
       
      
      iRecalc->Start(TCallBack(BackgroundRecalc,this));
     

CIdle::Start() requires a TCallBack object to encapsulate the function to be called and a pointer to be passed as a parameter to that function. As the encapsulated function must either be static or a non-member function, the easiest way to handle this is to pass the static function BackgroundRecalc() and a pointer to the sheet object itself. BackgroundRecalc() then calls the non-static DoBackgroundRecalc() :

      
       
      
      TInt Sheet::BackgroundRecalc(TAny* aSheet)
 {
 return ((CSheet*)aSheet)->DoBackgroundRecalc();
 }
     

BackgroundRecalc() is called when there are no higher priority active objects with events to process. It does a small amount of recalculation before returning.

If the function has further work to do, it returns a true value to ensure that it is called again when there is no other higher priority event to handle. When the function finally completes its recalculation task, it returns a false value; the function is not called again.

Typically, an object such as CSheet or some other object accessible from CSheet , keeps track of the state of the re-calculation.

It is important for application responsiveness that each iteration of the idle time object take only a short time. All other events handled by the active scheduler, even high-priority ones, cannot be processed until the idle time object's callback function returns.

When the background recalculation is complete, the callback function is not called again. The idle time active object can be destroyed or left until needed again.

If Cancel() is called, the callback function is not called again. An application would need to implement appropriate cleanup.