Форум сайта python.su
Есть набор строк, часть из них подсвечены. Если пользователь продержал запись выделенной более 3 секунд подсветку нужно снять.
То есть, как в письмах в Outlook.
Вопрос не касается определенных GUI библиотек - интересует сам подход. Как я понимаю, при выделении записи я должен запустить какой-то отдельный процесс(чтобы он не блокировал основной GUI), который 3 секунды ничего не будет делать, а потом проверить текущую подсвеченую запись и если необходимо снимет подсветку.
Смущает то, что для такой задачи слишком много сложностей:
1. Проверить что поток для данной записи не был порожден
2. Породить отдельный поток
3. Передать из потоку информацию о том, что надо снять подсветку
В Delphi бы я просто бы использовал компонент TTimer, который бы вызывал мою процедуру каждую секунду, а в процедуре бы я инкрементировал счетчик секунд, пока я простоял на одной записи.
В общем, как это правильно сделать ?
Офлайн
В Delphi бы я просто бы использовал компонент TTimer, который бы вызывал мою процедуру каждую секунду, а в процедуре бы я инкрементировал счетчик секунд, пока я простоял на одной записи.Можно точно так же, только вместо компонента - функция в отдельном потоке.
Офлайн
Можно же сделан всего один дополнительный поток, который будет этим заниматься, и передавать ему сообщения через Queue (очередь вообщем, забыл точное название модуля). Второй поток принимает сообщение из очереди, записывает время для себя, и в цикле проверяет, для каких элементов время вышло.
Офлайн
Хм… Мне кажется, или модуля signal хватит с избытком?
Офлайн
Вот простое решение этой проблемы
#-*-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'
Офлайн