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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено] Ещё раз об остановке потока  (Прочитано 14961 раз)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« : Апрель 21, 2010, 21:27 »

Не могу корректно завершить выполнение потока.
Метод run() класса-наследника QThread:
Код
C++ (Qt)
void myClass::run()
{
 while(true)
{
 this->thread()->wait(50);
 if (!this->suspendFlag)
 {
  qDebug() << rand();
 }
}
}
 
т.е. цикл в нём бесконечный и с помощью suspendFlag контролируется выполнение действий. Проблема в том, что при завершении работы программы имею "QThread: Destroyed while thread is still running".

Деструктор этого класса
Код
C++ (Qt)
myClass::~myClass()
{
qDebug() << this->currentThread()->isRunning();
this->thread()->quit();
qDebug() << this->currentThread()->isRunning();
}
 
показывает всегда
Код
C++ (Qt)
true
true
 
Вместо quit() пробовал кучу других вариантов (ставить wait() перед ним тоже - плюс к тому предупреждению дополнительно выдаёт "QThread::wait: Thread tried to wait on itself"), эффекта 0.
Есть ли ещё варианты?
« Последнее редактирование: Апрель 21, 2010, 22:09 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
niXman
Гость
« Ответ #1 : Апрель 21, 2010, 21:28 »

это нужно еще уметь так извращаться Смеющийся
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #2 : Апрель 21, 2010, 21:31 »

это нужно еще уметь так извращаться Смеющийся
как "так"? Я вообще многое умею Подмигивающий
Записан

kubuntu/Win7/x64/NetBeans
niXman
Гость
« Ответ #3 : Апрель 21, 2010, 21:34 »

Код
C++ (Qt)
bool running = true;
...
void myClass::run()
{
 while(running)
{
 this->thread()->wait(50);
 if (!this->suspendFlag)
 {
  qDebug() << rand();
 }
}
}
 

где только этот вопрос не поднимался. сколько сотен тем было создано...
и везде один и тот же ответ - единственно правильный способ завершения потока, это вернуться из него.
Записан
niXman
Гость
« Ответ #4 : Апрель 21, 2010, 21:38 »

Цитировать
и везде один и тот же ответ - единственно правильный способ завершения потока, это вернуться из него.
еще нужно понимать, что такое поток. и знать, что это "system dependent".
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #5 : Апрель 21, 2010, 21:57 »

Пересмотрел тут тем 6 с этой же проблемой, но такого решения (завершать его исключительно возвратом) не было, так что спс
Изменил деструктор на:
Код
C++ (Qt)
ThreadManager::~ThreadManager()
{
this->threadIsRunning = false;
this->wait(50);
}
 
пошло
Записан

kubuntu/Win7/x64/NetBeans
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Апрель 21, 2010, 21:59 »

Код
C++ (Qt)
void myClass::run()
{
 while (!mStop)
{
  ....
 }
}
 
inline void MyClass::SetStop( void ) { mStop = true; }
 

Вызывающий
Код
C++ (Qt)
// запускаем
MyClass * theThread = new MyClass();
theThread->start();
 
...
// работаем
...
 
// убиваем нитку
theThread->SetStop();    // даем ей выйти из run()
theThread->wait();       // ждем пока выйдет
delete theThread;        // теперь можно мочить
 
« Последнее редактирование: Апрель 21, 2010, 22:01 от Igors » Записан
alexman
Гость
« Ответ #7 : Апрель 22, 2010, 08:40 »

Код
C++ (Qt)
void myClass::run()
{
 while (!mStop)
{
  ....
 }
}
 
inline void MyClass::SetStop( void ) { mStop = true; }
 

Вызывающий
Код
C++ (Qt)
// запускаем
MyClass * theThread = new MyClass();
theThread->start();
 
...
// работаем
...
 
// убиваем нитку
theThread->SetStop();    // даем ей выйти из run()
theThread->wait();       // ждем пока выйдет
delete theThread;        // теперь можно мочить
 

mStop не нужно мьютексом "закрыть"?
« Последнее редактирование: Апрель 22, 2010, 08:44 от alexman » Записан
niXman
Гость
« Ответ #8 : Апрель 22, 2010, 08:50 »

Цитировать
mStop не нужно мьютексом "закрыть"?
нет. с однобайтовыми переменными, операции атомарны. по крайней мере на известных мне аппаратных архитектурах.
Записан
alexman
Гость
« Ответ #9 : Апрель 22, 2010, 08:52 »

спс, понял!
Записан
ieroglif
Гость
« Ответ #10 : Апрель 22, 2010, 10:32 »

Код
C++ (Qt)
void myClass::run()
{
 while (!mStop)
{
  ....
 }
}
 
inline void MyClass::SetStop( void ) { mStop = true; }
 

Вызывающий
Код
C++ (Qt)
// запускаем
MyClass * theThread = new MyClass();
theThread->start();
 
...
// работаем
...
 
// убиваем нитку
theThread->SetStop();    // даем ей выйти из run()
theThread->wait();       // ждем пока выйдет
delete theThread;        // теперь можно мочить
 

эээ.. а не лучше ли ?
Код
C++ (Qt)
// убиваем нитку
theThread->SetStop();     // даем ей выйти из run()
theThread->deleteLater(); // пусть сам сдохнет как сочтёт нужным
 
Записан
BRE
Гость
« Ответ #11 : Апрель 22, 2010, 10:42 »

эээ.. а не лучше ли ?
Код
C++ (Qt)
// убиваем нитку
theThread->SetStop();     // даем ей выйти из run()
theThread->deleteLater(); // пусть сам сдохнет как сочтёт нужным
 
Момент, когда объект theThread будет разрушен от него самого не зависит и легко может случиться так, что он будет разрушаться при работающей нитке. Поэтому, желательно использовать wait.

Либо использовать сигнал finished:
connect( theThread, SIGNAL( finished() ), theThread, SLOT( deleteLater() ) );
« Последнее редактирование: Апрель 22, 2010, 10:49 от BRE » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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