while 1 Sekunde ist noch nicht vorbei?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Hi,

eine Frage zu while Schleifen. Gibt es eine komfortable Python - Funktion etc., was eine while-Schleife auf 1 Sekunde begrenzt? Klar, kann man auch von Hand machen, aber vielleicht gibts ja was feines?
quasi:

while(ab jetzt für die Dauer von X Sekunden):
...


Gruß
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Sag uns doch bitte, welches Problem du lösen willst, nicht wie. Es scheint mir, als ob du eigentlich was anderes machen willst und das "Schleife nach 1 Sekunde abbrechen" eine suboptimale Lösung für etwas ist, dass sich evtl. mit Threads einfacher lösen ließe.

Die Frage, die du gestellt hast, ließe sich mit Timer beantworten. Es folgt ein kleines Beispiel. Achtung: Du solltest im richtigen Code keine globale Variable verwenden, sondern alles in einer Klasse kapseln, ich hab mir das hier gespart:

Code: Alles auswählen

import sys
from threading import Timer


keep_going = True

def set_to_false():
    global keep_going # Im allgemeinen eine schlechte Idee
    keep_going = False

keep_going = True
t = Timer(2, set_to_false)
t.start()
while keep_going:
    print >>sys.stderr, "dumdidum..."
Aber nochmal: sag uns bitte, welches Problem du damit lösen willst.
Zuletzt geändert von Joghurt am Donnerstag 18. Oktober 2007, 10:27, insgesamt 1-mal geändert.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Gibt es eine komfortable Python - Funktion etc., was eine while-Schleife auf 1 Sekunde begrenzt? Klar, kann man auch von Hand machen, aber vielleicht gibts ja was feines?
simple lösung:

Code: Alles auswählen

from time import time

t = time()
while time() < t +1:
  doStuff()
wenn du es "eleganter" willst (wobei ich persönlich dazu tendiere, dinge, die zeit miteinbeziehen für unelegant zu halten):

Code: Alles auswählen

def Deadline(seconds):
  t = time()
  i = 0
  while t + seconds > time():
    yield i
    i += 1

# fünf sekunden lang hochzählen
for i in Deadline(5):
  print i
edit: ack zu yoghurts Einschätzung, dass du vermutlich ein anderes Problem hast.
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Hi,

nagut, dann mit Roman, was allerdings nichts an der zu Beginn gestellten Frage ändert:

Ich möchte für 1 Sekunde lang Messwerte aufnehmen (wie und wo ist ja völlig egal) und dazu nehm ich eine while Schleife die 1 Sekunden lang rennt. Jo, das mach ich momentan so:

timestamp = time.clock()
while ((timestamp + 1) > time.clock()):
...

Jo, das wollte ich einfach eleganter haben, durch eine evtl vorhandene Funktion die es bereits in Python gibt, mehr nicht 8)
Von Threads bin ich hier eigentlich weit entfernt.
Falls es keine andere Möglichkeit gibt, dann lass ich es halt so...

Gruß
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

OK, in diesem Falle ist die Lösung ok. Es hätte ja aber z.B. auch sein können, dass du einfach für 1 Sekunde warten willst, es sei denn, ein bestimmtes Ereignis tritt ein. In dem Falle wäre die Whileschleife nämlich suboptimal gewesen.
Antworten