Найти - Пользователи
Полная версия: TkInter, .destroy и потоки
Начало » GUI » TkInter, .destroy и потоки
1
sinopteek
Пишу программу в которой происходит периодический сброс данных на диск (файл раз в минуту). Этот файл для экономии места сжимается 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). Но мне не нравится такой способ. Может есть какие способы решения?
sinopteek
Как я понимаю проблему - создавая свой дополнительный поток внутри потока Tk и ставя на него Daemon() программа не должна прекращаться пока поток не прекратится, но когда закрываем Tk рушится всё, включая порождённые потоки с Daemon(). Можно как-то заставить python не убивать отдельные потоки или как-то проверить их живучесть (isAlive - знаю, но не могу обратиться к потоку, т.к. не могу его найти)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB