ActiveObject 活动对像练习
活动对像都继承自 CActive 类,则活动对像调度器管理,对这个活动对像并不太了解,下面说说主要的:
目前对活动对像并没有深入了解, DoCancel只知道是用到取消的,但还没有实际去操作,下面只是把练习的代码放出来,到时
再回头深入了解活动对像
代码
//
Include Files
#include " ActiveLx.h " #include < e32base.h > #include < e32std.h > #include < e32cons.h > // Console // Constants _LIT(KTextConsoleTitle, " Console " ); _LIT(KTextFailed, " failed, leave code = %d " ); _LIT(KTextPressAnyKey, " [press any key]\n " ); // Global Variables LOCAL_D CConsoleBase * console; // write all messages to this static TInt word; static TInt num; class CActiveTimer; class CWord: public CBase { public : static CWord * NewL(TInt aMaxLength); static CWord * NewLC(TInt aMaxLength); private : CWord(TInt aMaxLength); void ConstructL(TInt aMaxLength); public : TInt WordNumCountL(TChar aChar); void OutputWord(); TInt WordNum(); TInt Length(); TInt MaxLength(); ~ CWord(); private : TInt iLenght; TInt iMaxLength; HBufC * iHBuffC; }; class CAOExample: public CActive { public : static CAOExample * NewL(CConsoleBase * aConsole); static CAOExample * NewLC(CConsoleBase * aConsole); private : CAOExample(); void ConstructL(CConsoleBase * aConsole); public : void Start(); void PrintWord(); void PrintWordNum(); void KeyPressInput(TChar aChar); ~ CAOExample(); private : void RunL(); void Cancel(); void DoCancel(); private : CConsoleBase * iConsole; CWord * iCWord; }; CAOExample * CAOExample::NewL( CConsoleBase * aConsole ) { CAOExample * self = CAOExample::NewLC(aConsole); CleanupStack::Pop(); return self; } CAOExample * CAOExample::NewLC( CConsoleBase * aConsole ) { CAOExample * self = new (ELeave)CAOExample(); CleanupStack::PushL(self); self -> ConstructL(aConsole); return self; } CAOExample::CAOExample():CActive(EPriorityStandard) { } void CAOExample::ConstructL( CConsoleBase * aConsole ) { iConsole = aConsole; this -> iCWord = CWord::NewL( 2 ); CActiveScheduler::Add( this ); } void CAOExample::Start() { iConsole -> Read(iStatus); SetActive(); } void CAOExample::PrintWord() { iCWord -> OutputWord(); } void CAOExample::PrintWordNum() { _LIT(KFormat1, " You input word num:%d\n " ); iConsole -> Printf(KFormat1,iCWord -> WordNum()); iConsole -> Printf(_L( " pleae input new word " )); } void CAOExample::KeyPressInput( TChar aChar ) { iCWord -> WordNumCountL(aChar); if (iCWord -> Length() == iCWord -> MaxLength()) { PrintWord(); } if (aChar == EKeyEnter) { PrintWordNum(); word = 0 ; num = 0 ; } Start(); } CAOExample:: ~ CAOExample() { delete iCWord; iCWord = NULL; iConsole = NULL; } void CAOExample::RunL() { KeyPressInput(TChar(iConsole -> KeyCode())); } void CAOExample::Cancel() { DoCancel(); } void CAOExample::DoCancel() { iConsole -> ReadCancel(); } CWord * CWord::NewL( TInt aMaxLength ) { CWord * self = CWord::NewLC(aMaxLength); CleanupStack::Pop(); return self; } CWord * CWord::NewLC( TInt aMaxLength ) { CWord * self = new (ELeave)CWord(aMaxLength); CleanupStack::PushL(self); self -> ConstructL(aMaxLength); return self; } CWord::CWord( TInt aMaxLength ) { iMaxLength = aMaxLength; iLenght = 0 ; } void CWord::ConstructL( TInt aMaxLength ) { iHBuffC = HBufC::NewL(aMaxLength); } void CWord::OutputWord() { console -> Printf(iHBuffC -> Des()); iHBuffC -> Des().Zero(); iLenght = 0 ; } TInt CWord::WordNum() { return num; } TInt CWord::Length() { return iLenght; } TInt CWord::MaxLength() { return iMaxLength; } CWord:: ~ CWord() { delete iHBuffC; iHBuffC = NULL; iLenght = 0 ; iMaxLength = 0 ; } TInt CWord::WordNumCountL( TChar aChar ) { TPtr ptr = iHBuffC -> Des(); if (iLenght < iMaxLength) { ptr.Append(aChar); if ( ! ( ' A ' <= aChar && aChar <= ' Z ' || ' a ' <= aChar && aChar <= ' z ' )) { word = 0 ; } else { if (word == 0 ) { word = 1 ; ++ num; } } iLenght ++ ; return 1 ; } else return 0 ; } class CActiveTimer: public CTimer { public : static CActiveTimer * NewL(CConsoleBase * aConsole); static CActiveTimer * NewLC(CConsoleBase * aConsole); ~ CActiveTimer(); private : CActiveTimer(); void ConstructL(CConsoleBase * aConsole); public : void Start(); private : void RunL(); void Cancel(); void DoCancel(); void Stop(); private : CConsoleBase * iConsole; TTime iTime; RTimer iTimer; TBool iStop; }; CActiveTimer * CActiveTimer::NewL( CConsoleBase * aConsole ) { CActiveTimer * self = CActiveTimer::NewLC(aConsole); CleanupStack::Pop(); return self; } CActiveTimer * CActiveTimer::NewLC( CConsoleBase * aConsole ) { CActiveTimer * self = new (ELeave)CActiveTimer(); CleanupStack::PushL(self); self -> ConstructL(aConsole); return self; } CActiveTimer:: ~ CActiveTimer() { iConsole = NULL; iTimer.Close(); } CActiveTimer::CActiveTimer():CTimer(CActive::EPriorityStandard) { iStop = FALSE; } void CActiveTimer::Start() { if (IsActive()) return ; iTimer.After(iStatus, 1000 ); SetActive(); } void CActiveTimer::Stop() { iStop = TRUE; } void CActiveTimer::DoCancel() { CTimer::DoCancel(); } void CActiveTimer::Cancel() { DoCancel(); } void CActiveTimer::RunL() { if (iStop == FALSE) { iTime.HomeTime(); iConsole -> ClearScreen(); TDay day = iTime.DayNoInWeek(); TDayName DName; DName.Set(day); DName.ZeroTerminate(); TDateTime dt; dt = iTime.DateTime(); _LIT(KTime, " today is:%d-%d-%d\n%s\n%d:%d:%d time \n " ); iConsole -> Printf(KTime,dt.Year(),dt.Month() + 1 ,dt.Day() + 1 ,DName.Ptr(), dt.Hour(),dt.Minute(),dt.Second()); Start(); } else CActiveScheduler::Stop(); } void CActiveTimer::ConstructL( CConsoleBase * aConsole ) { CTimer::ConstructL(); iConsole = aConsole; iTimer.CreateLocal(); CActiveScheduler::Add( this ); } // Local Functions LOCAL_C void MainL( const TDesC & aArgs) { // // add your program code here, example code below // // console->Write(_L("Hello, world!\n")); /* _LIT(KFormat1,"length=%d\nsize=%d\ncontent=%S"); HBufC* aTest = HBufC::NewL(12); CleanupStack::PushL(aTest); _LIT(KTest,"qijianzhou"); TPtr ptr = aTest->Des(); TBuf<12> aBuf(KTest); // 测试刚创建完后长度及大小 console->Printf(KFormat1,aTest->Length(),aTest->Size(),&ptr); console->Getch(); ptr.Append(aBuf); console->Printf(KFormat1,aTest->Length(),aTest->Size(),&ptr); console->Getch(); ptr.Zero(); console->Printf(KFormat1,aTest->Length(),aTest->Size(),&ptr); CleanupStack::PopAndDestroy(); */ console -> Printf(_L( " \nCommand line args: \ " % S\ " \n " ), & aArgs); } LOCAL_C void DoStartL() { // Create active scheduler (to run active objects) CActiveScheduler * scheduler = new (ELeave) CActiveScheduler(); CleanupStack::PushL(scheduler); CActiveScheduler::Install(scheduler); // Call main function with command line // TBuf<256> cmdLine; // RProcess().CommandLine(cmdLine); // MainL(cmdLine); CAOExample * ao = CAOExample::NewLC(console); ao -> Start(); CActiveTimer * at = CActiveTimer::NewLC(console); // at->Start(); scheduler -> Start(); CleanupStack::PopAndDestroy( 2 ); // Delete active scheduler CleanupStack::PopAndDestroy(scheduler); } // Global Functions GLDEF_C TInt E32Main() { // Create cleanup stack __UHEAP_MARK; CTrapCleanup * cleanup = CTrapCleanup::New(); // Create output console TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(KConsFullScreen,KConsFullScreen))); if (createError) return createError; // Run application code inside TRAP harness, wait keypress when terminated TRAPD(mainError, DoStartL()); if (mainError) console -> Printf(KTextFailed, mainError); console -> Printf(KTextPressAnyKey); console -> Getch(); delete console; delete cleanup; __UHEAP_MARKEND; return KErrNone; } // End of file
|