|
||
An active object uses an asynchronous service provider class to provide the service. The active object hides the asynchronous service provider. The active object must provide:
a function that requests a service from the service provider
a function that cancels a request for service from the service provider.
All active objects are derived from CActive
. This class
provides derived active objects with:
the data member iStatus
. This data member is a
TRequestStatus
type object. This object is passed to the request
functions of the asynchronous service provider. The request functions of the
active object do not include a TRequestStatus
in their parameters.
The exception to this rule occurs when the active object acts as a secondary
supplier of asynchronous services.
the Cancel()
function. This function cancels a request
to the service provider. Cancel()
does nothing if there is no
outstanding request. If a request is pending, Cancel()
calls
DoCancel()
. DoCancel()
is a pure virtual function
that a derived class supplies. DoCancel()
must deal with the
specific cancellation behaviour that the service provider requires.
Cancel()
waits for the request to complete and then marks the
request not active.
the TPriority
enumeration. This enumeration defines the
set of priorities that an active object can take. The priority of the active
object is set during construction of the active object. When the active
scheduler's wait completes, it checks the active object with the highest
priority. Where active objects have the same priority, the order of checking is
not defined.
Classes derived from CActive
must:
own an asynchronous service provider. It may do this by containing either an instance of the required service provider or a handle to that provider.
provide one or more request functions, such as
IssueRequest()
, which pass on the request to an asynchronous
service provider.
implement a DoCancel()
function which passes on a cancel
request to the asynchronous service provider
provide a RunL()
function, which is called by the active
scheduler when it detects that an active object’s request has completed.
provide a RunError()
function, which is called by the
active scheduler if the active object's RunL()
function leaves. A
derived class can use the default implementation but this just propagates the
leave code up to the active scheduler.