|
前几天写了由于要写一个录音和回放的程序,所以要使用到计时器;但一开始用的是同步计时器,结果发现出现了许多问题,因为同步计时器启动的时候,会屏蔽所有的用户命令;真是很郁闷。以前就有人建议我写一个简单的异步计数器,但当时决觉得太麻烦(其实是对Symbian C++的知识了解不够),一直托了下来。现在看来是麻烦要写,不麻烦也要写了。
先看一些资料吧,尤其是SDK里面自带的例子,很有用的,其实异步计时器并不向一开始想象的那么复杂。基本思想:写一个类继承CTimer,然后重写它的RunL()和DoCancel()方法;在需要的地方启动计时器,然后在Runl()方法里处理计时结束的任务,或在DoCancel()里面取消计时。注意由于CTimer从CActive继承而来,所以在实现计时器的构造函数里面要给它指定优先级。当然,为了便于管理各个类,最好再实现一个检测计时器的M类。
闲话就不说了,下面是我的计时器的代码。
//一个简单的异步计时器。
//-----.h #ifndef __TIMEOUTTIMER_H__ #define __TIMEOUTTIMER_H__
// INCLUDES #include <e32base.h> class MTimeOutNotifier;
// CLASS DECLARATION
class CTimeOutTimer : public CTimer { public: // Constructors and destructors
static CTimeOutTimer* NewL( const TInt aPriority,MTimeOutNotifier& aTimeOutNotify);
static CTimeOutTimer* NewLC( const TInt aPriority,MTimeOutNotifier& aTimeOutNotify);
virtual ~CTimeOutTimer();
protected: // Functions from base classes
void RunL();
private: // Constructors and destructors
CTimeOutTimer( const TInt aPriority,MTimeOutNotifier& aTimeOutNotify);
void ConstructL();
private://data MTimeOutNotifier& iNotify; };
#endif // __TIMEOUTTIMER_H__
//----------.cpp // INCLUDE FILES #include <aknnotewrappers.h>
#include "TimeOutTimer.h" #include "TimeOutNotifier.h"
// ========================= MEMBER FUNCTIONS ==================================
// ----------------------------------------------------------------------------- // CTimeOutTimer::NewL() // Two-phased constructor. // ----------------------------------------------------------------------------- // CTimeOutTimer* CTimeOutTimer::NewL( const TInt aPriority ,MTimeOutNotifier& aTimeOutNotify) { CTimeOutTimer* self = CTimeOutTimer::NewLC( aPriority, aTimeOutNotify); CleanupStack::Pop( self ); return self; }
// ----------------------------------------------------------------------------- // CTimeOutTimer::NewLC() // Two-phased constructor. // ----------------------------------------------------------------------------- // CTimeOutTimer* CTimeOutTimer::NewLC( const TInt aPriority ,MTimeOutNotifier& aTimeOutNotify) { CTimeOutTimer* self = new ( ELeave ) CTimeOutTimer( aPriority, aTimeOutNotify); CleanupStack::PushL( self ); self->ConstructL(); return self; }
// ----------------------------------------------------------------------------- // CTimeOutTimer::CTimeOutTimer() // C++ default constructor can NOT contain any code, that might leave. //learn about member initialization list first! // ----------------------------------------------------------------------------- // CTimeOutTimer::CTimeOutTimer( const TInt aPriority, MTimeOutNotifier& aTimeOutNotify ) : CTimer( aPriority ), iNotify( aTimeOutNotify ) { // No implementation required }
// ----------------------------------------------------------------------------- // CTimeOutTimer::ConstructL() // Symbian 2nd phase constructor can leave. // ----------------------------------------------------------------------------- // void CTimeOutTimer::ConstructL() { CTimer::ConstructL(); CActiveScheduler::Add( this ); } // ----------------------------------------------------------------------------- // CTimeOutTimer::~CTimeOutTimer() // Destructor. // ----------------------------------------------------------------------------- // CTimeOutTimer::~CTimeOutTimer() { // No implementation required }
// ----------------------------------------------------------------------------- // CTimeOutTimer::RunL() // Called when operation completes. // ----------------------------------------------------------------------------- // void CTimeOutTimer::RunL() { // Timer request has completed, so notify the timer's owner CAknConfirmationNote* note=new(ELeave)CAknConfirmationNote(); note->ExecuteLD(_L("TimeOut!")); iNotify.TimerExpired(); }
//关于类MTimeOutNotifier的定义 //------.h #ifndef __TIMEOUTNOTIFIER_H__ #define __TIMEOUTNOTIFIER_H__
// CLASS DECLARATION /** * MTimeOutNotifier * This class specifies the function to be called when a timeout occurs. * Used in conjunction with CTimeOutTimer class. */ class MTimeOutNotifier { public: // New functions
/** * TimerExpired. * The function to be called when a timeout occurs. */ virtual void TimerExpired() = 0; };
#endif // __TIMEOUTNOTIFIER_H__
|