Уведомления

Группа в Telegram: @pythonsu

#1 Март 7, 2010 21:02:56

MDN
От:
Зарегистрирован: 2009-07-07
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

thread или бока с потоками

Опыта разработки приложений для 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()
Если не использовать потоки, тоесть убрать _ontest и вызывать ontest при нажатии, то все работает.

Забыл уточнить:
python for s60 v 2.0
5800



Отредактировано (Март 7, 2010 22:46:32)

Офлайн

#2 Март 8, 2010 12:24:14

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

thread или бока с потоками

Нельзя не в UI потоке использовать UI :)
Единственное решение, это пересмотреть архитектуру приложения. Ничто не мешает реализовать нужный функционал в одном потоке.
Не смотря на то, что у вас в приложении цикл, калбэки на забинденные события спокойно вызываются. Например, если вы захотите остановить выполнение цикла, сделайте флаг, который будет проверятся в вашем цикле if not self.flag:break, и сделайте кнопочку “stop” с калбэком def stop(self, event):self.flag=False
Как уже говорил arok, потоки на symbian не желательно использовать.
У меня лично никогда не было необходимости в их использовании. UI работает асинхронно…



Отредактировано (Март 8, 2010 12:25:06)

Офлайн

#3 Март 8, 2010 12:56:43

MDN
От:
Зарегистрирован: 2009-07-07
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

thread или бока с потоками

Тоесть, если я правильно понял, то если я в отдельном потоке захочу например перемножить две матрицы без использования UI то все будет работать и не будет вылетать. Так?



Офлайн

#4 Март 8, 2010 14:01:22

nJLyTo
От:
Зарегистрирован: 2008-11-11
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

thread или бока с потоками

Именно так :-)

а вообще с вопросами по потокам лучше обратится в другие разделы форума, если они общего характера



Офлайн

#5 Март 8, 2010 15:15:25

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

thread или бока с потоками

nJLyTo
а вообще с вопросами по потокам лучше обратится в другие разделы форума, если они общего характера
да нет, тут человек то с потоками знаком, но такие нюансы именно на симбиан.
MDN
то если я в отдельном потоке захочу например перемножить две матрицы без использования UI
Вылетать не должно, но все же лучше приложение построить таким образом, чтоб поток не нужен был. Лучше асинхронность использовать.



Офлайн

#6 Март 8, 2010 19:41:54

MDN
От:
Зарегистрирован: 2009-07-07
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

thread или бока с потоками

igor.kaist посмотри ЛС

igor.kaist
Вылетать не должно, но все же лучше приложение построить таким образом, чтоб поток не нужен был. Лучше асинхронность использовать
Но тогда получаеться что риализовать что то вроде таймера с UI в принципе не возможно? Потому что при выполнении любого действия связаного с обработкой UI таймер будет ждать…?
Похоже действительно единственный выход это пляски с бубноми при проектировании приложения…и особенно при достаточно сложных UI. Эх…опять надо искать под кроватью бубен :)))



Офлайн

#7 Март 9, 2010 14:50:33

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

thread или бока с потоками

MDN
Но тогда получаеться что риализовать что то вроде таймера с UI в принципе не возможно? Потому что при выполнении любого действия связаного с обработкой UI таймер будет ждать…?
Все возможно. Какая задача стоит вообще? Программа, типа “таймер” реализовывается очень просто. Простым циклом.
MDN
Похоже действительно единственный выход это пляски с бубноми при проектировании приложения..
Это поначалу так кажется. Немного непривычно. Но если один раз понять, то потом все становится просто и элегантно.
По поводу своего сообщения в ЛС, вечеров вышлю исходники XpressLib. Я так понимаю, кинетическая прокрутка интересна?! Там все просто достаточно:
1. Картинка со списком движется в бесконечном цикле, согласно своей скорости (y_pos+=speed). В этом же цикле проверяется выход за пределы экрана и уменьшается скорость движения.
2. EButton1Down останавливает движение ( speed=0) и запоминается позиция lasy_y
3. EDrag просто изменяет y_pos на y_pos+=last_y-y
4. В EButton1Up самое интересное. Вычисляется, насколько быстро юзер двигал пальцем, на основе предшествующего EDrag, и задается скорость speed
P.S. Не забывай про begin_redraw и end_redraw, без этого кинетический скроллинг будет выглядеть дерганно и убого :)



Офлайн

#8 Март 9, 2010 15:10:32

MDN
От:
Зарегистрирован: 2009-07-07
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

thread или бока с потоками

igor.kaist
Все возможно. Какая задача стоит вообще? Программа, типа “таймер” реализовывается очень просто. Простым циклом.
Пока что задача разобратся с UI. Если взять пример с таймером, то да, действительно одним циклом все можно сделать, но если делать UI c canvas и добавить например кнопочку для добовления текущего результата без остановки таймера, то если нажать эту кнопку и удерживать палец на экране, таймер перестает считать…
Вот пишу это и самому смешно, ведь если использовать Button1Up, то проблема с длительным нажатием тоже решится сама собой :))

Ладно, спасибо всем за ответы. Тему можно закрывать.

igor.kaist Спасибо отдельно, жду с нетерпением исходников :)

А про кинетическую прокрутку, рано мне ещё этим заморачиватся, тут хочется, что б хоть какой нить более-менее юзабильный интерфейс получить, а уж укрошать его то и после можно… А исходники прошу, что бы
igor.kaist
Когда я только постигал азы питона, одним из главных учебников были чужие исходники.
:) :) :)



Отредактировано (Март 9, 2010 15:11:36)

Офлайн

#9 Март 9, 2010 17:00:10

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

thread или бока с потоками

MDN
то если нажать эту кнопку и удерживать палец на экране, таймер перестает считать…
не должен он переставать считать… как то так…
canvas.bind(EButton1Down,down,(координаты))
while flag:
меняем циферки и пр.
redraw()
e32.ao_sleep(0.01)
def down(event):
делаем что нибудь.
Этот вызов асинхронный, с главным циклом все в порядке



Офлайн

#10 Март 9, 2010 17:12:38

MDN
От:
Зарегистрирован: 2009-07-07
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

thread или бока с потоками

А вот если например в def down(event) вызвать appuifw.note(u'Some text') Тогда как? У меня счетчик переставал считать, точнее он замирал на время показа



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version