2017-12-15 4 views
1

Ich habe ein Problem, wenn ich eine Verbindung zum Server, es verbindet sich ordnungsgemäß und der Code im Thread läuft perfekt, das Problem ist, dass es scheint, als ob ich keine Nachricht oder an mindestens selbst.data wird nicht aktualisiert, ich habe versucht, mit print ("") zu überprüfen, und es sieht so aus, als ob die while-Schleife nach dem Start des Threads vom Code nicht erreicht wird. Hier ist mein Code:Multithread-Client in Python

class Client: 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

    def __init__(self, address): 
     self.sock.connect((address, 10000)) 
     self.playerID = PID 
     self.data = [0, 0, 0, 0, 0] 


     iThread = threading.Thread(target=self.game(self.data)) 
     iThread.daemon = True 
     iThread.start() 

     while True: 
      data = self.sock.recv(2048) 
      datas = pickle.loads(data) 
      for i in range(0, len(self.data)): 
       self.data[i]= datas[i] 
      if not data: 
       break 

    def game(self, data): 
     morecode... 
+0

Gibt 'Spiel' irgendwas zurück? – Vovanrock2002

+0

Hallo, nein, es sendet nur Nachrichten an den Server und aktualisiert eine Liste – acid

+1

Es scheint, dass Sie 'self.game (self.data)' aufrufen, wenn Sie das 'Thread' erstellen, anstatt es vom Thread aufrufen zu lassen. – quamrana

Antwort

1

Hier ist ein Experiment, bei dem ein Thread Ziele ohne Argumente gegeben, aber das Ziel schließt bereits über die Argumente, die sie braucht:

from threading import Thread 

import time 

def func1(data): 
    time.sleep(2) 
    data.append(2) 


def func(data): 

    def func2(): 
     func1(data) 

    print(data) 
    t=Thread(target=func2) 
    t.start() 
    t.join() 
    print(data) 
    t=Thread(target=lambda: func1(data)) 
    t.start() 
    t.join() 
    print(data) 


func([0]) 

Ausgang:

[0] 
[0, 2] 
[0, 2, 2] 

Diese Antwort soll hier zeigen, dass es Möglichkeiten gibt, ein Thread ein Ziel zu geben, das eine Form des Abschlusses ist.

+0

Ich habe schon gearbeitet, danke, ich folgte dir Ratschläge und überprüfte, wie man einen Thread mit und Argument verwenden kann Das Argument ist ein Tüppel, also musste ich das Argument in diesem Tupel wie folgt angeben: iThread = threading.Thread (target = self.game, args = (self.data,)) – acid