Найти - Пользователи
Полная версия: Классы и потоки
Начало » Mobile Python » Классы и потоки
1
nJLyTo
Написал небольшой класс для отрисовки необходимых сведений с двумя вариантами вызова функции:

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
Вообще, я часто наблюдал, когда питон на симбиане “теряет” объекты в некоторых случаях. Особенно в классах.
Природу этого явления так и не понимаю, как не понимаю, в каких именно случаях это происходит (Ну как прикажете бороться с вылезающим иногда(!) NameError: name ‘str’ is not defined, например)
По поводупитоновских потоков, насколько я знаю, это не реально. Можно извратится, запустить демона, и через модуль miso выставить ему приоритет. Но ограничений куча. Уж лучше придумать свои извращения или костыли :)
А вообще, в большинстве задач, можно сделать и одним потоком, гуи то работать будет, калбеки вызываться будут, даже если твой скрипт что то делает в это время ( while 1:pass не в счет)
nJLyTo
Вот в том-то и беда, что подругому сделать я не могу. В программе два класса, один отрисовывает, а другой выполняет N функцию, причем делает он это долго. Пробовал делать таймер, рекурсию и все такое… Единственный вариант, который у меня действительно работает, это в основном потоке отрисовывать, а в дочернем выполнять N функцию, но тогда скорость работы сильно падает. Хотел поменять классы местами (в надежде, что основной поток выполняется быстрее), но как ты уже видишь, не получается.
igor.kaist
эээ… А если в одном потоке и выполнять и отрисовывать, в чем проблема? Я обычно так и делал.
nJLyTo
Слушай, может я туплю, а что если ты глянешь на исходник?
nJLyTo
Все, проблема решилась. Спасибо за помощь ;-)
igor.kaist
Скажи хоть как :)
P.S. У меня трубка в ремонте, не смог проверить твой код.
nJLyTo
В принципе, недочетов у меня было много. Рассказывать пока ничего не буду, т.к. проект скоро выйдет в свет! Первым пришлю тебе :-)
igor.kaist
Хех , не знаю, что это, но могу потестить :)
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