Seite 1 von 1

alten Thread mit neuem ersetzen...

Verfasst: Freitag 6. Juli 2007, 21:08
von nkoehring
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...

Verfasst: Samstag 7. Juli 2007, 15:49
von rayo
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

Verfasst: Samstag 7. Juli 2007, 18:12
von nkoehring
ach das ich da nicht selbst drauf gekommen bin ^^