diff -r 89d6a7a84779 -r 25a17d01db0c Symbian3/PDK/Source/GUID-162A4409-1ABB-51A1-B7F1-75A31A5DEA63.dita --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/PDK/Source/GUID-162A4409-1ABB-51A1-B7F1-75A31A5DEA63.dita Fri Jan 22 18:26:19 2010 +0000 @@ -0,0 +1,82 @@ + + + + + +Using +CIdleThis 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.

+
\ No newline at end of file