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

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...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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:

ach das ich da nicht selbst drauf gekommen bin ^^
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten