Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 12, 2009 15:53:01

sinopteek
От:
Зарегистрирован: 2009-09-28
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

TkInter, .destroy и потоки

Пишу программу в которой происходит периодический сброс данных на диск (файл раз в минуту). Этот файл для экономии места сжимается ZipFile в отдельном потоке.

class AsyncZip(threading.Thread):
def __init__(self, infile, outfile):
threading.Thread.__init__(self)
self.infile = infile
self.outfile = outfile
def run(self):
f = zipfile.ZipFile(self.outfile, 'w', zipfile.ZIP_DEFLATED)
f.write(self.infile)
f.close()
os.remove(self.infile)
print 'Finished background zip of: ', self.infile
запускаю с таким рассчётом, чтобы поток жил отдельно от основного и архивировал фоном, при этом чтобы приложение не закрылось до завершения потока:
backgroundzip = AsyncZip(name, u'out\\'+name[:-3]+u'zip')
backgroundzip.setDaemon(True)
backgroundzip.start()
Всё работает прекрасно, но ровно до тех пор пока не пытаюсь прекратить опрос и закрыть приложение.
root.thr.stop()  #метод, который прекращает опрос
#time.sleep(10)
root.destroy()
#root.quit()
Вылает с Ошибкой
Инструкция по адресу “0x1e03db2a” обратилась к памяти по адресу “0x0000002c”. Память не может быть “read”
и zip файл портится с ощибкой CRC
но не всегда - как я понимаю, только когда мы пытаемся завершить приложение через root.destroy() до того, как завершится поток архивации.
если вместо root.destroy() использовать root.quit() то такое сообщение не вываливается , но zip файл портится всё равно(правда по другому)
Решением является перед вызовом root.destroy() поставить time.sleep(x) где x - значительное число(например 10). Но мне не нравится такой способ. Может есть какие способы решения?



Отредактировано (Ноя. 12, 2009 20:27:04)

Офлайн

#2 Ноя. 14, 2009 11:26:28

sinopteek
От:
Зарегистрирован: 2009-09-28
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

TkInter, .destroy и потоки

Как я понимаю проблему - создавая свой дополнительный поток внутри потока Tk и ставя на него Daemon() программа не должна прекращаться пока поток не прекратится, но когда закрываем Tk рушится всё, включая порождённые потоки с Daemon(). Можно как-то заставить python не убивать отдельные потоки или как-то проверить их живучесть (isAlive - знаю, но не могу обратиться к потоку, т.к. не могу его найти)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version