Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 5, 2008 05:45:05

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Подвисает sys.exit().

Привет всем!

Пишу программу с использованием PyQt4 и libtorrent (всё никак не решусь описать, как я его всё-таки собрал – это целая эпопея!). При запуске вызывается функция main(), создаётся класс Main (от QObject) с кучей объектов детей и всякой нужной всячины, среди которой создаётся и libtorrent.session со всеми прилигающими и очень нужными объектами. Во понаписал-то! Графоманн хре…
Проблема такова. В main.py (главный скрипт), после создания Main запускается app.exec_() и всё замечательно работает до тех пор, пока я не давлю на капу с надписью "Выход". В этот момент запускается ещё куча всякой нужности, вроде остановки закачек с сохраниением данных для продолжения и, в конце концов, в Main вызывается qApp.exit(0).

print 1, ## Инициализация программы.
e = app.exec_()
print 2, ## Выход из главного цикла Qt.
sys.exit(e)
print 3 ## До сюда оно и не должно дойти…

Выводит '12' и виснет. ctrl+c завершает программу. Если убрать sys.exit(), то завершения програмы так же не происходит. Спустя некоторое время всё-таки выходит, но уж очень долго. И не люблю я не понимать проблем, даже если они не очень-то и мешают, потому что программа в 99.999% случаев будет запускаться c ярлычка на десктопе или из автозагрузки.
Я уверен, что проблема в libtorrent, но совершенно не представляю как её решить. Разве что вывести всю работу с ним в отдельный поток, и убивать его посредством QThread.terminate, но я чё-то не уверен в том, что оно будет работать, да и геморроя много.
Хотелось бы немного теории о том, почему оно может подвисать на sys.exit().

P.S. Стоит упомянуть, что программа имеет фактически одну нить – gui-нить. Вся коммуникация организована по средствам кьютэшных сигналов и таймеров QTimer. О том, что работает внутри libtorrent, я не имею ни малейшего представления, но если учесть, что для линковки понадобился boost_thread, то можно сделать довольно логичный вывод…

P.P.S. Проблема присутствует как в Linux, так и в Windows.

P.P.P.S. Пора избавляться от графоманства. :-)



Офлайн

#2 Июнь 5, 2008 07:32:18

Naota
От:
Зарегистрирован: 2007-06-04
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Подвисает sys.exit().

Видимо с потоками связанно и нужно вызывать какуюто спец функцию в libtorrent для остановки всего. Я когда с твистед работал, такиая же фигня была, но уже не помню что я с ней сделал.



Офлайн

#3 Июнь 5, 2008 13:59:31

cybergrind
От:
Зарегистрирован: 2008-01-21
Сообщения: 201
Репутация: +  0  -
Профиль   Отправить e-mail  

Подвисает sys.exit().


import threading
import time
import sys

def ppt():
time.sleep(5)
print ‘hello’

thr = threading.Thread(target=ppt)
print ‘start thr’
thr.start()
sys.exit()

…..
start thr
hello

т.е. суть в том, что главный поток ждет завершения всех дочерних тредов
можно сделать из либторента демона, и перед убиванием гуя послылать ему сигнал умирать, он корректно доработает, и отомрет



Отредактировано (Июнь 5, 2008 14:08:08)

Офлайн

#4 Июнь 5, 2008 16:31:01

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Подвисает sys.exit().

Есть жесткий способ выхода из приложения %)
os._exit(0)



Офлайн

#5 Июнь 5, 2008 16:36:34

cybergrind
От:
Зарегистрирован: 2008-01-21
Сообщения: 201
Репутация: +  0  -
Профиль   Отправить e-mail  

Подвисает sys.exit().

ну, так имхо, в любом случае нельзя делать =)
а то потом забудешь, и когда начнуться баги….



Офлайн

#6 Июнь 6, 2008 04:59:27

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Подвисает sys.exit().

Naota
Видимо с потоками связанно и нужно вызывать какуюто спец функцию в libtorrent для остановки всего.
В документации есть метод libtorrent.session.abort. В реали его не существует. В больше ничего на эту тему не нашёл.

shiza
Есть жесткий способ выхода из приложения %)
os._exit(0)
Забыл про это. Спасибо.
ИМХО так тоже делать нельзя… Но я, наверное использую питоний эвент после завершения, и через пять секунд после выхода буду убивать именно так.



Офлайн

#7 Июнь 7, 2008 00:54:36

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Подвисает sys.exit().

Полные сорцы - в студию. Наглядно демонстрирующие проблему. Иначе помочь сложно.
P.S.
Писал когда-то bittorrent клиента…



Офлайн

#8 Июнь 7, 2008 06:45:24

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Подвисает sys.exit().

Если бы я мог её нормально вычислить… А весь код:
1. Пока закрыт.
2. Не хочу никого нагружать, разбором своих программ.

Да и обнаружилась трабла со стабильностью. Под Linux (Qt 4.3.4 и PyQt 4.3.3) всё замечательно, а под виндой (Qt 4.4.0 и PyQt 4.4.2) падает без объяснений причин. Притом, только при скачке чего-либо, но я написал тестового консольного клиента, который замечательно справился со своей задачей без единного глюка – так что трабла не в libtorrent. Единственная надпись, которая меня смущает, это:
QWaitCondition: Destroyed while threads are still waiting
которая появляется при нормальном выходе или падении. В линукс консоль чиста.
Я должен справится.

Андрей Светлов
Писал когда-то bittorrent клиента…
А чем пользовался для доступа к сети?



Отредактировано (Июнь 7, 2008 06:46:45)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version