Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

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
 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX