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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Thread termination  (Прочитано 7550 раз)
UVV
Гость
« : Сентябрь 22, 2010, 17:29 »

Привет.
Есть такой поток:
Код:
class MyThread : public QThread
{
   Q_OBJECT
private:
   QTimer mTimeoutTimer;
   ...
};

Если в главном потоке я делаю thread->terminate(), то таймер продолжает работать.
Как правильно освободить ресурсы?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


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

прочитать доку и увидеть, что терминейт звать не рекомендуется
а еще неплохо прочесть это http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/
« Последнее редактирование: Сентябрь 22, 2010, 17:46 от Авварон » Записан
UVV
Гость
« Ответ #2 : Сентябрь 22, 2010, 18:09 »

Спасибо за ссылку, статья познавательная.
Но это немного не мой случай (может мой дизайн неправильный тогда?).
Я наследуюсь от QThread, чтобы запустить только _один_ метод объекта в потоке, а не объект полностью.
Доку я, естесственно, читаю прежде, чем задавать вопросы.
Но мне необходимо именно terminate(), поскольку в некоторых редких случаях (именно тогда я использую terminate()) действия, выполняемые в потоке, не могут завершится сами.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


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

можете поконкретней? про запуск 1го метода непонятно:)
в любом случае, терминейт не может остановить таймер, тк ничего о нем не знает
« Последнее редактирование: Сентябрь 22, 2010, 18:14 от Авварон » Записан
UVV
Гость
« Ответ #4 : Сентябрь 22, 2010, 18:19 »

void MyThread::run()
{
   MyClass::instance()->method();
}

class MyClass : public QObject
{
   Q_OBJECT
 public:
   MyThread* thread;
   method();
};

Так понятнее будет? =)
В принципе я вроде бы уже понял (после прочтения статьи укрепилось =))
Т.е. нужно остановить таймер, сделать terminate() (Или сначала сделать terminate(), а потом остановить таймер), а потом можно удалять объект MyThread.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


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

ну да, так вы дернете метод класса. А причем тут таймер?Улыбающийся
Записан
UVV
Гость
« Ответ #6 : Сентябрь 22, 2010, 18:24 »

ну да, так вы дернете метод класса. А причем тут таймер?Улыбающийся
Поймать таймаут, если method() не отвечает очень долго. Именно в этом случае и нужен мне terminate().
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #7 : Сентябрь 22, 2010, 18:31 »

а содержит ли метод цикл?
если да, то я бы делал выход при помощи установки переменной bool quit извне (это обычный подход)
в принципе я бы отделил класс для рассчета от треда, сделал бы ему мув ту тред, звал бы метод через QMetaObject::invokeMethod()
Записан
UVV
Гость
« Ответ #8 : Сентябрь 22, 2010, 18:34 »

Спасибо за подсказки, но нужные исправления в метод уже вносятся (не с моей стороны) =)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Сентябрь 22, 2010, 18:35 »

кстати, гляньте на QtConcurrent - там есть возможность отменить вычисления - QFuture::cancel() (а вот как, я не знаю, тк не работал, а только разбирался в коде чужом и там такого не было)
Записан
Kolobok
Гость
« Ответ #10 : Сентябрь 22, 2010, 19:20 »

кстати, гляньте на QtConcurrent - там есть возможность отменить вычисления - QFuture::cancel() (а вот как, я не знаю, тк не работал, а только разбирался в коде чужом и там такого не было)

QtConcurrent::run до конца выполняется. Только что сигнал finished() не будет высылаться.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Сентябрь 22, 2010, 19:38 »

ясно, а я думал как таки стопается тред (не терминейтом же)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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