Форум сайта python.su
Опыта разработки приложений для pys60 у меня нет, это так сказать первые шаги в этом направлении. Но уже столкнулся с проблемами.
При попытке запуска функции в новом потоке закрывается как само приложение так и python. Пробовал и thread.start_new_thread(fun,()) так и thread.start_new(fun,()). Результаты аналогичны (хоть ничего странного в этой аналогичности и нет :) )
Файл с возможными ощибками пуст.
Часть кода ниже
import sys, thread, time
from appuifw import *
from graphics import *
import e32
from key_codes import *
errfile = open('E:/err.txt','wb')
sys.stderr = errfile
class Main:
def __init__(self):
app.screen = 'full'
...
# Талее идет инициализация картинки используемой в качестве фона и всевозможные настройки приложения
self.tm = u'0000'
self.c = Canvas(redraw_callback=self.redraw)
self.c.text((120,110),self.tm)
self.c.blit(self.img)
app.body=self.c
self.c.bind(EButton1Down,self._ontest,((40,475),(310,580)))
def redraw(self, event=None):
self.c.blit(self.img)
self.c.text((120,110),self.tm)
def ontest(self):
self.tik = 10
self.i=0
while self.i<self.tik:
self.tm = u'now ' + str(self.i)
self.i+=1
self.redraw()
e32.ao_sleep(1)
return
def _ontest(self,event):
thread.start_new(self.ontest,())
if __name__ == '__main__':
lock=e32.Ao_lock()
s = Main()
app.exit_key_handler = lock.signal
lock.wait()
Отредактировано (Март 7, 2010 22:46:32)
Офлайн
Нельзя не в UI потоке использовать UI :)
Единственное решение, это пересмотреть архитектуру приложения. Ничто не мешает реализовать нужный функционал в одном потоке.
Не смотря на то, что у вас в приложении цикл, калбэки на забинденные события спокойно вызываются. Например, если вы захотите остановить выполнение цикла, сделайте флаг, который будет проверятся в вашем цикле if not self.flag:break, и сделайте кнопочку “stop” с калбэком def stop(self, event):self.flag=False
Как уже говорил arok, потоки на symbian не желательно использовать.
У меня лично никогда не было необходимости в их использовании. UI работает асинхронно…
Отредактировано (Март 8, 2010 12:25:06)
Офлайн
Тоесть, если я правильно понял, то если я в отдельном потоке захочу например перемножить две матрицы без использования UI то все будет работать и не будет вылетать. Так?
Офлайн
Именно так :-)
а вообще с вопросами по потокам лучше обратится в другие разделы форума, если они общего характера
Офлайн
nJLyToда нет, тут человек то с потоками знаком, но такие нюансы именно на симбиан.
а вообще с вопросами по потокам лучше обратится в другие разделы форума, если они общего характера
MDNВылетать не должно, но все же лучше приложение построить таким образом, чтоб поток не нужен был. Лучше асинхронность использовать.
то если я в отдельном потоке захочу например перемножить две матрицы без использования UI
Офлайн
igor.kaist посмотри ЛС
igor.kaistНо тогда получаеться что риализовать что то вроде таймера с UI в принципе не возможно? Потому что при выполнении любого действия связаного с обработкой UI таймер будет ждать…?
Вылетать не должно, но все же лучше приложение построить таким образом, чтоб поток не нужен был. Лучше асинхронность использовать
Офлайн
MDNВсе возможно. Какая задача стоит вообще? Программа, типа “таймер” реализовывается очень просто. Простым циклом.
Но тогда получаеться что риализовать что то вроде таймера с UI в принципе не возможно? Потому что при выполнении любого действия связаного с обработкой UI таймер будет ждать…?
MDNЭто поначалу так кажется. Немного непривычно. Но если один раз понять, то потом все становится просто и элегантно.
Похоже действительно единственный выход это пляски с бубноми при проектировании приложения..
Офлайн
igor.kaistПока что задача разобратся с UI. Если взять пример с таймером, то да, действительно одним циклом все можно сделать, но если делать UI c canvas и добавить например кнопочку для добовления текущего результата без остановки таймера, то если нажать эту кнопку и удерживать палец на экране, таймер перестает считать…
Все возможно. Какая задача стоит вообще? Программа, типа “таймер” реализовывается очень просто. Простым циклом.
igor.kaist:) :) :)
Когда я только постигал азы питона, одним из главных учебников были чужие исходники.
Отредактировано (Март 9, 2010 15:11:36)
Офлайн
MDNне должен он переставать считать… как то так…
то если нажать эту кнопку и удерживать палец на экране, таймер перестает считать…
canvas.bind(EButton1Down,down,(координаты))
while flag:
меняем циферки и пр.
redraw()
e32.ao_sleep(0.01)
def down(event):
делаем что нибудь.
Этот вызов асинхронный, с главным циклом все в порядке
Офлайн
А вот если например в def down(event) вызвать appuifw.note(u'Some text') Тогда как? У меня счетчик переставал считать, точнее он замирал на время показа
Офлайн