nJLyTo
Фев. 10, 2009 15:49:34
Написал небольшой класс для отрисовки необходимых сведений с двумя вариантами вызова функции:
1. При вызове первого варианта (menu.redraw()) появляется ошибка такого плана:
MainMenu instance has no attribute ‘canvas’
при этом сама программа продолжает работу. Сам я так и не смог разобраться, почему он ругается.
2. При вызове menu.redraw в новом потоке программа вообще не работает.
t = Thread(target = menu.redraw)
t.start()
Прошу помощи.
from appuifw import app, Canvas
from graphics import Image
from threading import Thread
import e32
class MainMenu:
def __init__(self):
app.body = self.canvas = Canvas(redraw_callback=self.handle_redraw)
app.menu = [(u"Exit", self.quit)]
self.img = Image.new(self.canvas.size)
self.talk_with_server = 1
def quit(self):
self.talk_with_server = 0
def handle_redraw(self, rect):
self.canvas.blit(self.img)
def redraw(self):
while self.talk_with_server:
self.img.clear(0)
self.img.text((20,30), u'first',0xff0000)
self.img.text((20,55), u'second', 0xff0000)
self.handle_redraw(())
e32.ao_yield()
menu = MainMenu()
#1. menu.redraw()
#2. t = Thread(target = menu.redraw)
# t.start()
И в завершении хотелось бы узнать, существует ли в питоне приоритетность выполнения потоков, например, между основным потоком и дочерними?
igor.kaist
Фев. 10, 2009 17:40:30
Вообще, я часто наблюдал, когда питон на симбиане “теряет” объекты в некоторых случаях. Особенно в классах.
Природу этого явления так и не понимаю, как не понимаю, в каких именно случаях это происходит (Ну как прикажете бороться с вылезающим иногда(!) NameError: name ‘str’ is not defined, например)
По поводупитоновских потоков, насколько я знаю, это не реально. Можно извратится, запустить демона, и через модуль miso выставить ему приоритет. Но ограничений куча. Уж лучше придумать свои извращения или костыли :)
А вообще, в большинстве задач, можно сделать и одним потоком, гуи то работать будет, калбеки вызываться будут, даже если твой скрипт что то делает в это время ( while 1:pass не в счет)
nJLyTo
Фев. 10, 2009 18:07:33
Вот в том-то и беда, что подругому сделать я не могу. В программе два класса, один отрисовывает, а другой выполняет N функцию, причем делает он это долго. Пробовал делать таймер, рекурсию и все такое… Единственный вариант, который у меня действительно работает, это в основном потоке отрисовывать, а в дочернем выполнять N функцию, но тогда скорость работы сильно падает. Хотел поменять классы местами (в надежде, что основной поток выполняется быстрее), но как ты уже видишь, не получается.
igor.kaist
Фев. 10, 2009 18:15:18
эээ… А если в одном потоке и выполнять и отрисовывать, в чем проблема? Я обычно так и делал.
nJLyTo
Фев. 10, 2009 18:18:41
Слушай, может я туплю, а что если ты глянешь на исходник?
nJLyTo
Фев. 11, 2009 13:52:42
Все, проблема решилась. Спасибо за помощь ;-)
igor.kaist
Фев. 11, 2009 17:16:21
Скажи хоть как :)
P.S. У меня трубка в ремонте, не смог проверить твой код.
nJLyTo
Фев. 11, 2009 17:47:05
В принципе, недочетов у меня было много. Рассказывать пока ничего не буду, т.к. проект скоро выйдет в свет! Первым пришлю тебе :-)
igor.kaist
Фев. 11, 2009 20:19:31
Хех , не знаю, что это, но могу потестить :)