interrupt in pythonwin

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
beefburrito
User
Beiträge: 5
Registriert: Dienstag 20. November 2007, 08:52

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
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.
beefburrito
User
Beiträge: 5
Registriert: Dienstag 20. November 2007, 08:52

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...
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.
beefburrito
User
Beiträge: 5
Registriert: Dienstag 20. November 2007, 08:52

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!?
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Guten Morgen!

Probier mal die Zeile 10 ("while not stopped") durch "while not self.stopped" zu ersetzen.
beefburrito
User
Beiträge: 5
Registriert: Dienstag 20. November 2007, 08:52

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
BlackJack

Wie alt ist Dein Python denn. :shock:
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Ich hab ja schon überlegt, ob er False vielleicht false geschrieben hat, aber darauf wäre ich nicht gekommen ... :o
beefburrito
User
Beiträge: 5
Registriert: Dienstag 20. November 2007, 08:52

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
Antworten