#pragma once #include "monitor.h" #include #include template class Consumer : public QThread { private: int ID; static Monitor *mon; static QSemaphore numProducts; public: static void (*consume)(T i, int); static void initClass(int numP, Monitor *m, void (*cons)(T, int)) { numProducts.release(numP); mon = m; consume = cons; }; Consumer(int i) : ID(i) {}; void run() { while (numProducts.tryAcquire()) { // While not all numProducts are consumed: T* aux = mon->canGet(); // Get pointer to item in itemQ T item = *aux; // Take the item out of itemQ mon->doneGetting(aux); // Give info to producer threads (*consume)(item,ID); // Consume one item } }; }; template QSemaphore Consumer::numProducts; template Monitor *Consumer::mon; template<> void (*Consumer::consume)(int, int) = NULL;