ZZZ
Июнь 5, 2008 05:45:05
Привет всем!
Пишу программу с использованием 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. Пора избавляться от графоманства. :-)
Naota
Июнь 5, 2008 07:32:18
Видимо с потоками связанно и нужно вызывать какуюто спец функцию в libtorrent для остановки всего. Я когда с твистед работал, такиая же фигня была, но уже не помню что я с ней сделал.
cybergrind
Июнь 5, 2008 13:59:31
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
т.е. суть в том, что главный поток ждет завершения всех дочерних тредов
можно сделать из либторента демона, и перед убиванием гуя послылать ему сигнал умирать, он корректно доработает, и отомрет
shiza
Июнь 5, 2008 16:31:01
Есть жесткий способ выхода из приложения %)
os._exit(0)
cybergrind
Июнь 5, 2008 16:36:34
ну, так имхо, в любом случае нельзя делать =)
а то потом забудешь, и когда начнуться баги….
ZZZ
Июнь 6, 2008 04:59:27
Naota
Видимо с потоками связанно и нужно вызывать какуюто спец функцию в libtorrent для остановки всего.
В документации есть метод libtorrent.session.abort. В реали его не существует. В больше ничего на эту тему не нашёл.
shiza
Есть жесткий способ выхода из приложения %)
os._exit(0)
Забыл про это. Спасибо.
ИМХО так тоже делать нельзя… Но я, наверное использую питоний эвент после завершения, и через пять секунд после выхода буду убивать именно так.
Андрей Светлов
Июнь 7, 2008 00:54:36
Полные сорцы - в студию. Наглядно демонстрирующие проблему. Иначе помочь сложно.
P.S.
Писал когда-то bittorrent клиента…
ZZZ
Июнь 7, 2008 06:45:24
Если бы я мог её нормально вычислить… А весь код:
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 клиента…
А чем пользовался для доступа к сети?