/* private: QWaitCondition wait; bool flagStop; QMutex lock;*/public:void run{ for(;!flagStop;) { lock.lock(); wait.wait(&lock); if (turn.size() == 0) { lock.unlock(); continue; } int tmpSize = turn.size(); lock.unlock(); for(;tmpSize != 0;) { createResultString(getTurn()); tmpSize--; } }}void addTurn(некие данные inData){ lock.lock(); turn.push(inData); lock.unlock(); wait.wakeAll();}
void run{ for(;!flagStop;) { lock.lock(); wait.wait(&lock); for (;turn.size() != 0;) { // тут много много действий по обработке ; } }}
C++ (Qt)void run{ while (true) { { if (flagStop) break; // проверяем флаг останова lock.lock(); // захватываем лок, др нитки не смогут изменить turn пока не освободим if (!turn.size()) // если в очереди нет задач - wait.wait(&lock); // wait освободил мутекс, ждем побудки // после возврата из wait мы опять владеем мутексом // должны извлечь задачи из oчереди (turn) и освободить мутекс поскорее// сколько задач извлекать - дело хозяйское int numExtract = turn.siize(); if (mProcessMode == process_Single) numExtract = qMin(numExtract, 1); // извлекаем во временный контейнер Container temp; for (int i = 0; i < numExtract; ++i) temp.push_back(turn.takeAt(0)); // освобождаем мутекс lock.unlock(); // обрабатываем извлеченные данные ProcessData(temp); }}
lock.lock(); // получаем элемент из очереди. разблокируем. обрабатываем. pars tmp; tmp = turn.front(); turn.pop(); lock.unlock(); return tmp;
lock.unlock();// В этот момент др нитка добавила новую задачу и сделала wakeAll которое не имеет эффекта for(;tmpSize != 0;) {
C++ (Qt)temp = turn.takeAt(0); lock.unlock();ProcessData(temp);
C++ (Qt)// извлекаем во временный контейнер Container temp; for (int i = 0; i < numExtract; ++i) temp.push_back(turn.takeAt(0)); // освобождаем мутекс lock.unlock(); // обрабатываем извлеченные данные ProcessData(temp);