Problem mit Threads

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.
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

Problem mit Threads

Beitragvon Lonestar » Montag 1. September 2008, 12:39

Hi,
wie der Titel schon sagt habe ich ein kleines Problem beim benutzen von Threads. Ich habe eine Klasse erstellt die in einem eigenen Thread laufen soll. Eigentlich habe ich versucht die Klasse nachzubauen von meinem TCP-Server. Ziel des ganzen ist ein Bluetooth RFCOMM- Server. Mit ein wenig Suche im Netz habe ich erst mal eine funktionierende Verbindung hergestellt. Ich poste einfach mal meinen ersten Versuch:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-

import  bluetooth
import threading
import Queue


class MyBTServer(threading.Thread):

    def __init__(self, notify_window, QueueIn, QueueOut):
       
        threading.Thread.__init__(self)
       
        #Warteschlangen für den Server
        self.QueueIn = QueueIn
        self.QueueOut = QueueOut
       
        #vorerst standardport - Port wird später vor Aufruf von run gesetzt
        self.Port = 15
       
        #bei schliessen des Main-Threads auch Server beenden
        self.setDaemon(True)
       
        self.CreateServer()
        self.run()
       
       
    def CreateServer(self):
        """
        BT-Server auf PORT starten
        """
        self.server_sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM )
        self.server_sock.bind(("",self.Port))
        self.server_sock.listen(1)
        print "Server erstellt auf  Port", self.Port
       
       
    def run(self):
        """
        Verbindungen Annehmen und an Handler weitergeben
        """
        while True:
            self.client_sock, self.client_info = self.server_sock.accept()
            print "Verbindung mit", self.client_info
            self.handle()
       
       
    def handle(self):
       
        StreamOffen = True
        while StreamOffen:
            data = self.client_sock.recv(1024)
            if data == "":
                StreamOffen = False
               
            print data
       
        print"Verbindung  mit ", self.client_info, "beendet"
        self.client_sock.close()   
     
     
q1 = Queue.Queue()
q2 = Queue.Queue()

server = MyBTServer(None, q1, q2)


Wie gesagt, wenn ich den Server so starte bekomme ich erst einmal eine funktionierende Verbindung hin. Binde ich den Server aber in mein Programm ein so blockiert der Server mein Hauptprogramm ab dem Aufruf der Methode 'run'. Das wäre ja auch logisch wenn ich den Server im gleichen Thread laufen lassen würde. Allerdings dachte ich das meine Klasse ein eigener Tread wird.
Vermutlich sehe ich mal wieder den Wald vor lauter Bäumen nicht oder aber ich habe hier irgendwas Grundätzliches bei dem erstellen der Klassen falsch verstanden. Vielleicht kann mir jemand mal auf die Sprünge helfen?
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Beitragvon Trundle » Montag 1. September 2008, 13:50

Die `start`-Methode eines Thread-Objektes startet einen neuen Thread sorgt dafür, dass die `run`-Methode dann in dem neuen Thread ausgeführt wird. Du rufst `run` direkt auf, wird also im gleichen Thread ausgeführt.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

Beitragvon Lonestar » Montag 1. September 2008, 14:13

genau das wars - danke für die prompte Hilfe, mehr bleibt mir da wohl nicht zusagen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder