Russian Qt Forum
Май 02, 2024, 15:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Принудительно завершить поток [РЕШЕНО]  (Прочитано 11466 раз)
TheMixa
Гость
« : Сентябрь 03, 2010, 14:45 »

Как принудительно завершить поток?
Запускаю start(), в run несколько долгих циклов. Если допустим надо принудительно завершить пототок раньше времени то вызов longprocess.exit(), longprocess.quit(), longprocess.terminate() нидают никакого эффекта.
« Последнее редактирование: Сентябрь 06, 2010, 10:40 от TheMixa » Записан
RedDog
Гость
« Ответ #1 : Сентябрь 03, 2010, 15:04 »

Код:
QThread::setTerminationEnabled(true);
Записан
TheMixa
Гость
« Ответ #2 : Сентябрь 03, 2010, 15:07 »

да стоит enable в конструкторе, более того в циклах на операциях с файлами и записи в бд я делаю false  а на выходе опять true но ему пофиг.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Сентябрь 03, 2010, 16:01 »

Самое лучше завершение - это когда поток завершается сам!

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

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

void longprocess::stop()
{
    flagRun = 0
}
« Последнее редактирование: Сентябрь 03, 2010, 16:05 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
TheMixa
Гость
« Ответ #4 : Сентябрь 03, 2010, 16:09 »

ну о подобном я думал, но всетаки хочется иметь аварийное завершение на случай если алгоритм выйдет из под контроля.  Не могу же я каждый чих проверять?  производительность упатед вразы тогда.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Сентябрь 03, 2010, 17:51 »

ну о подобном я думал, но всетаки хочется иметь аварийное завершение на случай если алгоритм выйдет из под контроля.  Не могу же я каждый чих проверять?  производительность упатед вразы тогда.

1) Всем сначала хочется  Улыбающийся  Но помыкавшись приходят к тому же: нитка должна завершиться сама
2) Обязаны проверять
3) Проверка как показал kuzulis не съедает даже 0.01%
Записан
TheMixa
Гость
« Ответ #6 : Сентябрь 05, 2010, 09:37 »

ну походе таки и придется делать, просто итерации цикла очень долго может выполняться поэтому внтури цикла необходимо делать контрольные проверки тоже
Записан
TheMixa
Гость
« Ответ #7 : Сентябрь 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?
« Последнее редактирование: Сентябрь 05, 2010, 11:48 от TheMixa » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Сентябрь 05, 2010, 12:04 »

Не пойму зачем писать
Код:
if (needStop == true)
// вместо
if (needStop)
ну да это дело вкуса. В остальном - ищите, проверяйте. Где-то описАлись, член класса должен устанавливаться
Записан
BRE
Гость
« Ответ #9 : Сентябрь 05, 2010, 12:21 »

так вот если run запущен то после stop в run() needStop так и остается false. и какой выход остается? в public parent пренести needstop?
Код
C++ (Qt)
void longprocess::run()
{
  neetStop = false;
 
  //some code
  ...
}
 
Записан
TheMixa
Гость
« Ответ #10 : Сентябрь 06, 2010, 10:40 »

сегодня посмотрел код свежей головой, ошибка была совсем не в потоке (if(messagebox==cancel) stop; а я упорно жал ОК), но зато полностью переписал и привел к читаемому виду.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.072 секунд. Запросов: 22.