2013-04-03 18 views
5

Chciałbym dodać 1 do zmiennej co minutę bez ingerencji w kod, który jest już uruchomiony.Jak wykonać akcję co minutę w Pythonie

Jest to gra, więc chcę w tle, aby drewno + 1, kamień + 1, ryba + 1 wydarzyło się co minutę bez wiedzy użytkownika.

time.sleep nie zadziała w tej sytuacji, ponieważ wstrzymuje cały program.

start=time.time() 
#some code 
end=time.time() 
if end-start > 60: 
    wood = wood+1 
    rock = rock+1 

Próbowałem zrobić coś powyżej, ale nie mogłem go ciągle liczyć. Mierzy tylko czas potrzebny na wykonanie # kodu.

Każda pomoc będzie świetna! Z góry dziękuję.

+0

pokrewne: [? Python Odpowiednik setInterval()] (http://stackoverflow.com/q/2697039/4279) – jfs

Odpowiedz

7

trzeba importować wątek moduł i itertools (oprócz svks' comment) w Pythonie

import thread, time, itertools 

zainicjować swój licznik threadsafe jak

wood = itertools.count().next() 

i napisać aktualizacji licznika do funkcji

def updateCounter(): 
    while True: 
     wood.next() 
     # wood += 1 
     time.sleep(60) 

i inauguracją nowego wątku z

thread.start_new_thread(updateCounter,()) 

Ale zmienne ressource jak drewna musi być accessable od wewnątrz funkcji licznika!

+0

Można ewentualnie dokonać globalnych zasobów, ale globalne są zawsze złym pomysłem. –

+0

To nie jest bezpieczne dla wątków (x + = 1 nie jest atomowe: http://29a.ch/2009/2/20/atomic-get-and-increment-in-python). Jeśli to zrobisz, a ty gdzie indziej w grze - wood - = 100, możesz czasami odkryć, że jedna ze zmian została w tajemniczy sposób utracona. – svk

+1

Punkt targowy. Będę edytować! – thomas

1

W tym celu wymagane są osobne wątki, które będą odpowiedzialne za inkrementację liczników. Ale pamiętaj, że wprowadzenie wątków do dowolnego programu sprawia, że ​​jest on bardziej skomplikowany. Szczegółowe informacje znajdują się pod adresem threading docs.

Nie jesteś również pewien, że dany wątek będzie uzyskiwał czas procesora w każdej sekundzie, możesz to założyć, ale nie masz pewności.

5

Oto odpowiedź, która nie dotyczy wątków, ponieważ wątki mogą być trudne do uzyskania. (Jeśli używasz wątków, musisz odczytywać synchronizację wątków lub możesz zaryzykować subtelne błędy.)

Prawdopodobnie masz jakąś "główną pętlę". Może to wyglądać tak, obecnie:

while game.running: 
    game.process() 

Nie ma nic magicznego pętli głównej - można robić rzeczy, oprócz przetwarzania wejściowych i obraz do ekranu tutaj. Jeśli chcesz coś uruchomić raz na minutę można po prostu zrobić coś takiego:

t0 = time.time() 
while game.running: 
    t1 = time.time() 
    if (t1-t0) >= 60.0: 
     game.wood += 1 
     t0 = t1 
    game.process() 

Jeśli używasz pewnych bibliotek mogłeś głównym pętla ukryte wewnątrz biblioteki.W tym przypadku prawdopodobnie jesteś rozpoczynający grę mniej więcej tak:

game.main() # this function doesn't return until your game exits 

Jeśli jest to przypadek, że prawdopodobnie będzie to funkcja w bibliotece, aby zrobić coś równoważnego do powyższego - ustawienie kodu wykonywać co jakiś czas lub w określonych odstępach czasu. Szukaj "funkcji bezczynności" lub "zegarów".

1

będzie działać co 60 sekund.

 try { 
     while (true) { 
      System.out.println(new Date()); 
      Thread.sleep(60 * 1000); 
     } 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
+0

Java nie jest Pythonem – jfs

+0

yes..Ale możesz stworzyć tę samą logikę w Pythonie również .. !! Po prostu daję ci logikę ... !!! –

+0

w takim przypadku jest to duplikat odpowiedzi [@ tomaszbrue] (http://stackoverflow.com/a/15795496/4279) – jfs

Powiązane problemy