Russian Qt Forum
Ноябрь 22, 2024, 20:29
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Многопоточное программирование, процессы
>
Thread termination
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Thread termination (Прочитано 7549 раз)
UVV
Гость
Thread termination
«
:
Сентябрь 22, 2010, 17:29 »
Привет.
Есть такой поток:
Код:
class MyThread : public QThread
{
Q_OBJECT
private:
QTimer mTimeoutTimer;
...
};
Если в главном потоке я делаю thread->terminate(), то таймер продолжает работать.
Как правильно освободить ресурсы?
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Thread termination
«
Ответ #1 :
Сентябрь 22, 2010, 17:42 »
прочитать доку и увидеть, что терминейт звать не рекомендуется
а еще неплохо прочесть это
http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/
«
Последнее редактирование: Сентябрь 22, 2010, 17:46 от Авварон
»
Записан
UVV
Гость
Re: Thread termination
«
Ответ #2 :
Сентябрь 22, 2010, 18:09 »
Спасибо за ссылку, статья познавательная.
Но это немного не мой случай (может мой дизайн неправильный тогда?).
Я наследуюсь от QThread, чтобы запустить только _один_ метод объекта в потоке, а не объект полностью.
Доку я, естесственно, читаю прежде, чем задавать вопросы.
Но мне необходимо именно terminate(), поскольку в некоторых редких случаях (именно тогда я использую terminate()) действия, выполняемые в потоке, не могут завершится сами.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Thread termination
«
Ответ #3 :
Сентябрь 22, 2010, 18:12 »
можете поконкретней? про запуск 1го метода непонятно:)
в любом случае, терминейт не может остановить таймер, тк ничего о нем не знает
«
Последнее редактирование: Сентябрь 22, 2010, 18:14 от Авварон
»
Записан
UVV
Гость
Re: Thread termination
«
Ответ #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
Сообщений: 3260
Re: Thread termination
«
Ответ #5 :
Сентябрь 22, 2010, 18:21 »
ну да, так вы дернете метод класса. А причем тут таймер?
Записан
UVV
Гость
Re: Thread termination
«
Ответ #6 :
Сентябрь 22, 2010, 18:24 »
Цитата: Авварон от Сентябрь 22, 2010, 18:21
ну да, так вы дернете метод класса. А причем тут таймер?
Поймать таймаут, если method() не отвечает очень долго. Именно в этом случае и нужен мне terminate().
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Thread termination
«
Ответ #7 :
Сентябрь 22, 2010, 18:31 »
а содержит ли метод цикл?
если да, то я бы делал выход при помощи установки переменной bool quit извне (это обычный подход)
в принципе я бы отделил класс для рассчета от треда, сделал бы ему мув ту тред, звал бы метод через QMetaObject::invokeMethod()
Записан
UVV
Гость
Re: Thread termination
«
Ответ #8 :
Сентябрь 22, 2010, 18:34 »
Спасибо за подсказки, но нужные исправления в метод уже вносятся (не с моей стороны) =)
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Thread termination
«
Ответ #9 :
Сентябрь 22, 2010, 18:35 »
кстати, гляньте на QtConcurrent - там есть возможность отменить вычисления - QFuture::cancel() (а вот как, я не знаю, тк не работал, а только разбирался в коде чужом и там такого не было)
Записан
Kolobok
Гость
Re: Thread termination
«
Ответ #10 :
Сентябрь 22, 2010, 19:20 »
Цитата: Авварон от Сентябрь 22, 2010, 18:35
кстати, гляньте на QtConcurrent - там есть возможность отменить вычисления - QFuture::cancel() (а вот как, я не знаю, тк не работал, а только разбирался в коде чужом и там такого не было)
QtConcurrent::run до конца выполняется. Только что сигнал finished() не будет высылаться.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Thread termination
«
Ответ #11 :
Сентябрь 22, 2010, 19:38 »
ясно, а я думал как таки стопается тред (не терминейтом же)
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...