Permalänk
Medlem

Python timer

Hej,

Jag har ett litet problem med en kod jag skriver. Jag vill att programmet ska gå in i en while loop och så ska den köra den i säg 5 sekunder och när den har gjort det ska den ta värdet som den fått fram efter de 5 sekunderna och gå vidare. Jag har googlat och inte hittat någon lösning som jag förstår mig på så om någon skulle kunna förstå min luddiga förklaring och hjälpa mig vore det bra
Det är Python 2 det handlar om.

Mvh

Permalänk
Hedersmedlem

Varsågod!

Edit: Fel av mig, såg nu att det inte var det du var ute efter.

Däremot kanske du kan lösa problemet om du kör programmet m h a två trådar. Jag har tyvärr bara erfarenhet av simpel Python-programmering, och kan inte hjälpa dig längre än så. Det finns info på sidan jag länkade som kan vara av värde när det gäller att tråda ditt program.

Permalänk
Medlem

Spara ett timestamp innan loopen börjar, ha en if-sats i loopen som jämför current time med timestamp, break då skillnaden är över 5 s, done?

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Hedersmedlem
Skrivet av Gnejs:

Spara ett timestamp innan loopen börjar, ha en if-sats i loopen som jämför current time med timestamp, break då skillnaden är över 5 s, done?

Det lär vara ganska mycket lättare än mitt förslag med trådar får jag säga.

Modulen time bör passa för ändamålet, eller hur?

Permalänk
Medlem

Om du gör något sånt här?

>>> import time >>> from threading import Timer >>> def do_timeout(timeout=5): ... print time.time() ... timer = Timer(timeout, do_timeout) ... timer.start() ... >>> do_timeout() 1369256430.67 >>> 1369256435.67 1369256440.67

Observera att det här är direkt ur min interpreter så du får ta bort >>> samt punkterna.

Det här resulterar i att den skriver ut time.time() var femte sekund. Vet inte om det var de här du ville ha men värt ett försök.

Eller vill du kanske ha det så här?

>>> value = 5 >>> while value > 0: ... print 'Nuvarande värde: ', value ... value -=1 ... if value == 5: ... break Nuvarande värde: 5 Nuvarande värde: 4 Nuvarande värde: 3 Nuvarande värde: 2 Nuvarande värde: 1

Visa signatur
Permalänk
Medlem
Skrivet av Gnejs:

Spara ett timestamp innan loopen börjar, ha en if-sats i loopen som jämför current time med timestamp, break då skillnaden är över 5 s, done?

Är ganska ny på programmering så vet inte vad timestamp, så om du vore så snäll att förklara lite hur det ser ut och fungerar Annars tror jag du är nått på vägen.

Skrivet av widL:

Det lär vara ganska mycket lättare än mitt förslag med trådar får jag säga.

Modulen time bör passa för ändamålet, eller hur?

Jo det är ju något sånt jag är ute efter men vet inte hur jag ska implementera det så det funkar :/

Skrivet av Drager:

Om du gör något sånt här?

>>> import time >>> from threading import Timer >>> def do_timeout(timeout=5): ... print time.time() ... timer = Timer(timeout, do_timeout) ... timer.start() ... >>> do_timeout() 1369256430.67 >>> 1369256435.67 1369256440.67

Observera att det här är direkt ur min interpreter så du får ta bort >>> samt punkterna.

Det här resulterar i att den skriver ut time.time() var femte sekund. Vet inte om det var de här du ville ha men värt ett försök.

Eller vill du kanske ha det så här?

>>> value = 5 >>> while value > 0: ... print 'Nuvarande värde: ', value ... value -=1 ... if value == 5: ... break Nuvarande värde: 5 Nuvarande värde: 4 Nuvarande värde: 3 Nuvarande värde: 2 Nuvarande värde: 1

Nja det kanske är nått sånt, men samma sak där att jag inte vet riktigt hur jag ska få det att fungera.

Ska försöka ladda upp koden så är det nog lättare att förstå hur jag vill att det ska fungera

Permalänk

Ett litet exempel

Det beror ju på vad du ska göra för något, men här kommer ett väldigt simpelt exempel. Time-modulen kan användas till lite allt möjligt, som till exempel få programmet att pausa en stund så inte processorn går på högvarv "time.sleep(sekunder)" (såvida du inte vill göra så mycket beräkningar som möjligt på 5 sekunder). time.time() ger nuvarande tid i sekunder sedan 1970 (unix/posix tid).

