Название: Thread termination Отправлено: UVV от Сентябрь 22, 2010, 17:29 Привет.
Есть такой поток: Код: class MyThread : public QThread Если в главном потоке я делаю 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 ясно, а я думал как таки стопается тред (не терминейтом же)
|