threading.Timer Problem

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.
t0m

threading.Timer Problem

Beitragvon t0m » Freitag 18. Juni 2004, 19:39

Hallo,

ich bin ziemlich neu in Python und möchte nun alle X Sekunden eine bestimmte Funktion aufrufen. Das wollte ich mit threading.Timer machen.. Aber irgendwie bleibt das Programm nach den X Sekunden hängen, als würde eine Endlosschleife gestartet werden!!

Hier der Code welcher einfach nicht funktionieren will:

Code: Alles auswählen

import threading

def Test():
    print "OK"

T = threading.Timer(5, Test)
T.start()


Oder gibt es eine andere Möglichkeit die ebenfalls diesen Job erledigt?

mfg,
Tom[/code]
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Freitag 18. Juni 2004, 20:40

Hi t0m,

mit threading.Timer(x, func) wird die Funktion func nach x Sekunden einmal aufgerufen!

Code: Alles auswählen

def Test():
    global T
    print "OK"
    T = threading.Timer(5, Test)
    T.start()

Test()

hier ist es ausnahmsweise vorteilhaft, T als globale Variable zu verwenden um mittels T.cancel() die Ausführung stoppen zu können.


Gruß

Dookie
Gast

Beitragvon Gast » Freitag 18. Juni 2004, 20:45

Hi Dookie,

danke für die Hilfe. Aber das Programm bleibt trotzdem hängen! Ich bekomm zwar das erste "OK" ausgegeben aber das wars auch..

mfg,
t0m
t0m

Beitragvon t0m » Freitag 18. Juni 2004, 21:02

hmmm
anscheinend funktioniert threading.Timer nicht wenn ich den Code direkt in IDLE ausführe...

In der normalen Python-Shell geht der Code ohne Probleme! Merkwürdig..

mfg,
FiRe
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Freitag 18. Juni 2004, 21:08

Hi. Das glaub ich eher weniger, da es bei mir ohne Probleme funktioniert... was meinst du mit hängen bleiben direkt? Reagiert er noch auf Tastatureingaben oder reagiert er gar nicht mehr?
t0m

Beitragvon t0m » Freitag 18. Juni 2004, 21:49

Reagiert gar nicht mehr..
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

Beitragvon DER Olf » Samstag 19. Juni 2004, 08:54

doch....IDLE is sone sache

dann wirst du es wohl nur in der Shell ausführen können.

mfg Olf
RainBowBender
User
Beiträge: 53
Registriert: Dienstag 6. April 2004, 10:33

Beitragvon RainBowBender » Samstag 19. Juni 2004, 10:06

in "Python ge-packt" steht, dass man Python scripte mit Threads nicht unter IDLE ausführen sollte, wegen solchen Abstürzen. Insbesondere wird vor Windows in Verbindung mit IDLE und Threads gewarnt.
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

Beitragvon DER Olf » Samstag 19. Juni 2004, 13:28

vor
Windows + IDLE
würde ich sowieso warnen :lol:

mfg

Olf
studi
User
Beiträge: 25
Registriert: Montag 2. Juni 2008, 22:59

Beitragvon studi » Donnerstag 5. Juni 2008, 16:56

Hey Milan wie machst du das mit Your IP is XXX..... und so weiter und so fort.
Ich habe angs Big Brother is watching me :shock: :shock: :shock:
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Donnerstag 5. Juni 2008, 17:16

studi hat geschrieben:Hey Milan wie machst du das mit Your IP is XXX..... und so weiter und so fort.
Ich habe angs Big Brother is watching me :shock: :shock: :shock:

Deine IP sieht zwangsläufig jeder Webserver von dem du was abruft und damit sieht man auch den ISP. Irgendwohin muss der die Daten ja senden. Und damit dir auch die richtige Website gezeigt wird, sendet dein Browser seine Version, die Spracheinstellungen und das Betriebssystem mit.

Letztere Sachen kann man beim Firefox unterdrücken, ist aber nicht so sinnvoll ;)
studi
User
Beiträge: 25
Registriert: Montag 2. Juni 2008, 22:59

Beitragvon studi » Donnerstag 5. Juni 2008, 17:27

Hallo an alle.
Im rahmen eines Projekts versuche ich ein Diagnose Programm fuer Industrieroboter zu schreiben. Die Robotersteuerung liefert int Werte. Um
das arme Ding nicht staendig laufen lassen zu müssen will ich die Sensorwerte simulativ erzeugen. Das Prog. soll also jede 5 Sekunden paar Werte liefern. Ich hab's wie oben versucht und folgendes bekommen:

