Найти - Пользователи
Полная версия: thread или бока с потоками
Начало » Mobile Python » thread или бока с потоками
1 2
MDN
Опыта разработки приложений для 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
igor.kaist
Нельзя не в UI потоке использовать UI :)
Единственное решение, это пересмотреть архитектуру приложения. Ничто не мешает реализовать нужный функционал в одном потоке.
Не смотря на то, что у вас в приложении цикл, калбэки на забинденные события спокойно вызываются. Например, если вы захотите остановить выполнение цикла, сделайте флаг, который будет проверятся в вашем цикле if not self.flag:break, и сделайте кнопочку “stop” с калбэком def stop(self, event):self.flag=False
Как уже говорил arok, потоки на symbian не желательно использовать.
У меня лично никогда не было необходимости в их использовании. UI работает асинхронно…
MDN
Тоесть, если я правильно понял, то если я в отдельном потоке захочу например перемножить две матрицы без использования UI то все будет работать и не будет вылетать. Так?
nJLyTo
Именно так :-)

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

igor.kaist
Вылетать не должно, но все же лучше приложение построить таким образом, чтоб поток не нужен был. Лучше асинхронность использовать
Но тогда получаеться что риализовать что то вроде таймера с UI в принципе не возможно? Потому что при выполнении любого действия связаного с обработкой UI таймер будет ждать…?
Похоже действительно единственный выход это пляски с бубноми при проектировании приложения…и особенно при достаточно сложных UI. Эх…опять надо искать под кроватью бубен :)))
igor.kaist
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, без этого кинетический скроллинг будет выглядеть дерганно и убого :)
MDN
igor.kaist
Все возможно. Какая задача стоит вообще? Программа, типа “таймер” реализовывается очень просто. Простым циклом.
Пока что задача разобратся с UI. Если взять пример с таймером, то да, действительно одним циклом все можно сделать, но если делать UI c canvas и добавить например кнопочку для добовления текущего результата без остановки таймера, то если нажать эту кнопку и удерживать палец на экране, таймер перестает считать…
Вот пишу это и самому смешно, ведь если использовать Button1Up, то проблема с длительным нажатием тоже решится сама собой :))

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

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

А про кинетическую прокрутку, рано мне ещё этим заморачиватся, тут хочется, что б хоть какой нить более-менее юзабильный интерфейс получить, а уж укрошать его то и после можно… А исходники прошу, что бы
igor.kaist
Когда я только постигал азы питона, одним из главных учебников были чужие исходники.
:) :) :)
igor.kaist
MDN
то если нажать эту кнопку и удерживать палец на экране, таймер перестает считать…
не должен он переставать считать… как то так…
canvas.bind(EButton1Down,down,(координаты))
while flag:
меняем циферки и пр.
redraw()
e32.ao_sleep(0.01)
def down(event):
делаем что нибудь.
Этот вызов асинхронный, с главным циклом все в порядке
MDN
А вот если например в def down(event) вызвать appuifw.note(u'Some text') Тогда как? У меня счетчик переставал считать, точнее он замирал на время показа
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