The following example code shows how active objects are started. While the example shows the creation of an active scheduler, in UI applications, an active scheduler is always provided.
Create an instance of the active scheduler,
exampleScheduler
. In ER5, this would be an instance of a derived
class in order to provide a suitable Error()
function to handle
leaves occurring in the active object RunL()
function(s).
Push exampleScheduler
onto the cleanup stack and
install as the current active scheduler.
Create an active object, myActiveObject
, and pass a
pointer to the service provider as the parameter. Note that often, the service
provider may be constructed as part of the active object's own construction
processing.
Issue a request using IssueRequest()
.
Use CActiveScheduler::Start()
to start the active
scheduler’s wait loop. At least one outstanding request is necessary
before the wait loop is started, otherwise the thread hangs. All further
request issuing and servicing occurs within this function. The wait loop
continues until one of the active objects’ RunL()
requests
termination using CActiveScheduler::Stop()
.
Pop the active object, the active scheduler and the example
service provider from the clean-up stack, and destroy. The code assumes that
the active object does not take ownership of the
CExampleServiceProvider
object and is not responsible for its
destruction.
LOCAL_C void doExampleL()
{
// Create and install the active scheduler
CActiveScheduler* exampleScheduler=new (ELeave) CActiveScheduler;
CleanupStack::PushL(exampleScheduler);
CActiveScheduler::Install(exampleScheduler);
// Create the service provider. Often, the
// service provider is part of the active object
CExampleServiceProvider* myServiceProvider=new (ELeave) CExampleServiceProvider;
CleanupStack::PushL(myServiceProvider);
// Create the active object and issue the
// first asynchronous request
CExampleActiveObject * myActiveObject=new (ELeave) CExampleActiveObject(myServiceProvider);
CleanupStack::PushL(myActiveObject);
myActiveObject->IssueRequest();
// Now we can start the active scheduler
CActiveScheduler::Start();
// Remove the exampleScheduler and other
// objects from cleanup stack and destroy them
CleanupStack::PopAndDestroy(3);
}