Thread stoppen?

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.
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Thread stoppen?

Beitragvon blubber » Mittwoch 6. Juni 2007, 13:32

Hi,

ich starte aus einer GUI Klasse einen Thread mit "test.start()". Nun möchte ich in der GUI Klasse diesen gestarteten Thread wieder beenden, wie mach ich das?
HIntergrund, es handelt sich um Testfälle, wenn ich einen Testfall starte, geht alles, wenn ich anschliessend noch einen starte, dann bekomm ich die Fehlermeldung "thread already started".

Gruß
BlackJack

Beitragvon BlackJack » Mittwoch 6. Juni 2007, 13:42

Threads kann man von aussen nicht stoppen, der Thread muss sich schon selbst beenden.

Aber selbst dann kann man ihn nicht neu starten ─ einen Thread kann man immer nur *einmal* starten. Für einen neuen Testfall musst Du einen neuen Thread erstellen.
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Beitragvon blubber » Mittwoch 6. Juni 2007, 14:08

hm, hab da irgendwie noch meine Schwierigkeiten.
Also wenn ich auf den Startknopf drück, dann komm ich ja in eine Funktion rein und diese startet den Thread. Aber ich komm ja immer in diese Funktion rein wenn ich den Startknop drücke, wie sag ich dem dann, dass ich den Thread nur einmal starten will?
BlackJack

Beitragvon BlackJack » Mittwoch 6. Juni 2007, 14:28

Na in dem Du in dieser Funktion, die mit dem Knopf verbunden ist, eben nicht ein *vorhandenes* Thread-Objekt startest. Du müsstest es dort erstellen und starten. Dann wird ja immer ein neues Objekt gestartet.
HarryPython
User
Beiträge: 60
Registriert: Freitag 8. Juni 2007, 07:39

Beitragvon HarryPython » Freitag 8. Juni 2007, 08:27

Hi blubber

Also hier ist meine Lösung um mit einem Stop Button einen Thread zu beenden.


Code: Alles auswählen

import threading 


class Can_Stress_Timer(threading.Thread):
   
    def __init__(self, tree, Button_1_Label):
        self.tree_items=tree
        self.Button_1_Label=Button_1_Label
        threading.Thread.__init__(self)

        self.stopped = threading.Event()


    def stop(self):
        self.stopped.set()

    def run(self):
        while not self.stopped.isSet():
       
            #Hier läuft die Abarbeitung von meinem Programm



Bei betätigen des Buttons, der bei mir in einer anderen Klasse steht, starte ich die Funktion run(). Durch erneutes drücken wird die Funktion stop() ausgeführt was zur Folge hat das beim nächsten Schleifendurchlauf der Funktion run(), mein Programm beendet. Betätige ich erneut den Button läuft mein Programm wieder los.

Hoffe ich hab das Richtig verstanden und konnte dir helfen.

Gruß HarryPython
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Freitag 8. Juni 2007, 08:51

HarryPython hat geschrieben:Bei betätigen des Buttons, der bei mir in einer anderen Klasse steht, starte ich die Funktion run(). Durch erneutes drücken wird die Funktion stop() ausgeführt was zur Folge hat das beim nächsten Schleifendurchlauf der Funktion run(), mein Programm beendet. Betätige ich erneut den Button läuft mein Programm wieder los.

Hallo HarryPython!

Nicht ganz.

1.) Die Methode ``run()`` darf nicht direkt aufgerufen werden. Nur der Aufruf von ``start()`` startet ``run()`` als Thread.

2.) Ein Thread kann/darf nicht mehrmals hintereinander gestartet werden. Für jeden Thread muss eine neue Instanz der Klasse erstellt werden.

Aber das mit dem Stoppen über ein Event ist komplett richtig.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]