This page was last modified 18:25, 28 July 2007.
Активные объекты - разбиение выполнения длительной операции
From Forum Nokia Wiki
Перевод с английского, оригинальная статья находится здесь.
Класс CSimpleAO демонстрирует, как разбить выполнение длительной операции на части используя активные объекты. Такая реализация применима только к операциям, выполнение которых может быть поделено на шаги и каждый шаг может быть обработан в функции DoOneRound().
При конструировании активного объекта важно правильно указать приоритет; созданный активный объект перед использованием необходимо добавить в планировщик (CActiveScheduler), как показано в функции ConstructL(); после вызова любой асинхронной функции должен быть вызван метод SetActive().
Приоритет активного объекта всегда должен быть настолько мал, насколько это возможно. Если будет выставлен слишком высокий приоритет, то долго выполняемые операции могут оставаться заблокированными другими обработчиками с более низким приоритетом.
При расширении приведенного ниже примера, всю необходимую инициализацию можно добавить в метод StartProcess(), а каждый шаг выполнения длительной операции реализовать в методе DoOneRound().
SimpleAO.cpp
CSimpleAO* CSimpleAO::NewL(MSimpleAOObserver& aObserver) { CSimpleAO* self = NewLC(aObserver); CleanupStack::Pop(self); return self; } CSimpleAO* CSimpleAO::NewLC(MSimpleAOObserver& aObserver) { CSimpleAO* self = new (ELeave) CSimpleAO(aObserver); CleanupStack::PushL(self); self->ConstructL(); return self; } CSimpleAO::CSimpleAO(MSimpleAOObserver& aObserver) :CActive(0),iObserver(aObserver) { } CSimpleAO::~CSimpleAO() { Cancel(); } void CSimpleAO::ConstructL(void) { CActiveScheduler::Add(this); } void CSimpleAO::StartProcess(void) { iRounds = 100; iCurrent= 0; iError = KErrNone; iCancel= EFalse; TRequestStatus* status=&iStatus; User::RequestComplete(status, KErrNone); SetActive(); } void CSimpleAO::DoCancel() { iCancel = ETrue; } void CSimpleAO::RunL() { iError = iStatus.Int(); if(iError != KErrNone || (iCurrent > iRounds)) { FinnishedL(); } else { iObserver.MeProcessL(iCurrent,iRounds); TInt Err = DoOneRound(); TRequestStatus* status=&iStatus; User::RequestComplete(status, Err); SetActive(); } } TInt CSimpleAO::DoOneRound(void) { TInt RetError(KErrNone); // Здесь должна быть реализация выполнения каждого шага iCurrent++; return RetError; } void CSimpleAO::FinnishedL(void) { iObserver.MeFinnishL(this,iError); }
SimpleAO.h
#include <e32base.h> #include <F32FILE.H> class MSimpleAOObserver { public: // New methods virtual void MeProcessL(TInt aNow,TInt aFull) = 0; virtual void MeFinnishL(CSimpleAO* aObject, TInt aError) = 0; }; class CSimpleAO : public CActive { public: static CSimpleAO* NewL(MSimpleAOObserver& aObserver); static CSimpleAO* NewLC(MSimpleAOObserver& aObserver); ~CSimpleAO(); void StartProcess(void); protected: void DoCancel(); void RunL(); private: TInt DoOneRound(void); void FinnishedL(void); private: MSimpleAOObserver& iObserver; TBool iCancel; TInt iCurrent,iRounds,iError; };
| Related Discussions | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| ошибка esock_client 14 | b_monkey | Russian Developer Forum - Форум Российских разработчиков | 10 | 2008-02-21 08:05 |
| Как определить версию Symbian OS | UGreek | Russian Developer Forum - Форум Российских разработчиков | 2 | 2008-01-04 09:10 |
| Помогите разобраться, а то загруз в ресурсах | JTOne | Russian Developer Forum - Форум Российских разработчиков | 14 | 2008-01-06 15:29 |
| Есть ли библиотеки для работы с fixed point? | Ecconaut | Russian Developer Forum - Форум Российских разработчиков | 22 | 2008-02-03 12:39 |
| RSendAsMessage - передача файлов по Bluetooth | Den123 | Russian Developer Forum - Форум Российских разработчиков | 2 | 2008-03-06 17:28 |
