Форум сайта python.su
Привет всем!
Пишу программу с использованием 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. Пора избавляться от графоманства. :-)
Офлайн
Видимо с потоками связанно и нужно вызывать какуюто спец функцию в libtorrent для остановки всего. Я когда с твистед работал, такиая же фигня была, но уже не помню что я с ней сделал.
Офлайн
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)
Офлайн
Есть жесткий способ выхода из приложения %)
os._exit(0)
Офлайн
ну, так имхо, в любом случае нельзя делать =)
а то потом забудешь, и когда начнуться баги….
Офлайн
NaotaВ документации есть метод libtorrent.session.abort. В реали его не существует. В больше ничего на эту тему не нашёл.
Видимо с потоками связанно и нужно вызывать какуюто спец функцию в libtorrent для остановки всего.
shizaЗабыл про это. Спасибо.
Есть жесткий способ выхода из приложения %)
os._exit(0)
Офлайн
Полные сорцы - в студию. Наглядно демонстрирующие проблему. Иначе помочь сложно.
P.S.
Писал когда-то bittorrent клиента…
Офлайн
Если бы я мог её нормально вычислить… А весь код:
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)
Офлайн