Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 14, 2008 15:23:54

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

gui - решение

Есть набор строк, часть из них подсвечены. Если пользователь продержал запись выделенной более 3 секунд подсветку нужно снять.
То есть, как в письмах в Outlook.

Вопрос не касается определенных GUI библиотек - интересует сам подход. Как я понимаю, при выделении записи я должен запустить какой-то отдельный процесс(чтобы он не блокировал основной GUI), который 3 секунды ничего не будет делать, а потом проверить текущую подсвеченую запись и если необходимо снимет подсветку.

Смущает то, что для такой задачи слишком много сложностей:

1. Проверить что поток для данной записи не был порожден
2. Породить отдельный поток
3. Передать из потоку информацию о том, что надо снять подсветку

В Delphi бы я просто бы использовал компонент TTimer, который бы вызывал мою процедуру каждую секунду, а в процедуре бы я инкрементировал счетчик секунд, пока я простоял на одной записи.

В общем, как это правильно сделать ?



Офлайн

#2 Ноя. 14, 2008 15:43:28

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

gui - решение

В Delphi бы я просто бы использовал компонент TTimer, который бы вызывал мою процедуру каждую секунду, а в процедуре бы я инкрементировал счетчик секунд, пока я простоял на одной записи.
Можно точно так же, только вместо компонента - функция в отдельном потоке.

Офлайн

#3 Ноя. 14, 2008 16:12:28

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

gui - решение

Можно же сделан всего один дополнительный поток, который будет этим заниматься, и передавать ему сообщения через Queue (очередь вообщем, забыл точное название модуля). Второй поток принимает сообщение из очереди, записывает время для себя, и в цикле проверяет, для каких элементов время вышло.



Офлайн

#4 Ноя. 15, 2008 03:56:47

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

gui - решение

Хм… Мне кажется, или модуля signal хватит с избытком?



Офлайн

#5 Ноя. 15, 2008 11:25:29

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

gui - решение

Вот простое решение этой проблемы

#-*-coding:utf-8-*-
import Queue,thread,time

buf=Queue.Queue() # создаемь объект "очередь"


def start():
id_list={} # словарь в котором ключи это время получения значения id
while 1:
if not buf.empty(): # если очередь не пуста...
id=buf.get(block=0) # получаем id из очереди
id_list[time.time()]=id # и добавляем в словарь...
for x in id_list.keys(): # перебираем ключи словаря
if time.time()-x>3: # если прошло 3 секунды с момента прихода id
print id_list[x] # печатаем или делаем что нибудь...
del id_list[x] # удаляем из словаря..

thread.start_new_thread(start,()) # запускаем в отдельном потоке

buf.put('test id') # добавляем id в очередь
time.sleep(1)
buf.put('test id2') # через секунду добавим новое id в очередь
time.sleep(6)
print 'finish'



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version