Variable aus laufendem Thread auslesen
Verfasst: Donnerstag 5. Februar 2009, 12:25
Beschäftige mich erst seit kurzem mit Python und bin dementsprechend noch ziemlich unerfahren. Jetzt stehe ich vor folgendem Problem: Ich soll, im Rahmen meines Praktikums, eine Ampelsimulation programmieren. Die Schaltung der Ampel erfolgt innerhalb eines Threads. Es soll zeitgleich eine Abfrage der aktuell geschalteten Phase und des dazugehörigen Schaltintervalls möglich sein. Da eine Returnanweisung den Thread beendet, suche ich nach einer anderen Möglichkeit, die aktuelle Phase zurückzugeben und diese für andere Funktionen abrufbar zu machen. Vielleicht kann mir da ja jemand einen Tipp geben, denn auch Google hat mir bisher noch keine Alternative aufgezeigt (vielleicht suche ich auch nach den falschen Begriffen). Hier mein bisheriger Code:
Vielen Dank für eure Hilfe...
Code: Alles auswählen
from time import *
import thread
import threading
import os
import sys, traceback
class AsyncAmpel(threading.Thread):
def __init__(self,ampel_p):
"""Initialisierung der Klasse"""
threading.Thread.__init__(self)
self.ampel = ampel_p
class Ampel(threading.Thread):
l_Zustandsfolge_c=['rot','gelb','gruen','gelb']
d_Eingaben_c={'i':'self.setIntervall()', 'e':'print self.getInfo(self.i_ndex_i)','b':'os._exit(0)','t':'print time()'}
def __init__(self):
"""Initialisierung der Klasse"""
self.current_state = 'ausgeschaltet'
self.ld_Zustandsuebergaenge_i={'rot':5,'gelb':3,'gruen':5,'ausgeschaltet':0}
threading.Thread.__init__(self)
self.i_ndex_i = 0
def run(self):
sleep(5)
self.autoSchaltung()
def eingabeAuswahl(self):
"""Auswahl der Optionen"""
while 1:
print "Moechten Sie den Zustand der Ampel (e)rfragen, das Programm"
print "(b)eenden oder einen Schalt(i)ntervall veraendern? "
Eingabe = raw_input(">> ")
try:
exec (self.d_Eingaben_c[Eingabe])
except:
traceback.print_exc()
print 'Got', sys.exc_type, sys.exc_value
def getInfo(self,i_ndex_i):
"""Fragt den aktuellen Zustand der Ampel ab"""
return self.l_Zustandsfolge_c[self.i_ndex_i], self.ld_Zustandsuebergaenge_i[self.l_Zustandsfolge_c[self.i_ndex_i]]
def setIntervall(self):
"""Aendert die Schaltintervalle"""
Zustand_neu = raw_input("Welchen Zustand moechten Sie aendern? ")
Intervall_neu = input("Neuer Intervall: ")
self.ld_Zustandsuebergaenge_i[Zustand_neu] = Intervall_neu
def autoSchaltung(self):
"""Schaltet die Zustaende der Ampel automatisch"""
self.i_ndex_i
while 1:
for self.i_ndex_i in range(len(self.l_Zustandsfolge_c)):
start_time = time()
print strftime("%H:%M:%S")
state = self.l_Zustandsfolge_c[self.i_ndex_i]
Intervall = self.ld_Zustandsuebergaenge_i[state]
actual_time = time()
print
print "Die Ampel befindet sich im %sen Zustand" %self.l_Zustandsfolge_c[self.i_ndex_i]
print "Die Schaltung erfolgt nach %d Sekunden" %Intervall
print
while actual_time - start_time <= Intervall:
sleep(0.01)
actual_time = time()
self.i_ndex_i = self.i_ndex_i + 1
meineAmpel=Ampel()
runningAmpel=Ampel()
runningAmpel.start()
meineAmpel.eingabeAuswahl()