Форум сайта python.su
0
Опыта разработки приложений для 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)
Офлайн
3
Нельзя не в UI потоке использовать UI :)
Единственное решение, это пересмотреть архитектуру приложения. Ничто не мешает реализовать нужный функционал в одном потоке.
Не смотря на то, что у вас в приложении цикл, калбэки на забинденные события спокойно вызываются. Например, если вы захотите остановить выполнение цикла, сделайте флаг, который будет проверятся в вашем цикле if not self.flag:break, и сделайте кнопочку “stop” с калбэком def stop(self, event):self.flag=False
Как уже говорил arok, потоки на symbian не желательно использовать.
У меня лично никогда не было необходимости в их использовании. UI работает асинхронно…
Отредактировано (Март 8, 2010 12:25:06)
Офлайн
0
Тоесть, если я правильно понял, то если я в отдельном потоке захочу например перемножить две матрицы без использования UI то все будет работать и не будет вылетать. Так?
Офлайн
0
Именно так :-)
а вообще с вопросами по потокам лучше обратится в другие разделы форума, если они общего характера
Офлайн
3
nJLyToда нет, тут человек то с потоками знаком, но такие нюансы именно на симбиан.
а вообще с вопросами по потокам лучше обратится в другие разделы форума, если они общего характера
MDNВылетать не должно, но все же лучше приложение построить таким образом, чтоб поток не нужен был. Лучше асинхронность использовать.
то если я в отдельном потоке захочу например перемножить две матрицы без использования UI
Офлайн
0
igor.kaist посмотри ЛС
igor.kaistНо тогда получаеться что риализовать что то вроде таймера с UI в принципе не возможно? Потому что при выполнении любого действия связаного с обработкой UI таймер будет ждать…?
Вылетать не должно, но все же лучше приложение построить таким образом, чтоб поток не нужен был. Лучше асинхронность использовать
Офлайн
3
MDNВсе возможно. Какая задача стоит вообще? Программа, типа “таймер” реализовывается очень просто. Простым циклом.
Но тогда получаеться что риализовать что то вроде таймера с UI в принципе не возможно? Потому что при выполнении любого действия связаного с обработкой UI таймер будет ждать…?
MDNЭто поначалу так кажется. Немного непривычно. Но если один раз понять, то потом все становится просто и элегантно.
Похоже действительно единственный выход это пляски с бубноми при проектировании приложения..
Офлайн
0
igor.kaistПока что задача разобратся с UI. Если взять пример с таймером, то да, действительно одним циклом все можно сделать, но если делать UI c canvas и добавить например кнопочку для добовления текущего результата без остановки таймера, то если нажать эту кнопку и удерживать палец на экране, таймер перестает считать…
Все возможно. Какая задача стоит вообще? Программа, типа “таймер” реализовывается очень просто. Простым циклом.
igor.kaist:) :) :)
Когда я только постигал азы питона, одним из главных учебников были чужие исходники.
Отредактировано (Март 9, 2010 15:11:36)
Офлайн
3
MDNне должен он переставать считать… как то так…
то если нажать эту кнопку и удерживать палец на экране, таймер перестает считать…
canvas.bind(EButton1Down,down,(координаты))
while flag:
меняем циферки и пр.
redraw()
e32.ao_sleep(0.01)
def down(event):
делаем что нибудь.
Этот вызов асинхронный, с главным циклом все в порядке
Офлайн
0
А вот если например в def down(event) вызвать appuifw.note(u'Some text') Тогда как? У меня счетчик переставал считать, точнее он замирал на время показа
Офлайн