Archived:Changing asynchronous method to synchronous in Symbian C++
hamishwillee
(Talk | contribs) m (Hamishwillee - Bot change of template (Template:CodeSnippet) - now using Template:ArticleMetaData) |
m (Lpvalente -) |
||
| (7 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
| − | + | [[Category:Symbian C++]][[Category:Code Snippet]][[Category:S60 3rd Edition (initial release)]][[Category:Code Snippet]] | |
| − | + | {{Archived|timestamp=20120313125306|user=roy.debjit| }} | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | | | + | |
| − | | | + | |
| − | | | + | |
| + | {{ArticleMetaData <!-- v1.2 --> | ||
|sourcecode= <!-- Link to example source code (e.g. [[Media:The Code Example ZIP.zip]]) --> | |sourcecode= <!-- Link to example source code (e.g. [[Media:The Code Example ZIP.zip]]) --> | ||
|installfile= <!-- Link to installation file (e.g. [[Media:The Installation File.sis]]) --> | |installfile= <!-- Link to installation file (e.g. [[Media:The Installation File.sis]]) --> | ||
| − | |sdk=<!-- SDK(s) built and tested against (e.g. [http://linktosdkdownload/ Nokia Qt SDK 1.1]) --> | + | |devices= Nokia N95 |
| − | |devicecompatability=<!-- Compatible devices (e.g.: All* (must have GPS) ) --> | + | |sdk= <!-- SDK(s) built and tested against (e.g. [http://linktosdkdownload/ Nokia Qt SDK 1.1]) --> |
| − | |signing=<!-- Empty or one of Self-Signed, DevCert, Manufacturer --> | + | |platform= S60 3rd Edition, MR |
| − | |capabilities=<!-- Capabilities required (e.g. Location, NetworkServices. --> | + | |devicecompatability= <!-- Compatible devices (e.g.: All* (must have GPS) ) --> |
| − | |author=[[User:Tepaa]] | + | |dependencies= <!-- Any other/external dependencies e.g.: Google Maps Api v1.0 --> |
| + | |signing= <!-- Empty or one of Self-Signed, DevCert, Manufacturer --> | ||
| + | |capabilities= <!-- Capabilities required by the article/code example (e.g. Location, NetworkServices. --> | ||
| + | |keywords= CActiveSchedulerWait, CActive, TRequestStatus | ||
| + | |language= <!-- Language category code for non-English topics - e.g. Lang-Chinese --> | ||
| + | |translated-by= <!-- [[User:XXXX]] --> | ||
| + | |translated-from-title= <!-- Title only --> | ||
| + | |translated-from-id= <!-- Id of translated revision --> | ||
| + | |review-by= <!-- After re-review: [[User:username]] --> | ||
| + | |review-timestamp= <!-- After re-review: YYYYMMDD --> | ||
| + | |update-by= <!-- After significant update: [[User:username]]--> | ||
| + | |update-timestamp= <!-- After significant update: YYYYMMDD --> | ||
| + | |creationdate= 20080521 | ||
| + | |author= [[User:Tepaa]] | ||
| + | <!-- The following are not in current metadata --> | ||
| + | |subcategory= Code Examples | ||
| + | |id= CS000983 | ||
}} | }} | ||
| − | + | ||
==Overview== | ==Overview== | ||
| − | This code snippet shows how to change an asynchronous method interface to a | + | {{Abstract|This code snippet shows how to change an asynchronous method interface to a synchronous method. This can be done with CActiveSchedulerWait.}} |
| − | synchronous method. This can be done with CActiveSchedulerWait. | + | |
There are two different synchronous methods: | There are two different synchronous methods: | ||
| Line 28: | Line 35: | ||
* CMyClass::DoAsynchronousWithStatusL() uses CActiveSchedulerWait for waiting for the asynchronous method that has TRequestStatus in its interface. The method completes with CMyClass::RunL(). | * CMyClass::DoAsynchronousWithStatusL() uses CActiveSchedulerWait for waiting for the asynchronous method that has TRequestStatus in its interface. The method completes with CMyClass::RunL(). | ||
| − | For more information on using CActiveSchedulerWait, see article [[ | + | For more information on using CActiveSchedulerWait, see article [[Archived:Using CActiveSchedulerWait]] |
==MMP file== | ==MMP file== | ||
The following capabilities and libraries are required: | The following capabilities and libraries are required: | ||
<code cpp> | <code cpp> | ||
| − | CAPABILITY | + | CAPABILITY None |
| − | LIBRARY | + | LIBRARY euser.lib |
</code> | </code> | ||
| Line 67: | Line 74: | ||
private: | private: | ||
CSomeAsyncClass* iSomeAsyncClass; | CSomeAsyncClass* iSomeAsyncClass; | ||
| − | CActiveSchedulerWait | + | CActiveSchedulerWait iSchedulerWait; |
| − | TInt | + | TInt iResult; |
}; | }; | ||
</code> | </code> | ||
| Line 148: | Line 155: | ||
void CMyClass::DoCancel() | void CMyClass::DoCancel() | ||
{ | { | ||
| − | // This cancels the | + | // This cancels the DoAsynchronousWithStatusL() method |
iResult = KErrCancel; | iResult = KErrCancel; | ||
iSchedulerWait.AsyncStop(); | iSchedulerWait.AsyncStop(); | ||
| Line 158: | Line 165: | ||
==See also== | ==See also== | ||
| − | [[ | + | [[Archived:Using CActiveSchedulerWait]] |
| − | + | ||
| − | + | ||
Latest revision as of 01:26, 25 August 2012
Archived: This article is archived because it is not considered relevant for third-party developers creating commercial solutions today. If you think this article is still relevant, let us know by adding the template {{ReviewForRemovalFromArchive|user=~~~~|write your reason here}}.
Contents |
Overview
This code snippet shows how to change an asynchronous method interface to a synchronous method. This can be done with CActiveSchedulerWait.
There are two different synchronous methods:
- CMyClass::DoAsynchronousL() uses CActiveSchedulerWait for waiting for the asynchronous method that completes with CMyClass::AsyncComplete()
- CMyClass::DoAsynchronousWithStatusL() uses CActiveSchedulerWait for waiting for the asynchronous method that has TRequestStatus in its interface. The method completes with CMyClass::RunL().
For more information on using CActiveSchedulerWait, see article Archived:Using CActiveSchedulerWait
MMP file
The following capabilities and libraries are required:
CAPABILITY None
LIBRARY euser.lib
Header
#include <e32base.h>
// for CSomeAsyncClass
class MAsynchIF
{
public:
void AsyncComplete(TInt aResult);
};
class CMyClass : public CActive, MAsynchIF
{
public:
static CMyClass* NewLC();
virtual ~CMyClass();
// Synchronous methods
TInt DoAsynchronousL();
TInt DoAsynchronousWithStatusL();
private: // From MAsynchIF (CSomeAsyncClass)
void AsyncComplete(TInt aResult);
private: // From CActive
void RunL();
void DoCancel();
private:
CSomeAsyncClass* iSomeAsyncClass;
CActiveSchedulerWait iSchedulerWait;
TInt iResult;
};
Source
CMyClass* CMyClass::NewLC()
{
CMyClass* self = new (ELeave) CMyClass();
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
CMyClass::CMyClass()
: CActive(CActive::EPriorityStandard)
{
}
void CMyClass::ConstructL()
{
CActiveScheduler::Add(this);
iSomeAsyncClass = CSomeAsyncClass::NewL(this);
}
CMyClass::~CMyClass()
{
Cancel();
delete iSomeAsyncClass;
}
// This is a synchronous method even though it calls an asynchronous interface that
// completes with CMyClass::AsyncComplete()
TInt CMyClass::DoAsynchronousL()
{
User::LeaveIfError(iSomeAsyncClass->SomeAsynchronousIfL());
iSchedulerWait.Start();
// Continues here after CMyClass::AsyncComplete() is called
// by CSomeAsyncClass.
return iResult;
}
void CMyClass::AsyncComplete(TInt aResult)
{
iResult = aResult;
iSchedulerWait.AsyncStop();
}
// This is an synchronous method even though it calls an asynchronous interface that
// completes with CMyClass::RunL() because it uses TRequestStatus as
// a parameter
TInt CMyClass::DoAsynchronousWithStatusL()
{
if (!IsActive())
{
User::LeaveIfError(iSomeAsyncClass->SomeAsynchronousIfL(iStatus));
SetActive();
iSchedulerWait.Start();
// Continues here after CMyClass::RunL() is called
// by CSomeAsyncClass.
}
else
{
User::Leave(KErrNotReady);
}
return iResult;
}
void CMyClass::RunL()
{
// This is called when DoAsynchronousWithStatusL() completes
iResult = iStatus.Int();
iSchedulerWait.AsyncStop();
}
void CMyClass::DoCancel()
{
// This cancels the DoAsynchronousWithStatusL() method
iResult = KErrCancel;
iSchedulerWait.AsyncStop();
}
Postconditions
The asynchronous methods looks like a synchronous method.