import time timestart= time.time() print "Time start: %f"%timestart while time.time() - timestart< 5.000: print "Hej" time.sleep(0.1) #Sleep 100 ms timeend= time.time() print "Time end: %f"%timeend

Permalänk
Medlem
Skrivet av hansemannen:

Det beror ju på vad du ska göra för något, men här kommer ett väldigt simpelt exempel. Time-modulen kan användas till lite allt möjligt, som till exempel få programmet att pausa en stund så inte processorn går på högvarv "time.sleep(sekunder)" (såvida du inte vill göra så mycket beräkningar som möjligt på 5 sekunder). time.time() ger nuvarande tid i sekunder sedan 1970 (unix/posix tid).

import time timestart= time.time() print "Time start: %f"%timestart while time.time() - timestart< 5.000: print "Hej" time.sleep(0.1) #Sleep 100 ms timeend= time.time() print "Time end: %f"%timeend

Okej tack, tror jag börjar förstå nå ska kolla vidare på det imorgon.

Här är iaf koden som det ser ut nu:

#!/usr/python #_*_coding: latin-1_*_ import RPi.GPIO as gpio import time import os gpio.setmode(gpio.BCM) gpio.setup(17, gpio.IN) os.chdir("sökväg till usb minne") count=0 while True: input_value = gpio.input(17) time.sleep(0.001) while input_value == False: count=count+1 try: logfile = open("Speed", "a+") try: logfile.writelines(str(count) + "\n") finally: logfile.close() except IOError: pass while input_value == False: input_value = gpio.input(17)

Då är det så att jag vill göra så den räknar antalet count i ett visst antal sekunder och sedan skriva det talet till filen, istället för som den gör nu och skriver in varje count i filen. Hoppas det blev lättare att förstå vad jag ville

Tack på förhand!

Permalänk

Okej, men då undrar jag vad det är du vill räkna/mäta egentligen. Som det ser ut nu verkar du räkna hur många gånger som du mätt att "pinne" 17 varit låg (Edit 2: My bad, det blir nog ändå att du mäter hur många gånger pinnen gått från hög till låg eller nåt sånt, de dubbla while-slingorna gjorde mig förvirrad ).

Nu spekulerar jag bara men om du vill mäta t ex hur många gånger pinnen varit hög kanske event_detected() funktionen (http://code.google.com/p/raspberry-gpio-python/wiki/Inputs) är bättre att använda (antar att det är så det funkar, har inte använt RPI själv).

Sen skulle jag nog tycka att det är bättre att öppna filen före du kör din count-slinga, och stänga den när du är klar med mätningarna. Sen kör du bara logfile.writelines(str(count)) inne i count-slingan och slipper öppna och stänga filen hela tiden. Men det kanske var poängen att du bara vill ha den öppen vid skrivning.

Värt att veta är att time.sleep(0.001), dvs sov 1 ms, antagligen inte kommer bli 1 ms utan mycket mer. Runt 10 ms är nog mer rimligt, men jag vet inte hur bra raspberry PI fungerar vad gäller timing men det är väl Linux och inte ett realtids OS (i windows kan det blir mer än 10 ms om processorn är upptagen med annat).

Liten snurra för att "spara" var 5:e sekund:

import time logging_timeout = 5.000 start_time = time.time() while True: curr_time = time.time() #Update current time if curr_time - start_time > logging_timeout: # Time elapsed, update start_time start_time = curr_time print "Write to logfile here - happens every %0.3f seconds"%(logging_timeout)

Edit: Såg att det även finns threaded callbacks, vilket kan vara trevligt i ditt fall utifall du nu vill mäta hur många gånger pinnen haft rising edge (0->1) eller falling edge (1->0)

Permalänk
Datavetare

Eftersom du kör med ett system som implementerar POSIX så kan du använda dig av signal för detta

Ett dummy exempel kan se ut så här

import signal import time def workForSec(secs): done = [False] def handler(signo, frame): done[0] = True signal.signal(signal.SIGALRM, handler) signal.alarm(secs) while not done[0]: print "working..." time.sleep(.1) print "Done working!" workForSec(1)

Man är tvungen att använda en array för done då Python hanterar heltal och liknande "by-value" då man skulle inte "se" att "handler()" tilldelat att värde till done om det refererar till en boolean, heltal eller flyttal.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer