2017-01-28 2 views
1

У меня есть простая программа для обнаружения, когда файл создается в каталоге. Он должен проверять каждую минуту, если есть новый файл, а затем сбросить таймер, если нет нового файла.Таймер не сбрасывается

import os 
import threading 
import time 
import sys 

def detector(): 
    filenames = os.listdir('/home/username/Documents/') 
    if filenames: 
     for i in filenames: 
      #do things 
    print('I started a thread!') 
    sys.stdout.flush() 
    threading.Thread(target=start_timer).start() 
def start_timer(): 
    print('I started a threaded timer at', t.ctime()) 
    sys.stdout.flush() 
    threading.Timer(60, detector) 
#UI stuff here 

При запуске без каких-либо файлов в каталоге, то сценарий просто печатает:

I started a thread! 
I started a timer at [insert time here] 

но только один раз. Это заставляет меня думать, что что-то не так с моей резьбой (я никогда не использовал потоки раньше). Я не знаю, должна ли она быть потоковой, но программа не может ждать обычного таймера, потому что таймер заставляет пользовательский интерфейс зависать, пока таймер не будет выполнен.

+0

Что вы хотите достичь, установив целевой поток, созданный в конце 'детектора',' start_timer', а затем установив обратный вызов 'Timer' в' детектор'? Кстати, 'Timer' является подклассом' Thread', поэтому, чтобы начать его, вы должны в теории называть 'start' ... – nbro

+0

Ох ... да ... начните ... Я надеялся начать таймер, чтобы проверить, был ли файл создан без зависания пользовательского интерфейса. – Steampunkery

+0

Многопоточность - это не тривиальная задача программирования. Вы должны сначала понять основы ... – nbro

ответ

1

Вот простой пример того, что я думаю, что вы хотите:

import os 
import threading 


def list_dir(my_dir, secs): 

    filenames = os.listdir(my_dir) 
    # print(filenames) 

    # Do your stuff here!!! 

    # Setting a new timer: call list_dir in secs seconds 
    threading.Timer(secs, list_dir, args=[my_dir, secs]).start() 

def start_timer(): 
    print('timer started!') 
    seconds = 60 # 60 seconds 
    directory = "/my/beloved/dir" # insert here the directory 
    threading.Timer(seconds, list_dir, args=[directory, seconds]).start() 


start_timer() 

Обратите внимание, что Timer только называет его обратный вызов один раз (после количества секунд, заданного в качестве первого параметра), и именно поэтому мы создаем и запустите другой Timer внутри list_dir.

+0

Я провешу это утром. Но важно то, что таймер остановит программу до тех пор, пока она не закончится (например: будут ли продолжаться теоретические кнопки пользовательского интерфейса?) EDIT: Как только я проверю ответ утром, я приму ответ. – Steampunkery