Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: TheMixa от Сентябрь 03, 2010, 14:45



Название: Принудительно завершить поток [РЕШЕНО]
Отправлено: TheMixa от Сентябрь 03, 2010, 14:45
Как принудительно завершить поток?
Запускаю start(), в run несколько долгих циклов. Если допустим надо принудительно завершить пототок раньше времени то вызов longprocess.exit(), longprocess.quit(), longprocess.terminate() нидают никакого эффекта.


Название: Re: Принудительно завершить поток
Отправлено: RedDog от Сентябрь 03, 2010, 15:04
Код:
QThread::setTerminationEnabled(true);


Название: Re: Принудительно завершить поток
Отправлено: TheMixa от Сентябрь 03, 2010, 15:07
да стоит enable в конструкторе, более того в циклах на операциях с файлами и записи в бд я делаю false  а на выходе опять true но ему пофиг.


Название: Re: Принудительно завершить поток
Отправлено: kuzulis от Сентябрь 03, 2010, 16:01
Самое лучше завершение - это когда поток завершается сам!

В методе run в циклах проверяйте некий флаг, который говорил бы потоку завершиться!
Наример:
Код:

void longprocess::run()
{
    while (flagRun) {
        //кеккеикикикекеноер
    }
}

void longprocess::stop()
{
    flagRun = 0
}


Название: Re: Принудительно завершить поток
Отправлено: TheMixa от Сентябрь 03, 2010, 16:09
ну о подобном я думал, но всетаки хочется иметь аварийное завершение на случай если алгоритм выйдет из под контроля.  Не могу же я каждый чих проверять?  производительность упатед вразы тогда.


Название: Re: Принудительно завершить поток
Отправлено: Igors от Сентябрь 03, 2010, 17:51
ну о подобном я думал, но всетаки хочется иметь аварийное завершение на случай если алгоритм выйдет из под контроля.  Не могу же я каждый чих проверять?  производительность упатед вразы тогда.

1) Всем сначала хочется  :)  Но помыкавшись приходят к тому же: нитка должна завершиться сама
2) Обязаны проверять
3) Проверка как показал kuzulis не съедает даже 0.01%


Название: Re: Принудительно завершить поток
Отправлено: TheMixa от Сентябрь 05, 2010, 09:37
ну походе таки и придется делать, просто итерации цикла очень долго может выполняться поэтому внтури цикла необходимо делать контрольные проверки тоже


Название: Re: Принудительно завершить поток
Отправлено: TheMixa от Сентябрь 05, 2010, 11:43
забавно но что-то не так в датском королевстве
Код:
void longprocess::run()
{
   //some code
   if(needStop == true)
     return;
   //some code
   if(needStop == true)
     return;
    while (i>0) {
         qDebug() << needStop;
          if(needStop == true)
            return;   
        //some code
        if(needStop == true)
           return;

    }
}

void longprocess::stop()
{
    needStop = true;
}

так вот если run запущен то после stop в run() needStop так и остается false. и какой выход остается? в public parent пренести needstop?


Название: Re: Принудительно завершить поток
Отправлено: Igors от Сентябрь 05, 2010, 12:04
Не пойму зачем писать
Код:
if (needStop == true)
// вместо
if (needStop)
ну да это дело вкуса. В остальном - ищите, проверяйте. Где-то описАлись, член класса должен устанавливаться


Название: Re: Принудительно завершить поток
Отправлено: BRE от Сентябрь 05, 2010, 12:21
так вот если run запущен то после stop в run() needStop так и остается false. и какой выход остается? в public parent пренести needstop?
Код
C++ (Qt)
void longprocess::run()
{
  neetStop = false;
 
  //some code
  ...
}
 


Название: Re: Принудительно завершить поток
Отправлено: TheMixa от Сентябрь 06, 2010, 10:40
сегодня посмотрел код свежей головой, ошибка была совсем не в потоке (if(messagebox==cancel) stop; а я упорно жал ОК), но зато полностью переписал и привел к читаемому виду.