| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QThread повисает или ошибка? |
| Автор: null56 17.3.2009, 22:16 | ||||||
В общем столкнулся со следующей проблемой, приведу упрощенный код (cpp):
Собственно чего хочу добиться, чтобы перед удалением объекта Thread, дочерний поток (или функция run()) завершалась, а основной поток и в принципе это работает в большинстве случаев, но иногда все застревает на функции wait();
Хотел поинтересоваться, возможен ли такой способ гарантированного завершения дочернего потока перед уничтожением самого объекта QThread или нет? Для меня критична задача завершения этой функции, не важно в какой точке, за собой все почистят стековые объекты внутри функции run()... Почему зависание происходит именно в точке wait? проблема в коде или в том, что я слишком часто запускаю подряд эту прогу, что какой - нибудь глобальный ресурс не освобождается, но это конечно маловероятно? Или же такие вещи делать в деструкторе нельзя? хотя сама переменная локальная и тоже удаляется внутри функции, по идее отрабатывать должно Заранее благодарен за помощь |
| Автор: pan2004 17.3.2009, 22:45 | ||
сомнительно, имхо:
Вообще, эта функция довольно опасна, и лучше по возможности обойтись без нее(например, устанавливать при выходе флаг завершения потока, который периодически проверять в run()). |
| Автор: null56 17.3.2009, 23:38 | ||
я делал изначально без нее, пытаясь завершить eventloop внутри потока, так там все упиралось в то, что вызов завершения обработчика событий quit() проихоил после того, как запускался сам exec() и потом все зависало на том же wait, так как из exec() уже выйти было никак... что - то типа такого было...
Вышеприведенный код, судя по отладочной печати запускал евент луп между вызовом quit и wait(); но опять ж не всегда.... Кто - нибудь придумывал способы, которые бы тормозили основной поток до того момента пока не запускался бы поток или в случае разрушения, останавливался??? |
| Автор: Acer 18.3.2009, 00:29 | ||||||
Все, что находится не в методе
запускается в родительском(главном) потоке. Все, что в методе
запускается в дочернем потоке.
|
| Автор: null56 18.3.2009, 00:46 | ||||
А разьве не для того этот метод, чтобы как раз аварийно выйти из функции run, если верить тебе, что убить дочерний поток вообще нельзя из родительского? ну вот смотри, допустим фрагмент кода из мейна
Разьве это аналогично тому, что я делал в деструкторе класса Thread? |
| Автор: Acer 18.3.2009, 01:16 | ||||||||
| Возможно, я не правильно понял проблему. Добавлено через 7 минут и 3 секунды Смотри, если делать так, как ты писал
Тут же завершается поток до того, как будет вызван деструктор. Так? То есть звершать уже нечего. И terminate() просто не сработает. А вот wait() повесит основной поток на ULONG_MAX, то есть на бесконечность.
Добавлено через 14 минут и 16 секунд Только что поробовал так же сделать... Через раз зависает...
вот с таким кодом:
|
| Автор: Acer 18.3.2009, 01:39 |
| Нашел кое-что. http://lists.trolltech.com/qt-interest/2008-02/thread00572-0.html Пишут, что если в собственном деструкторе убивать поток, то ничего не произойдет. |
| Автор: null56 18.3.2009, 10:02 |
| Да, похоже на то.... А нет стандартных средств заставить родительский поток ждать пока дочерний поток не запустится? все бы намного упростилось... |
| Автор: null56 18.3.2009, 13:21 | ||||||
Сделал в start()
а в деструкторе
Хорошее ли решение? хотя вероятность того, что поток стартует, но не успеет войти в eventloop до того, как в деструкторе будет вызван quit, но войдет в wait(), конечно остается, но вероятность мала.... Добавлено через 10 минут и 23 секунды в деструкторе поправил
Не очень красиво, но зато наверняка наверное? |
| Автор: Vaulter 18.3.2009, 15:34 | ||
буду писАть на коленке
|
| Автор: null56 18.3.2009, 16:01 |
| ну да, суть ясна, спасибо... Просто у меня все на eventloop завязано |