Seite 1 von 1

Problem mit Threads

Verfasst: Montag 1. September 2008, 12:39
von Lonestar
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?

Verfasst: Montag 1. September 2008, 13:50
von Trundle
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.

Verfasst: Montag 1. September 2008, 14:13
von Lonestar
genau das wars - danke für die prompte Hilfe, mehr bleibt mir da wohl nicht zusagen