![]() |
|
|
![]()
|
|
| null56 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
В общем столкнулся со следующей проблемой, приведу упрощенный код (cpp):
Собственно чего хочу добиться, чтобы перед удалением объекта Thread, дочерний поток (или функция run()) завершалась, а основной поток и в принципе это работает в большинстве случаев, но иногда все застревает на функции wait();
Хотел поинтересоваться, возможен ли такой способ гарантированного завершения дочернего потока перед уничтожением самого объекта QThread или нет? Для меня критична задача завершения этой функции, не важно в какой точке, за собой все почистят стековые объекты внутри функции run()... Почему зависание происходит именно в точке wait? проблема в коде или в том, что я слишком часто запускаю подряд эту прогу, что какой - нибудь глобальный ресурс не освобождается, но это конечно маловероятно? Или же такие вещи делать в деструкторе нельзя? хотя сама переменная локальная и тоже удаляется внутри функции, по идее отрабатывать должно Заранее благодарен за помощь Это сообщение отредактировал(а) null56 - 17.3.2009, 22:26 |
||||||
|
|||||||
| pan2004 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 6 Всего: 9 |
сомнительно, имхо:
Вообще, эта функция довольно опасна, и лучше по возможности обойтись без нее(например, устанавливать при выходе флаг завершения потока, который периодически проверять в run()). |
|||
|
||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
я делал изначально без нее, пытаясь завершить eventloop внутри потока, так там все упиралось в то, что вызов завершения обработчика событий quit() проихоил после того, как запускался сам exec() и потом все зависало на том же wait, так как из exec() уже выйти было никак... что - то типа такого было...
Вышеприведенный код, судя по отладочной печати запускал евент луп между вызовом quit и wait(); но опять ж не всегда.... Кто - нибудь придумывал способы, которые бы тормозили основной поток до того момента пока не запускался бы поток или в случае разрушения, останавливался??? Это сообщение отредактировал(а) null56 - 17.3.2009, 23:40 |
|||
|
||||
| Acer |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: 15 Всего: 8 |
Все, что находится не в методе
запускается в родительском(главном) потоке. Все, что в методе
запускается в дочернем потоке.
|
||||||
|
|||||||
| null56 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
А разьве не для того этот метод, чтобы как раз аварийно выйти из функции run, если верить тебе, что убить дочерний поток вообще нельзя из родительского? ну вот смотри, допустим фрагмент кода из мейна
Разьве это аналогично тому, что я делал в деструкторе класса Thread? |
||||
|
|||||
| Acer |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: 15 Всего: 8 |
Возможно, я не правильно понял проблему.
Добавлено через 7 минут и 3 секунды Смотри, если делать так, как ты писал
Тут же завершается поток до того, как будет вызван деструктор. Так? То есть звершать уже нечего. И terminate() просто не сработает. А вот wait() повесит основной поток на ULONG_MAX, то есть на бесконечность.
Добавлено через 14 минут и 16 секунд Только что поробовал так же сделать... Через раз зависает...
вот с таким кодом:
|
||||||||
|
|||||||||
| Acer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: 15 Всего: 8 |
Нашел кое-что. link
Пишут, что если в собственном деструкторе убивать поток, то ничего не произойдет. |
|||
|
||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
Да, похоже на то....
А нет стандартных средств заставить родительский поток ждать пока дочерний поток не запустится? все бы намного упростилось... |
|||
|
||||
| null56 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
Сделал в start()
а в деструкторе
Хорошее ли решение? хотя вероятность того, что поток стартует, но не успеет войти в eventloop до того, как в деструкторе будет вызван quit, но войдет в wait(), конечно остается, но вероятность мала.... Добавлено через 10 минут и 23 секунды в деструкторе поправил
Не очень красиво, но зато наверняка наверное? |
||||||
|
|||||||
| Vaulter |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1724 Регистрация: 30.12.2002 Где: бункер Репутация: нет Всего: 22 |
буду писАть на коленке
|
|||
|
||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 6 Всего: 12 |
ну да, суть ясна, спасибо...
Просто у меня все на eventloop завязано |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |