// // NotificationQueue.cpp // // $Id: //poco/1.2/Foundation/samples/NotificationQueue/src/NotificationQueue.cpp#1 $ // // This sample demonstrates the NotificationQueue, ThreadPool, // FastMutex and ScopedLock classes. // // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. // and Contributors. // // Permission is hereby granted, free of charge, to any person or organization // obtaining a copy of the software and accompanying documentation covered by // this license (the "Software") to use, reproduce, display, distribute, // execute, and transmit the Software, and to prepare derivative works of the // Software, and to permit third-parties to whom the Software is furnished to // do so, all subject to the following: // // The copyright notices in the Software and this entire statement, including // the above license grant, this restriction and the following disclaimer, // must be included in all copies of the Software, in whole or in part, and // all derivative works of the Software, unless such copies or derivative // works are solely in the form of machine-executable object code generated by // a source language processor. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT // SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE // FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. // #include "Poco/Notification.h" #include "Poco/NotificationQueue.h" #include "Poco/ThreadPool.h" #include "Poco/Thread.h" #include "Poco/Runnable.h" #include "Poco/Mutex.h" #include "Poco/Random.h" #include "Poco/AutoPtr.h" #include using Poco::Notification; using Poco::NotificationQueue; using Poco::ThreadPool; using Poco::Thread; using Poco::Runnable; using Poco::FastMutex; using Poco::Random; using Poco::AutoPtr; class WorkNotification: public Notification // The notification sent to worker threads. { public: WorkNotification(int data): _data(data) { } int data() const { return _data; } private: int _data; }; class Worker: public Runnable // A worker thread that gets work items // from a NotificationQueue. { public: Worker(const std::string& name, NotificationQueue& queue): _name(name), _queue(queue) { } void run() { Random rnd; for (;;) { AutoPtr pNf(_queue.waitDequeueNotification()); if (pNf) { WorkNotification* pWorkNf = dynamic_cast(pNf.get()); if (pWorkNf) { FastMutex::ScopedLock lock(_mutex); std::cout << _name << " got work notification " << pWorkNf->data() << std::endl; Thread::sleep(rnd.next(200)); } } else break; } } private: std::string _name; NotificationQueue& _queue; static FastMutex _mutex; }; FastMutex Worker::_mutex; int main(int argc, char** argv) { NotificationQueue queue; // create some worker threads Worker worker1("Worker 1", queue); Worker worker2("Worker 2", queue); Worker worker3("Worker 3", queue); // start worker threads ThreadPool::defaultPool().start(worker1); ThreadPool::defaultPool().start(worker2); ThreadPool::defaultPool().start(worker3); // distribute some work for (int i = 0; i < 50; ++i) { queue.enqueueNotification(new WorkNotification(i)); } // wait until queue is empty and all threads are // waiting for new work. while (!queue.empty()) Thread::sleep(200); Thread::sleep(500); // stop all worker threads queue.wakeUpAll(); ThreadPool::defaultPool().joinAll(); return 0; }