Kommando wiederholen

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.
mr.hide
User
Beiträge: 108
Registriert: Montag 29. August 2005, 14:02

Beitragvon mr.hide » Montag 9. Januar 2006, 17:02

z.B.: so?

Code: Alles auswählen

import threading
import time


class OwnThread(threading.Thread):
   
    def __init__(self):
        threading.Thread.__init__(self)
        print "Ich bin ein eigener Prozess"

    def run(self):
        while not abbruch_event.isSet():
            print "laufe noch"
            time.sleep(2)
           


abbruch_event = threading.Event()

t = OwnThread()
t.start()

print "Ich bin schon fertig, warte noch und schliesse dann den Thread"

time.sleep(4)
abbruch_event.set()
- Natürlich kanns du die beiden letzten Zeilen auskommentieren, aber dann hast du ne Endlosschleife ;-)

Geht natürlich auch noch anders.
Aber hiermit erschaffst du eine Klasse die als neuer Prozess läuft.
Dadurch terminiert sie nicht wenn das Programm das Sie startet zu Ende ist. Ausser du setzt es als Deamon.
Grüße
Matthias

- Fluchen befreit von Kummer und Leid -
Gast

Beitragvon Gast » Montag 9. Januar 2006, 17:21

Wow, danke!

Ist genau das, was ich wollte!

:D :D :D
Gast

Beitragvon Gast » Dienstag 10. Januar 2006, 15:31

Ach ja, so sieht jetzt übrigens mein Programmteil aus, falls es jemanden interessiert:


Code: Alles auswählen

import threading
import time

class MyRegularThread(threading.Thread):
   def __init__(self):
      threading.Thread.__init__(self)         
      
   def run(self):
      sleep_time = 60 
      i = 1
      while i == 1:   
         print "does anything"
         time.sleep(sleep_time)
         
t = MyRegularThread()
t.start()   
BlackJack

Beitragvon BlackJack » Mittwoch 11. Januar 2006, 01:50

Das `i` kannst'e weglassen und ``while True:`` stattdessen schreiben.
Gast

Beitragvon Gast » Donnerstag 12. Januar 2006, 12:38

Jo, habs jetzt noch ein bisschen verändert und erweitert - klappt wunderbar!

Danke für eure Hilfe!

Code: Alles auswählen

import threading
import time

class MyRegularThread(threading.Thread):
   def __init__(self):
      threading.Thread.__init__(self)           
      global abbruch_event
      abbruch_event = threading.Event()
   def run(self):
      sleep_time = 2
      while not abbruch_event.isSet(): 
         print "does anything"
         time.sleep(sleep_time)
   def close(self):
      abbruch_event.set()



class MyMainProgram:
   def begin_MyRegularThread(self):
      t = MyRegularThread()
      t.start()   
   def close_MyRegularThread(self):
      t = MyRegularThread()
      t.close()
   def somethingElse(self):
      print "does something else"
      
do = MyMainProgram()
do.begin_MyRegularThread()
do.somethingElse()

time.sleep(10)

do.close_MyRegularThread()
      
BlackJack

Beitragvon BlackJack » Donnerstag 12. Januar 2006, 23:38

Anonymous hat geschrieben:Jo, habs jetzt noch ein bisschen verändert und erweitert - klappt wunderbar!


Klappt aber nur mit einem Thread.


Code: Alles auswählen

import threading
import time

class MyRegularThread(threading.Thread):
   def __init__(self):
      threading.Thread.__init__(self)           
      global abbruch_event
      abbruch_event = threading.Event()
   def run(self):
      sleep_time = 2
      while not abbruch_event.isSet(): 
         print "does anything"
         time.sleep(sleep_time)
   def close(self):
      abbruch_event.set()


Hier führst Du mit ``global`` ein `abbruch_event` ein, das für das gesamte Modul gilt und nicht nur für den einen Thread.

Code: Alles auswählen

class MyMainProgram:
   def begin_MyRegularThread(self):
      t = MyRegularThread()
      t.start()   
   def close_MyRegularThread(self):
      t = MyRegularThread()
      t.close()
   def somethingElse(self):
      print "does something else"


Hier wird eine Klasse als Namensraum missbraucht. Warum sind die Funktionen nicht auf Modulebene?

In `begin_*` erzeugst Du ein `MyRegularThread` Objekt und startest den Thread. In `close_*` erzeugst Du ein neues `MyRegularThread` Objekt und rufst darauf die `close()` Methode auf. Was nur funktioniert weil `abbruch_event` auf Modulebene und nicht als Instanzvariable existiert.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder