void WhriteThread::run(){ QLinkedList<int>::const_iterator i = list->begin(); curr = first; while(i!= list->end()) { mutex.lock(); while(!agree) writeCond.wait(&mutex); curr->num = *i; curr = curr->next; agree = 0; readCond.wakeAll(); i++; mutex.unlock(); }}
void ReadThread::run(){ file.setFileName(fileName); file.remove(); if(!file.open(QIODevice::WriteOnly)) { return; } QTextStream stream(&file); forever { if(stopped) { //stopped = false; break; } mutex.lock(); while(agree) readCond.wait(&mutex); // math(); stream << QString::number(curr->prev->num)<<" "; agree = 1; writeCond.wakeAll(); mutex.unlock(); } file.close();}
struct.h...const int MAX = 100000;struct SuperStruct{ int num; SuperStruct *next; SuperStruct *prev;};extern SuperStruct *first;extern SuperStruct *curr;extern void createSuperStruct();...
dialog.cpp ... connect(&wThread,SIGNAL(finished()),&rThread,SLOT(stop())); connect(&wThread,SIGNAL(finished()),this,SLOT(showMessage())); connect(&rThread,SIGNAL(finished()),this,SLOT(showMessage()));
dialog.h...private: ReadThread rThread; WhriteThread wThread;
первый поток (заполняющий список) не должен ждать второй (обрабатывающий);
если завершающий элемент списка неизвестен, end может означать "останов первого потока"...