Seite 1 von 1

while 1 Sekunde ist noch nicht vorbei?

Verfasst: Donnerstag 18. Oktober 2007, 10:06
von blubber
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ß

Verfasst: Donnerstag 18. Oktober 2007, 10:26
von Joghurt
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.

Verfasst: Donnerstag 18. Oktober 2007, 10:27
von keppla
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.

Verfasst: Donnerstag 18. Oktober 2007, 10:44
von blubber
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ß

Verfasst: Donnerstag 18. Oktober 2007, 12:44
von Joghurt
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.