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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: правильно грохнуть поток  (Прочитано 8749 раз)
thechicho
Гость
« : Ноябрь 25, 2011, 17:09 »

для удаления после выполнения run()
Код
C++ (Qt)
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
для удаления после нажатия на кнопку
Код
C++ (Qt)
connect(ui->pushButtonStart, SIGNAL(clicked()), thread, SLOT(terminate()));
в release-версии это работает.
в debug прога жестоко зависает, после нажатия на кнопку.
в Qt Creator в Application Output постится ошибка:
QSocketNotifier: socket notifiers cannot be disabled from another thread
Qt Creator даже подвисает. ради интереса глянул сколько строк запостилось до краха проги - 74к!!!  Шокированный
wtf? Злой
почему так? Непонимающий
как правильно надо делать? В замешательстве
Записан
BRE
Гость
« Ответ #1 : Ноябрь 25, 2011, 17:14 »

Нельзя правильно грохнуть поток, правильно это когда поток останавливается сам.
Записан
thechicho
Гость
« Ответ #2 : Ноябрь 25, 2011, 17:28 »

я не догнал намека.
мне надо, чтобы после нажатия на кнопку поток сразу сдох
как это правильно делается? В замешательстве
Записан
thechicho
Гость
« Ответ #3 : Ноябрь 25, 2011, 17:29 »

ну или не сразу. а чтобы выполнение прекратилось, т.е. чтобы не нужно было ждать пока run() до конца выполнится.
Записан
BRE
Гость
« Ответ #4 : Ноябрь 25, 2011, 17:31 »

Выставить флажок, поток его проверит и завершиться.
Не используй terminate, это жесткое убийство потока, которое может произойти в самый неподходящий момент. Не жди что это будет безболезненно. Подмигивающий
Записан
thechicho
Гость
« Ответ #5 : Ноябрь 25, 2011, 17:37 »

в цикле while (flag) ?
не вижу в этом смысла, т.к. тоже самое если поток тупо завершится после выполнения run()
или я ошибаюсь?
Записан
Akon
Гость
« Ответ #6 : Ноябрь 25, 2011, 17:55 »

Именно так. flag чтоб был volatile.
По поводу смысла - см. документацию, особенно на соответствующие нативные функции.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #7 : Ноябрь 25, 2011, 18:01 »

мне надо, чтобы после нажатия на кнопку поток сразу сдох
чтобы не нужно было ждать пока run() до конца выполнится
Чудес не бывает.
Правильно - сообщить потоку, что он должен закончиться (флаг, слот…) и ждать когда он это сделает.
А убивание потока черевато разными штуками, вроде утечки памяти, незакрытых файлов, неразлоченных мьютексов прочей прелести.
Записан
thechicho
Гость
« Ответ #8 : Ноябрь 25, 2011, 18:07 »

эм. а если программу закрою? как быть?
при инициализации потока ставлю предка (this), гуи поток.
т.е. уничтожается главный поток, кот. в свою очередь убивает поток.
QThread: Destroyed while thread is still running
это нормально?
чота я совсем запутался.
« Последнее редактирование: Ноябрь 25, 2011, 22:15 от thechicho » Записан
thechicho
Гость
« Ответ #9 : Ноябрь 25, 2011, 18:11 »

// утечки памяти, незакрытых файлов, неразлоченных мьютексов прочей прелести
так после terminate(), вызывается finished()
Код
C++ (Qt)
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
т.е. деструктор вызывается в любом случае, где куча освободится... т.е. утечка какбэ не страшна...
работаю с файлами и мьютексы использую только в гуи потоке...
т.е. получается какбэ пофик, что он сдохнет в любой момент выполнения.
Записан
BRE
Гость
« Ответ #10 : Ноябрь 25, 2011, 18:11 »

это нормально?
Нет. Ты сам должен позаботиться о завершении потока перед закрытием программы (дать команду и дождаться завершения), тогда таких варнингов не будет.
Записан
BRE
Гость
« Ответ #11 : Ноябрь 25, 2011, 18:12 »

т.е. получается какбэ пофик, что он сдохнет в любой момент выполнения.
Ну тебе видней, если на все пофиг, то можно и терминайтить. Улыбающийся
Записан
Akon
Гость
« Ответ #12 : Ноябрь 25, 2011, 21:46 »

немного оффтоп:
QProcess под завершение процесса имеет два слота: kill() и terminate() - вот и думай какой из них безобиднее  Улыбающийся
terminate() - это корректный путь, следовало его назвать quit() что-ли.
Записан
qt_user
Гость
« Ответ #13 : Ноябрь 26, 2011, 19:06 »

если поток выполняет большую работу можно после каждой части делать проверку на флаг выхода:
Код
C++ (Qt)
void Thread::run
{
/*
   first work portion
*/

 
   if (stopped)
       return;
 
/*
   second work portion
*/

 
    if (stopped)
       return;
 
/*
   third work portion
*/

 
    if (stopped)
       return;
 
....
 
}
 

или же делать invokeMethod() пример тут: http://habrahabr.ru/blogs/qt_software/115835/ в самом конце
Записан
thechicho
Гость
« Ответ #14 : Ноябрь 28, 2011, 17:20 »

не догнал как invokeMethod() может помочь...
в общем так и сделал. 20 проверок воткнул на несколько сотен строк кода Веселый
это норм?^^

остался только вопрос. надо мьютексом защищать проверку флага?
тут http://www.youtube.com/watch?v=5WEiQ3VJfxc&feature=related (3:37) чувак защищает.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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