alten Thread mit neuem ersetzen...

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.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

alten Thread mit neuem ersetzen...

Beitragvon nkoehring » Freitag 6. Juli 2007, 21:08

Ja hallo nochmal,

ich habe hier das Problem, dass ich einen Thread starten und nach Ablauf durch einen andere Instanz ersetzen moechte.

Ich bin bei meiner Suche auf die Methode join gestoßen, komme aber so garnicht damit klar.

Hier mal ein bissl Code:

Code: Alles auswählen

class ReqHandler(threading.Thread):
    def __init__(self, url, widget, retry=False, newThread=None):
        self.url = url
        self.widget = widget
        self.retry = retry
        threading.Thread.__init__(self)
        if newThread: self.join(newThread)

    def download_file(self, url, webuser=None, webpass=None):
        """ Datei aus dem Internet herunterladen """
        ...

    def run(self):
        if not self.url.endswith("/"): self.url += "/"
        now = time.localtime()
        delay = 0 # the age of the news in dates (to do now[2]-delay)
        while ((delay <= ((now[2] > 5 and 5) or now[2]-1)) or self.retry):
            if self.retry:
                url = self.url + "current_news_%02i_%02i_%i.txt" %(now[2], now[1], now[0])
                print self.getName()+':', "Trying to renew current news... ",
                new_news = self.download_file(url)
                if new_news and new_news != newslines:
                    print "success"
                    self.widget.SetValue("News actualized at "+str(time.localtime()))
                    for line in newslines: self.widget.AppendText(line)
                else: print "failed"
                threading._sleep(10)
            else:
                url = self.url + "current_news_%02i_%02i_%i.txt" %(now[2]-delay, now[1], now[0])
                print "Versuche ("+url+") zu laden...",
                newslines = self.download_file(url)
                if newslines:
                    print " done"
                    self.widget.SetValue(url+"\n\n")
                    for line in newslines: self.widget.AppendText(line)
                    break
                self.widget.SetValue("There are no news the last %i days.\n" %delay)
                print " failed"
                delay += 1
        self._Thread__stop()


Aufgerufen wird das Ganze dann so:

Code: Alles auswählen

    url = self.newsurl.GetValue()
    self.newsclient = ReqHandler(url, self.newstxt)
    self.newsclient.start()
    self.newsclient2 = ReqHandler(url, self.newstxt, True, self.newsclient)
    self.newsclient2.start()


Der Fehler liegt darin, dass es nicht funktioniert *lach*
Ja also der erste Thread wird zwar gestartet, aber scheinbar laeuft er nie aus...
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Samstag 7. Juli 2007, 15:49

Willst du die beiden Threads nacheinander laufen lassen?

Falls es so ist, reicht ein Thread, der einfach eine Queue hat und so die nötigen Daten bekommt.

Code: Alles auswählen

class Thread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.queue = Queue()

    def run(self):
        while 1:
            url, newstext = self.queue.get()
           
            print 'mach was mit url und newstext'

    def add_request(self, url, newstext):
        self.queue.put( (url, newstext) )


So brauchst du nur 1 Thread, wenn du sowieso alles nacheinander machen willst.

Gruss
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Beitragvon nkoehring » Samstag 7. Juli 2007, 18:12

ach das ich da nicht selbst drauf gekommen bin ^^

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder