Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: UVV от Сентябрь 22, 2010, 17:29



Название: Thread termination
Отправлено: UVV от Сентябрь 22, 2010, 17:29
Привет.
Есть такой поток:
Код:
class MyThread : public QThread
{
   Q_OBJECT
private:
   QTimer mTimeoutTimer;
   ...
};

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


Название: Re: Thread termination
Отправлено: Авварон от Сентябрь 22, 2010, 17:42
прочитать доку и увидеть, что терминейт звать не рекомендуется
а еще неплохо прочесть это http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/


Название: Re: Thread termination
Отправлено: UVV от Сентябрь 22, 2010, 18:09
Спасибо за ссылку, статья познавательная.
Но это немного не мой случай (может мой дизайн неправильный тогда?).
Я наследуюсь от QThread, чтобы запустить только _один_ метод объекта в потоке, а не объект полностью.
Доку я, естесственно, читаю прежде, чем задавать вопросы.
Но мне необходимо именно terminate(), поскольку в некоторых редких случаях (именно тогда я использую terminate()) действия, выполняемые в потоке, не могут завершится сами.


Название: Re: Thread termination
Отправлено: Авварон от Сентябрь 22, 2010, 18:12
можете поконкретней? про запуск 1го метода непонятно:)
в любом случае, терминейт не может остановить таймер, тк ничего о нем не знает


Название: Re: Thread termination
Отправлено: UVV от Сентябрь 22, 2010, 18:19
void MyThread::run()
{
   MyClass::instance()->method();
}

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

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


Название: Re: Thread termination
Отправлено: Авварон от Сентябрь 22, 2010, 18:21
ну да, так вы дернете метод класса. А причем тут таймер?:)


Название: Re: Thread termination
Отправлено: UVV от Сентябрь 22, 2010, 18:24
ну да, так вы дернете метод класса. А причем тут таймер?:)
Поймать таймаут, если method() не отвечает очень долго. Именно в этом случае и нужен мне terminate().


Название: Re: Thread termination
Отправлено: Авварон от Сентябрь 22, 2010, 18:31
а содержит ли метод цикл?
если да, то я бы делал выход при помощи установки переменной bool quit извне (это обычный подход)
в принципе я бы отделил класс для рассчета от треда, сделал бы ему мув ту тред, звал бы метод через QMetaObject::invokeMethod()


Название: Re: Thread termination
Отправлено: UVV от Сентябрь 22, 2010, 18:34
Спасибо за подсказки, но нужные исправления в метод уже вносятся (не с моей стороны) =)


Название: Re: Thread termination
Отправлено: Авварон от Сентябрь 22, 2010, 18:35
кстати, гляньте на QtConcurrent - там есть возможность отменить вычисления - QFuture::cancel() (а вот как, я не знаю, тк не работал, а только разбирался в коде чужом и там такого не было)


Название: Re: Thread termination
Отправлено: Kolobok от Сентябрь 22, 2010, 19:20
кстати, гляньте на QtConcurrent - там есть возможность отменить вычисления - QFuture::cancel() (а вот как, я не знаю, тк не работал, а только разбирался в коде чужом и там такого не было)

QtConcurrent::run до конца выполняется. Только что сигнал finished() не будет высылаться.


Название: Re: Thread termination
Отправлено: Авварон от Сентябрь 22, 2010, 19:38
ясно, а я думал как таки стопается тред (не терминейтом же)