2017-10-15 4 views
1

Ich war nur herumwandern, wie Sie Text drucken, während auf die Benutzereingabe warten. Wie zum Beispiel, wenn wir in einer Chat-App waren, haben wir eine Eingabe(), so dass der Benutzer beim Empfangen von Nachrichten Nachrichten senden und drucken() konnte. Es muss simultan sein. Ich habe versucht, Threads zu verwenden, aber es bleibt immer bei einem Thread stehen. Beispiel:Eingabe und Drucken von Thread Python

def receive(client): 
    threadName = client.getThreadName() 
    while not client.isStopThread(): 
     time.sleep(1) 
     print('test') 
     while (client.isThereMessage()): 
      print('[' + threadName + ']: ' + client.getMessage()) 

und für das Hauptprogramm

client.startThread(thread.uid) 
receiveThread = Thread(target = receive(client)) 
receiveThread.deamon = True 
receiveThread.start() 

while True: 
    toSendMessage = input('[' + client.fetchThreadInfo(client.uid)[client.uid].name + ']: ') 
    client.sendMessage(toSendMessage, thread_id=thread.uid, thread_type=thread.type) 

jemand mir helfen könnte?

+0

es druckt 'test' aber es gibt kein '[xx]:' da drin und ich kann keine Eingabe schreiben –

Antwort

0

Sie rufen den Klassenkonstruktor Thread falsch an. Die Signatur ist:

threading.Thread(target=None, args=(), kwargs={}) 

Die target ist die Funktion Objekt selbst, d.h. receive, nicht receive(client). Sie können nun Aufruf die receive Funktion mit client als Eingang, und dann Passieren der Wert Rückkehr dieser Funktion als target Schlüsselwort-Argument für den Konstruktor Thread (die None zu sein scheint). Wenn die receive-Funktion unbegrenzt lange Schleife ausführt, wird der Code definitiv in dem Thread-Konstruktor stehen.

Sie sollten stattdessen rufen die Thread Konstruktor wie so:

receiveThread = Thread(target=receive, args=(client,)) 

Auch im Allgemeinen, müssen Sie für die Eingabe in den beiden Druck etwas und warten nicht Threading. Sie können stattdessen das tun, was synchrone I/O-Multiplexing heißt, was bedeutet, I/O auf mehreren Objekten zur gleichen Zeit, aber aus einem einzigen Thread auszuführen. Die Idee besteht darin, auf eine Benachrichtigung vom Betriebssystem zu warten, wenn ein oder mehrere Objekte zum Schreiben oder Lesen (oder beides) verfügbar sind. Sehen Sie sich die Module select oder selectors für weitere Informationen an.

Hier ist ein einfaches Beispiel. Es wartet nur bis zu einer Sekunde auf Eingaben des Benutzers. Wenn eine Eingabe empfangen wird, wird sie einfach zurückgesendet, und wenn keine empfangen wird, druckt sie Nothing new.

import sys 
import select 
timeout = 1.0 
while True: 
    rlist, _ = select.select([sys.stdin], [], [], timeout) 
    if len(rlist): 
     print(sys.stdin.readline()) 
    else: 
     print('Nothing new') 

Sie könnten diese Anpassung sowohl für Benutzereingabe und für eine neue Nachricht zu warten, dass Sie die Benutzerkonsole drucken möchten.