Ich habe ein Client-Skript läuft auf einem Raspberry Pi 3. Der Client erhält von einem Server, ob es wahr oder falsch ist. Danach empfängt es ein bytesähnliches Objekt, das es decodiert und verwendet diese Information, um ein Bild in einer GUI anzuzeigen.Evaluiere socket.recv() die ganze Zeit
Er prüft, ob der GPIO-Pin bei einem Tastendruck TRUE erhält, und führt eine Schleife zurück zum ersten .recv().
Ich möchte der Client die ganze Zeit überprüfen, wenn es die Nachricht "neues Spiel" erhält, und wenn ja, gehen Sie zum ersten .recv(), wo es prüft, ob es wahr oder falsch ist.
Aber seit meiner .recv() -Funktion blockiert ich kann nichts tun, während dort stecken.
Wie kann ich überprüfen, ob ich Informationen erhalte, während ich noch überprüfe, ob sich der GPIO-Status auf TRUE ändert.
Der Code sieht wie folgt aus:
#imports needed
import socket
import RPi.GPIO as GPIO
import time
import tkinter as tk
import pygame
#Setup of GPIO pin for buttons used as bumpers
GPIO.setmode(GPIO.BOARD)
GPIO.setup(36, GPIO.IN, pull_up_down=GPIO.PUD_UP) #Pin 36 = GPIO16
#Setup of root window for the GUI and the different images
root = tk.Tk()
root.attributes('-fullscreen',True)
image6 = tk.PhotoImage(file="/home/pi/Desktop/wav/wrong.gif")
wronglabel = tk.Label(image=image6)
image5 = tk.PhotoImage(file="/home/pi/Desktop/wav/correct.gif")
correctlabel = tk.Label(image=image5)
image4 = tk.PhotoImage(file="/home/pi/Desktop/wav/questionmark.gif")
questionlabel = tk.Label(image=image4)
pygame.init()
#Setup of the different sounds to use in the project
correctsound = pygame.mixer.Sound('/home/pi/Desktop/wav/correct.wav')
wrongsound = pygame.mixer.Sound('/home/pi/Desktop/wav/wrong.wav')
HOST = '192.168.1.34' # The remote host,
PORT = 50007 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((HOST, PORT))
except:
print("FAILED. Sleep briefly & try again")
time.sleep(10)
continue
questionlabel.pack()
root.update()
while True:
data = s.recv(1024)
if data == b'True':
print('I am the true cone')
state = True
if data == b'False':
print('I am the false cone')
state = False
byte_string = s.recv(1024)
path = '/home/pi/Desktop/wav/%s.gif' % byte_string.decode()
questionlabel.pack_forget()
image1 = tk.PhotoImage(file=path) #x should change accordingly to the received message
Thelabel = tk.Label(image=image1)
Thelabel.pack()
root.update()
i=0
while i==0:
if GPIO.input(36) == True:
if state == True:
Thelabel.pack_forget()
correctlabel.pack()
root.update()
correctsound.play()
s.sendall(b'True Hit')
time.sleep(5)
correctlabel.pack_forget()
questionlabel.pack()
root.update()
if state == False:
Thelabel.pack_forget()
wronglabel.pack()
root.update()
wrongsound.play()
time.sleep(5)
wronglabel.pack_forget()
questionlabel.pack()
root.update()
i=1
Sie fragen über asynchroner I/O, und es gibt viele Möglichkeiten, damit umzugehen. Mögliche Lösungen sind die Verwendung von 'select.poll', die Verwendung von Threads oder das Durchsuchen des 'asynchio'-Moduls (unter anderem!). Beachten Sie, dass 'Rpi.GPIO' auch einen asynchronen Callback-basierten Interrupt-Mechanismus implementiert, der es Ihnen ermöglicht, eine Lösung zu implementieren, während Sie immer noch einen blockierenden Aufruf von' recv' haben. Vielleicht nehmen Sie sich etwas Zeit, um die verschiedenen Optionen zu untersuchen. – larsks
wow, so viele Dinge sind falsch hier, weiß nicht, wo ich anfangen soll:/Aber auf jeden Fall brauchen Sie einen anderen Thread, um Ihren Client/Server zu überprüfen – dgan
@dgan Fell frei mit Vorschlägen für Änderungen oder Kritik zu kommen. Dann würdest du diesen Thread neu starten, wenn er die richtige Nachricht erhält? –