Code: Alles auswählen

import random
import threading
from timeit import Timer

class roboterzelle :
    def schrauber (number):
        zufall = []
        for i in range (number):
            wert = random.randrange(0,19999)
            zufall.append(wert)
        return zufall
    def hexopoth (number):
        zufall = []
        for i in range (number):
            wert = random.randrange(0,19999)
            zufall.append(wert)
        return zufall
    def hydraulik (number):
        zufall = []
        for i in range (number):
            wert = random.randrange(0,19999)
            zufall.append(wert)
        return zufall
    t = threading.Timer(5.0 , schrauber(10))
    t = threading.Timer(5.0 , hexopoth(10))
    t = threading.Timer(5.0 , hydraulik(10))
    t.start()

    print "Schrauberwerte sind = " , schrauber(10)
    print "Hexopothwerte sind = " , hexopoth (10)
    print "Hydraulikwerte sind = " , hexopoth (10)


Fehlermeldung:

Code: Alles auswählen

IDLE 1.2     
>>> ================================ RESTART ================================
>>>

>>> Exception in thread Thread-3:
Traceback (most recent call last):
  File "C:\Programme\Python25\lib\threading.py", line 460, in __bootstrap
    self.run()
  File "C:\Programme\Python25\lib\threading.py", line 625, in run
    self.function(*self.args, **self.kwargs)
TypeError: 'list' object is not callable


Mein problem ist ich bin auf IDLE und Windows zwangsweise gebunden da ich im Uni Netzwerk keine Programme instalieren darf :evil:
Hat jemand eine Idee wie man das Problem lösen könnte, bin für jede Hilfe dankbar. Bitte hilft mir. :)
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Donnerstag 5. Juni 2008, 17:51

@studi: Da wo IDLE läuft ist auch irgendwo ein Python-Interpreter für die Konsole dabei! Ich zitiere mal aus der "idle.bat":

python.exe ./Lib/idlelib/idle.py


Und schau doch bitte noch mal ins Tutorial (besser vielleicht ein Buch über OOP), da fehlen überall die "self" in den Methoden. Und der Fehler liegt auch nicht an den Threads, sondern am Start der Threads. Du übergibst diesen keine Funktion, sonder rufst diese auf. Hast du dir die Fehlermeldung eigentlich mal angeschaut?

Und warum machen deine Methoden eigentlich alle das selbe :? ?
studi
User
Beiträge: 25
Registriert: Montag 2. Juni 2008, 22:59

Beitragvon studi » Donnerstag 5. Juni 2008, 20:37

Ja klar ist der Python-Interpreter vorhanden, es ging blos darum das die Fehlermeldung, (gans oben im Thema) auf die schwaechen von Windows und IDLE geschoben wurde, deshalb habe ich darauf hingewiesen, dass ich mit IDLE arbeiten muss.

Ja ich muss mal wirklich im Tutorial besser nachschauen, wer sucht der findet. :wink: Aus der Dokumentation geht ja hervor, dass die Funktion

Code: Alles auswählen

threading.Timer(5.0 , schrauber(10))

beliebige Methoden nach einer bestimmten Zeit aufruft, da muss ich doch eigentlich gar nicht uebergeben, oder? :?

Danke fuer die Tips, ich schau mal und melde mich dann wieder.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 5. Juni 2008, 20:52

studi hat geschrieben:Ja klar ist der Python-Interpreter vorhanden, es ging blos darum das die Fehlermeldung, (gans oben im Thema) auf die schwaechen von Windows und IDLE geschoben wurde, deshalb habe ich darauf hingewiesen, dass ich mit IDLE arbeiten muss.

EyDu hat dir ja gezeigt, dass du das nicht musst. Du kannst Code in IDLE schreiben und sie mit dem Interpreter ausführen.

studi hat geschrieben:Ja ich muss mal wirklich im Tutorial besser nachschauen, wer sucht der findet. :wink: Aus der Dokumentation geht ja hervor, dass die Funktion

Code: Alles auswählen

threading.Timer(5.0 , schrauber(10))

beliebige Methoden nach einer bestimmten Zeit aufruft, da muss ich doch eigentlich gar nicht uebergeben, oder? :?

Du übergibst aber da keine Funktion als Argument sondern eine Liste - genau die die bei ``schrauber(10)`` rauskommt. Probiers selbst mal im interaktiven Interpreter.
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder