Russian Qt Forum

Qt => Общие вопросы => Тема начата: AntonUfo от Февраль 17, 2010, 15:51



Название: Не могу никак с потоками разобратся хэлп.
Отправлено: AntonUfo от Февраль 17, 2010, 15:51
Вопрос такой, к примеру есть вот такая конструкция:

Приложение -> запускает поток -> который в свою очередь запускает еще один поток с расчетами на 2 часа.

Когда мне необходимо остановить расчеты я нажимаю кнопку.

В книге Бланшет, Саммерфилд приводят вот такое решение:

В потоковых классах вводится приватная переменная volatile bool stopped; которая меняется в соответствующем методе void stop();,
переопределенный метод QTread::run(); выполняется до тех пор пока stopped = true, как только false заканчиваем выполнение run потока, поток закрываем.

Но честно говоря пользоваться такой конструкцией неудобно, приходится тащить volatile bool stopped и void stop(); во все функции и методы которые используются при расчетах

Я пытался останавливать поток с расчетами через terminated();, через quit();, вроде бы он прибивается вот только на загрузку процессора смотрю она как была 100% так и осталась, и дебагг пишет "QTread: Destroyed while tread is stil running", т.е. получается что я его прибил но он все равно выполняется ?

Что делать ?

Если нужно могу привести пример того что у меня не получается может что то можно сделать ?


Название: Re: Не могу никак с потоками разобратся хэлп.
Отправлено: niXman от Февраль 17, 2010, 16:42
Цитировать
Что делать ?
для начала, покажи что у тебя в run()


Название: Re: Не могу никак с потоками разобратся хэлп.
Отправлено: Akaiten от Февраль 17, 2010, 17:45
В потоковых классах вводится приватная переменная volatile bool stopped; которая меняется в соответствующем методе void stop();,
переопределенный метод QTread::run(); выполняется до тех пор пока stopped = true, как только false заканчиваем выполнение run потока, поток закрываем.
правильно

Но честно говоря пользоваться такой конструкцией неудобно, приходится тащить volatile bool stopped и void stop(); во все функции и методы которые используются при расчетах
может быть проверять stopped только в некоторых контрольных точках, чтобы уменьшить количество мест проверки

Я пытался останавливать поток с расчетами через terminated();, через quit();, вроде бы он прибивается вот только на загрузку процессора смотрю она как была 100% так и осталась, и дебагг пишет "QTread: Destroyed while tread is stil running", т.е. получается что я его прибил но он все равно выполняется ?
QThread::terminate() должно работать, под виндой по крайней мере работает. Если не работает, попробуйте QThread::setTerminationEnabled(true)