diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/consumer_8cpp_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/consumer_8cpp_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,106 @@ + + +
+ +00001 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +00002 // All rights reserved. +00003 // This component and the accompanying materials are made available +00004 // under the terms of "Eclipse Public License v1.0" +00005 // which accompanies this distribution, and is available +00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html". +00007 // +00008 // Initial Contributors: +00009 // Nokia Corporation - initial contribution. +00010 // +00011 // Contributors: +00012 // +00013 // Description: +00014 // Contains the definition of member functions of the CConsumer class. +00015 // +00016 +00017 +00018 +00023 #include "consumer.h" +00024 +00031 CConsumer* CConsumer::NewL(CConsoleBase* aConsole,CQueue* aTokens) +00032 { +00033 CConsumer* self = new (ELeave)CConsumer; +00034 CleanupStack::PushL(self); +00035 self->ConstructL(aConsole,aTokens); +00036 CleanupStack::Pop(self); +00037 return self; +00038 } +00039 +00051 void CConsumer::ConstructL(CConsoleBase* aConsole,CQueue* aTokens) +00052 { +00053 iConsole = aConsole; +00054 iQueue = aTokens; +00055 +00056 // Create an object of the CPeriodic class. +00057 iPeriodicCons = CPeriodic::NewL(CActive::EPriorityUserInput); +00058 +00059 // Create the Consumer thread. +00060 _LIT(KConsumer,"ConsumerThread"); +00061 User::LeaveIfError(iConsThread.Create(KConsumer,ConsThreadFunc,KDefaultStackSize,KMinHeapSize,256*KMinHeapSize,iQueue,EOwnerThread)); +00062 iConsThread.SetPriority(EPriorityMore); +00063 +00064 // Make the Consumer thread more intensive than the Producer thread. +00065 // Consumer thread frequency is twice the Producer thread frequency. +00066 // Associate RemoveFunction() as the call back function for the iPeriodicCons object. +00067 iPeriodicCons->Start(2000000,2000000,TCallBack(RemoveFunction,this)); +00068 } +00069 +00073 CConsumer::CConsumer() +00074 { +00075 } +00076 +00082 TInt CConsumer::ConsThreadFunc(TAny* aPtr) +00083 { +00084 // The while loop mechanism ensures that the thread performs the CQueue::Remove() operation each time RThread::Resume() is invoked on the thread handle. +00085 while(true) +00086 { +00087 CQueue* ptr = (CQueue*)aPtr; +00088 __ASSERT_ALWAYS(ptr,User::Panic(KTxtPanic,-1)); +00089 // Remove a token from the queue. +00090 ptr->Remove(); +00091 // Suspend the thread. +00092 RThread().Suspend(); +00093 } +00094 return KErrNone; +00095 } +00096 +00097 +00101 void CConsumer::ResumeCons() +00102 { +00103 // Call the RThread::Resume() function on the consumer thread. +00104 // Control goes to the CConsumer::ConsThreadFunc() function after this statement. +00105 iConsThread.Resume(); +00106 } +00107 +00111 CConsumer::~CConsumer() +00112 { +00113 iConsThread.Kill(KErrCancel); +00114 delete iPeriodicCons; +00115 } +00116 +00117 +00123 TInt CConsumer::RemoveFunction(TAny* aPtr) +00124 { +00125 CConsumer* ptr = static_cast<CConsumer*> (aPtr); +00126 __ASSERT_ALWAYS(ptr,User::Panic(KTxtPanic,-1)); +00127 // Invoke the RThread::Resume() function on the consumer thread repeatedly. +00128 ptr->ResumeCons(); +00129 return KErrNone; +00130 } +