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 E32Main() function, which executes the example. 00015 // The example demonstrates the use of local condition variable IPC mechanism. The threads created in the process use this condition variable to co-operate with each other. 00016 // The example performs the following tasks: 00017 // - create an object of the CQueue class, which in turn crates a queue of integer tokens 00018 // - create an object of the CProducer class, which in turn creates the producer thread 00019 // - create an object of the CConsumer class, which in turn creates the consumer thread 00020 // - create an object of the CUserInterface class ,which accepts asynchronous key press events from the console. 00021 // The CUserInterface class provides an interface for the user to interact with the threads created in the example. 00022 // The CQueue::iCondVar is the local condition varaibale that is used by the two threads to co-operate with each other. 00023 // 00024 00025 00026 00035 #include "globals.h" 00036 #include "queue.h" 00037 #include "producer.h" 00038 #include "consumer.h" 00039 #include "userinterface.h" 00040 00041 LOCAL_D CConsoleBase* console; 00042 LOCAL_C void DoExampleL(); 00043 LOCAL_C void callExampleL(); 00044 00045 LOCAL_C void DoExampleL() 00046 { 00047 CActiveScheduler* scheduler = new (ELeave) CActiveScheduler(); 00048 CleanupStack::PushL(scheduler); 00049 CActiveScheduler::Install(scheduler); 00050 00051 // Create an object of the CQueue class. 00052 CQueue* tokens = CQueue::NewL(); 00053 CleanupStack::PushL(tokens); 00054 00055 // Print the KTextInvokeProducer string and wait for a key press. 00056 _LIT(KTextInvokeProducer,"Creating and starting the Producer Thread...[This produces a token every two seconds]\n"); 00057 console->Printf(KTextInvokeProducer); 00058 _LIT(KTxtPressAnyKeyToContinue,"[press any key to continue]\n"); 00059 console->Printf(KTxtPressAnyKeyToContinue); 00060 console->Getch(); 00061 // Create an object of the CProducer class. 00062 CProducer* prod = CProducer::NewL(console,tokens); 00063 CleanupStack::PushL(prod); 00064 00065 // Print the KTextInvokeConsumer string and wait for a key press. 00066 _LIT(KTextInvokeConsumer,"Creating and starting the Consumer Thread...[This consumes a token every second]\n"); 00067 console->Printf(KTextInvokeConsumer); 00068 console->Printf(KTxtPressAnyKeyToContinue); 00069 console->Getch(); 00070 00071 // Create an object of the CConsumer class. 00072 CConsumer* cons = CConsumer::NewL(console,tokens); 00073 CleanupStack::PushL(cons); 00074 00075 // Create an object of the CUserInterface class. 00076 // This handles key press requests from the console. 00077 CUserInterface* ui = CUserInterface::NewL(console,prod); 00078 CleanupStack::PushL(ui); 00079 00080 _LIT(KTextStartAS,"Starting the active scheduler...\n"); 00081 console->Printf(KTextStartAS); 00082 // Issue an asynchronous read request. 00083 ui->ReadFunc(); 00084 // Start the active scheduler. 00085 CActiveScheduler::Start(); 00086 00087 CleanupStack::PopAndDestroy(5,scheduler); 00088 } 00089 00090 GLDEF_C TInt E32Main() 00091 { 00092 __UHEAP_MARK; 00093 CTrapCleanup* cleanup=CTrapCleanup::New(); 00094 TRAPD(error,callExampleL()); 00095 delete cleanup; 00096 __ASSERT_ALWAYS(!error,User::Panic(KTxtEPOC32EX,error)); 00097 __UHEAP_MARKEND; 00098 return 0; 00099 } 00100 00101 LOCAL_C void callExampleL() 00102 { 00103 console=Console::NewL(KTxtExampleCode,TSize(KConsFullScreen,KConsFullScreen)); 00104 CleanupStack::PushL(console); 00105 TRAPD(error,DoExampleL()); 00106 if (error) 00107 console->Printf(KFormatFailed, error); 00108 else 00109 console->Printf(KTxtOK); 00110 console->Printf(KTxtPressAnyKey); 00111 console->Getch(); 00112 CleanupStack::PopAndDestroy(); 00113 }
Copyright ©2010 Nokia Corporation and/or its subsidiary(-ies).
All rights
reserved. Unless otherwise stated, these materials are provided under the terms of the Eclipse Public License
v1.0.