Seite 1 von 1

interrupt in pythonwin

Verfasst: Dienstag 20. November 2007, 09:00
von beefburrito
hallo erstmal...

ich bin python anfänger und kenne mich da jetz noch ned so aus...

ich habe aber das problem, dass ich eine endlosschleife mit einem interrupt unterbrechen möchte...bei dem ganzen codeschnipsel bin ich mir nicht sicher ob ich das sinnvoll gelöst habe...



kann mir da jemand plz helfen...

mfg

Code: Alles auswählen

def mySpace():
    space = []    
    i = 0
    time = GPS.getLastRMC()

    if time < '':
        print 'No data included'
    elif time > '':
        while i < 1:
            space.append(time)
            MOD.sleep(15)
            i= i + 1
	print space

	c = Timer(2, mySpace)
	c.start()

c = Timer(2, mySpace)
c.start()

aja und es wäre super :) wenn mir jemand noch gleich erklären könnte was ich statt der liste space[] nehmen könnte, da ich sie nicht in eine textdatei schreiben kann...thx im vorraus

Verfasst: Dienstag 20. November 2007, 09:41
von BlackJack
Falls es sich um `threading.Timer` handelt, die haben eine `cancel()`-Methode.

Ansonsten sieht das in der Tat etwas eigenartig aus. Mir fällt zum Beispiel keine Zeichenkette ein, die lexikographisch kleiner als die leere Zeichenkette ist. Falls ``GPS.getLastRMC()`` also immer Zeichenketten liefert, dürfte der ``if``-Zweig niemals ausgeführt werden. Vielleicht wolltest Du das auf Gleichheit mit der leeren Zeichenkette prüfen!? Und dann ein einfaches ``else`` statt einer umgekehrten Bedingung mit ``elif``. Streng genommen gibt es bei dem Quelltext so wie er jetzt ist ja noch den dritten Fall, dass ``time == ''`` gilt, weswegen man das ``elif`` nicht einfach durch ein ``else`` ersetzen kann, aber wie gesagt, dass sieht sowieso falsch/komisch aus.

Und was soll die ``while``-Schleife, die den Schleifenkörper genau einmal ausführt? Mal davon abgesehen, dass für Fälle wo man die Anzahl der Iterationen vor Schleifenbeginn kennt, die ``for``-Schleife das Mittel der Wahl ist, macht das überhaupt keinen Sinn eine einmalige Ausführung in eine Schleife zu stecken.

Die Liste `space` ist auch recht sinnfrei wenn da immer nur ein Element reingesteckt wird.

Ich habe so den Verdacht Du brauchst einen Thread und noch ein wenig Grundlagenwissen.

Verfasst: Donnerstag 22. November 2007, 15:40
von beefburrito
so ich hab mich nochmal dran gesetzt und das beherzigt was du mir geraten hast...hoffe es sieht jetz besser aus...

Code: Alles auswählen

import GPS
import time
import threading


class Timer(threading.Thread):			
	def __init__(self, seconds, action):		
		self.runTime = seconds					
		self.action = action
		threading.Thread.__init__(self)			
	def run(self):								
		time.sleep(self.runTime)				
		self.action()							

def myRMC():
	time = GPS.getLastRMC()
	print time
	c = Timer(2,myRMC)
	c.start()
	
c = Timer(2,myRMC)
c.start()
hm nun hab ich aber wieder das prob mit dem interrupt, da es sich ja wieder quasi um eine endlosschleife handelt....mit try/except kann ich das doch sicher unterbrechen...nur weis ich ned so wirklich mit was...keypress würde sich anbieten ist jedoch meines erachtens sinnlos, da das programm dann auf einem externen gps-modul arbeiten soll...

Verfasst: Donnerstag 22. November 2007, 16:03
von BlackJack
Äh, jetzt hast Du den `Timer` selber gebastelt. Nette Übung bringt aber nicht viel. Du müsstest nicht dauernd die Funktion mit einem neuen Timer laufen lassen, sondern den Code in einer Schleife in einem Thread und in der Schleife ein Flag testen ob abgebrochen werden soll.

Wie/Wann/Warum man das dann von aussen setzt, musst Du schon selbst wissen. Ungetestet:

Code: Alles auswählen

import time
from threading import Thread

class RMCPrinter(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.stopped = False
    
    def run(self):
        while not stopped:
            print GPS.getLastRMC()
            time.sleep(2)

rmc_printer = RMCPrinter()
rmc_printer.start()

# Und ab hier kann man den Thread mit ``rmc_printer.stopped = True``
# beenden.

Verfasst: Dienstag 27. November 2007, 08:54
von beefburrito
erst mal vorweg...ich bin froh dass ich so viel hilfe bekomm thx!

hm also ich hab mal deinen code ausprobiert und hab nun folgendes problem...
ich bekomme einen nameerror für die zeile

Code: Alles auswählen

self.stopped = False
das is doch ein argument und er bekommt einen nameerror!?das versteh ich ned so richtig....hab schon bisschen rumprobiert aber krieg das nicht hingebogen...bei mir is das "False" auch nicht blau hervorgehoben!?

Verfasst: Dienstag 27. November 2007, 09:26
von Jan-Peer
Guten Morgen!

Probier mal die Zeile 10 ("while not stopped") durch "while not self.stopped" zu ersetzen.

Verfasst: Dienstag 27. November 2007, 09:31
von BlackJack
Ups, wie peinlich. :oops:

Verfasst: Donnerstag 29. November 2007, 14:52
von beefburrito
mhm hab ich gemacht aber ich bekomm noch immer den nameerror fehler...

Traceback (innermost last):
File "C:\Programme\Python\Pythonwin\pywin\framework\scriptutils.py", line 301, in RunScript
exec codeObject in __main__.__dict__
File "...", line 20, in ?
rmc_printer = RMCPrinter()
File "...", line 13, in __init__
self.stopped = False
NameError: False

Verfasst: Donnerstag 29. November 2007, 14:59
von BlackJack
Wie alt ist Dein Python denn. :shock:

Verfasst: Donnerstag 29. November 2007, 16:55
von Jan-Peer
Ich hab ja schon überlegt, ob er False vielleicht false geschrieben hat, aber darauf wäre ich nicht gekommen ... :o

Verfasst: Dienstag 4. Dezember 2007, 09:20
von beefburrito
eh ich habe pythonwin 1.5.1 alt ich weis...ich hab mir jetz mal pythonwin 2.1 mit python 2.5 geholt...hab dann benötigte packages in den lib ordner kopiert....gibt dann aber errors da er die packages nicht importieren kann....

SyntaxError: Non-ASCII character '\xa9' in file C:\Programme\Python25\lib\MDM.py on line 5, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details (MDM.py, line 5)

hab mir das dann auf der seite angesehen wegen details....hab wieder packages herumkopiert und jetz gehts thx!!! :) anstrnegend