Название: Консольный проект. Threading. Отправлено: ips от Май 22, 2011, 23:41 Привет всем!
Стоит задача: Организовать два потока работующими параллельно. Но почему -то , ни один из потоков не ставит .IsFinished() в true. В Чем беда? Вот исходные файлы //*******************************************Function.h****************** Код: #include <QThread> Название: Re: Консольный проект. Threading. Отправлено: LisandreL от Май 22, 2011, 23:58 Цитировать while( (!Thread1.isFinished() ) && (!Thread2.isFinished())); //Беда isFinished всегда False Взаимоисключающие параграфы./*Весь код дальше начинает выполнятся не смотря даже на условие while*/ Легко убедиться, что из цикла оно выходит когда один из них закончился: Код
Название: Re: Консольный проект. Threading. Отправлено: LisandreL от Май 23, 2011, 00:25 Кроме того ряд замечаний:
1) По циклу while() Условие, видимо, составлено неправильно. Вы дожидаетесь окончания любого одного потока, но потом сравниваете время выполнения потоков, хотя если один из них к этому времени не завершился, то время выполнения будет равен 0. Правильное условие Код Кроме того не очень хорошо крутить пустой цикл и жрать процессор, намного логично будет отдавать его потокам: Код
2) По cout'у: а) По вашему выводу в консоль видно, что он не потокобезопасен. Чтобы это встречалось реже надо вместо \n везде использовать endl (который в себя включает flush). Ну или вместо cout использовать qDebug(). б) надо понимать, что на вывод вы тратите намного больше времени, чем на действия в цикле, так что вы фактически сейчас измеряете время, которое тратится на вывод данных. 3) смысл Код: signals: Название: Re: Консольный проект. Threading. Отправлено: ips от Май 23, 2011, 00:33 по циклу while
Я же ожидал момента , когда они оба выполнятся !!! :o Название: Re: Консольный проект. Threading. Отправлено: LisandreL от Май 23, 2011, 00:48 Я же ожидал момента , когда они оба выполнятся !!! Неправильно ждали.Оба ещё не выполнились: isFinished = false !isFinished = true true && true = true => крутимся в цикле. Один закончился: false && true = false => выходим из цикла. Название: Re: Консольный проект. Threading. Отправлено: ips от Май 23, 2011, 01:00 я понимаю , что я туплю . но вопрос
я же хочу выйти из цикла только тогда , когда оба закочатся , а условие false&true не радует! Название: Re: Консольный проект. Threading. Отправлено: Igors от Май 23, 2011, 08:11 я понимаю , что я туплю . но вопрос Не создавайте головоломных if'ов. Потратьте пару строк и запишите условие нормальноя же хочу выйти из цикла только тогда , когда оба закочатся , а условие false&true не радует! Код Также не употребляйте "Process" по отношению к Thread (нитка, поток) Название: Re: Консольный проект. Threading. Отправлено: LisandreL от Май 23, 2011, 08:20 я понимаю , что я туплю . но вопрос Я же у себя в сообщении всё написал уже:Цитировать while((!Thread1.isFinished() ) || (!Thread2.isFinished())) QThread::yieldCurrentThread(); |