Python 数据流中的延迟

Python 数据流中的延迟,python,multithreading,networking,raspberry-pi,rpc,Python,Multithreading,Networking,Raspberry Pi,Rpc,我正在使用一个名为KRPC的插件和一个python脚本从游戏ksp中传输数据。这是KRPC的文档: 我的程序显示的数据和游戏结束时的数据之间从来没有延迟,直到我将我的程序多线程化,现在我得到了第二次延迟。多线程我的python程序很重要,因为它似乎阻止了脚本挂起或崩溃。我不知道是什么原因造成了延误。我的python脚本是在raspberry pi上运行的,所以我试图保持低CPU使用率 from threading import Thread import time import Adafruit

我正在使用一个名为KRPC的插件和一个python脚本从游戏ksp中传输数据。这是KRPC的文档: 我的程序显示的数据和游戏结束时的数据之间从来没有延迟,直到我将我的程序多线程化,现在我得到了第二次延迟。多线程我的python程序很重要,因为它似乎阻止了脚本挂起或崩溃。我不知道是什么原因造成了延误。我的python脚本是在raspberry pi上运行的,所以我试图保持低CPU使用率

from threading import Thread
import time
import Adafruit_Nokia_LCD as LCD
import Adafruit_GPIO.SPI as SPI
import krpc
import RPi.GPIO as GPIO
from pad4pi import rpi_gpio
from UUGear import *
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

GPIO.setwarnings(False)
try:

    device = UUGearDevice('UUGear-Arduino-5343-9628')
    if not device.isValid():
        exit()

    KEYPAD = [
            [1,2,3],
            [4,5,6],
            [7,8,9],
            ["*",0,"#"]
    ]

    ROW_PINS = [4,5,12,16] # BCM numbering
    COL_PINS = [26,6,13] # BCM numbering
    global pressedkey
    pressedkey = '0'
    factory = rpi_gpio.KeypadFactory()

    # Try factory.create_4_by_3_keypad
    # and factory.create_4_by_4_keypad for reasonable defaults
    keypad = factory.create_keypad(keypad=KEYPAD, row_pins=ROW_PINS, col_pins=COL_PINS)

    def procKey(key):
        print(key)
        global pressedkey
        pressedkey = str(key)

    # printKey will be called each time a keypad button is pressed
    keypad.registerKeyPressHandler(procKey)


    # Raspberry Pi hardware SPI config:
    DC = 23
    RST = 24
    SPI_PORT = 0
    SPI_DEVICE = 0


    # Hardware SPI usage:
    disp = LCD.PCD8544(DC, RST, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=4000000))

    # Software SPI usage (defaults to bit-bang SPI interface):
    #disp = LCD.PCD8544(DC, RST, SCLK, DIN, CS)

    # Initialize library.
    disp.begin(contrast=60)
    disp.clear()
    disp.display()

    image = Image.new('1', (LCD.LCDWIDTH, LCD.LCDHEIGHT))
    draw = ImageDraw.Draw(image)


    # Load default font.
    font = ImageFont.load_default()
    draw.rectangle((0,0,83,47), outline=255, fill=255)
    draw.text((15,0), 'Loading...', font=font)
    disp.image(image)
    disp.display()


    conn = krpc.connect(name='rpi', address='192.168.0.10', rpc_port=50000, stream_port=50001)
    vessel = conn.space_center.active_vessel

    draw.rectangle((0,0,83,47), outline=255, fill=255)
    draw.text((0,0), '--FLIGHT SYS--', font=font)
    draw.text((3,10), '1 - Surface', font=font)
    draw.text((3,20), '2 - Orbit', font=font)
    disp.image(image)
    disp.display()



    device.setPinModeAsInput(9)
    device.setPinModeAsInput(2)
    device.setPinModeAsInput(3)
    device.setPinModeAsInput(4)
    device.setPinModeAsOutput(12)
    vessel.control.sas = False
    prev_input_stage = 0
    prev_input_parachute = 0
    input_stage = '0'
    input_parachute = '0'
    def screen():
        global apoapsis
        global periapsis
        global altitude
        global pressedkey
        global draw
        global font
        global disp
        global conn
        global vessel
        ut = conn.add_stream(getattr, conn.space_center, 'ut')
        altitude = conn.add_stream(getattr, vessel.flight(), 'mean_altitude')
        apoapsis = conn.add_stream(getattr, vessel.orbit, 'apoapsis_altitude')
        periapsis = conn.add_stream(getattr, vessel.orbit, 'periapsis_altitude')
        while True:
            print 'AP:', apoapsis()
            print 'Pe:', periapsis()
            print 'Alt:', altitude()
            #for parachute in vessel.parts.parachutes:
            #   print parachute.state
            if pressedkey == '2':
                draw.rectangle((0,0,83,47), outline=255, fill=255)
                if abs(apoapsis()) < 1000:
                    draw.text((0,0), 'Ap:' + str(round(apoapsis(), 2)) + 'M', font=font)
                else:
                    draw.text((0,0), 'Ap:' + str(round(apoapsis()/1000, 2)) + 'KM', font=font)

                if abs(periapsis()) < 1000:
                    draw.text((0,10), 'Pe:' + str(round(periapsis(), 2)) + 'M', font=font)
                else:
                    draw.text((0,10), 'Pe:' + str(round(periapsis()/1000, 2)) + 'KM', font=font)

            if pressedkey == '1':
                draw.rectangle((0,0,83,47), outline=255, fill=255)
                if abs(altitude()) < 1000:
                    draw.text((0,0), 'Alt:' + str(round(altitude(), 2)) + 'M', font=font)
                else:
                    draw.text((0,0), 'Alt:' + str(round(altitude()/1000, 2)) + 'KM', font=font)
            if pressedkey == '#':
                draw.rectangle((0,0,83,47), outline=255, fill=255)
                draw.text((0,0), '--FLIGHT SYS--', font=font)
                draw.text((3,10), '1 - Surface', font=font)
                draw.text((3,20), '2 - Orbit', font=font)

            disp.image(image)
            disp.display()

    def hardware():
        global input_stage
        global prev_input_stage
        global vessel
        global device
        global input_parachute
        global prev_input_parachute
        while True:
            input_stage = not device.getPinStatus(9)
            if ((not prev_input_stage) and input_stage):
                vessel.control.activate_next_stage()
                print("stage")
                print 'Pin 9 status=', device.getPinStatus(9)
            prev_input_stage = input_stage

            input_parachute = not device.getPinStatus(2)
            if ((not prev_input_parachute) and input_parachute):
                for parachute in vessel.parts.parachutes:
                    parachute.deploy()
                print("Parachute")
                print 'Pin 2 status=', device.getPinStatus(2)
            #print(device.analogRead(3))
            prev_input_parachute = input_parachute
            vessel.control.sas = not device.getPinStatus(4)

            if vessel.control.sas == True:
                device.setPinHigh(12)
            else:
                device.setPinLow(12)

            for engines in vessel.parts.engines:
                if engines.gimballed == True:
                    engines.gimbal_locked = bool(device.getPinStatus(3))
            time.sleep(0.2)
    t1 = Thread(target = screen)
    t2 = Thread(target = hardware)

    t1.start()
    t2.start()
    t1.join()
    t2.join()
except:
    print 'Interrupted'
    print 'Cleaning up'
    GPIO.cleanup()  
    device.detach()
    device.stopDaemon()
    keypad.cleanup()
从线程导入线程
导入时间
进口Adafruit_诺基亚_液晶显示器作为液晶显示器
将Adafruitgpio.SPI作为SPI导入
进口krpc
将RPi.GPIO导入为GPIO
从pad4pi导入rpi\gpio
从UUGear进口*
从PIL导入图像
从PIL导入ImageDraw
从PIL导入ImageFont
GPIO.setwarnings(False)
尝试:
设备=UUGear设备('UUGear-Arduino-5343-9628')
如果不是设备。isValid():
退出()
键盘=[
[1,2,3],
[4,5,6],
[7,8,9],
["*",0,"#"]
]
行引脚=[4,5,12,16]#BCM编号
COL_引脚=[26,6,13]#BCM编号
全局按键
按按键='0'
factory=rpi\u gpio.KeypadFactory()
#尝试factory.create_4_by_3_键盘
#和factory.create_4_by_4_键盘以获得合理的默认值
键盘=工厂。创建键盘(键盘=键盘,行针=行针,列针=列针)
def procKey(钥匙):
打印(键)
全局按键
按下键=str(键)
#每次按下键盘按钮时都会调用printKey
键盘。注册表按键处理程序(procKey)
#Raspberry Pi硬件SPI配置:
DC=23
RST=24
SPI_端口=0
SPI_设备=0
#硬件SPI使用:
disp=LCD.PCD8544(DC、RST、spi=spi.SpiDev(spi_端口、spi_设备、最大速度_hz=4000000))
#软件SPI使用(默认为bit bang SPI接口):
#disp=LCD.PCD8544(直流、RST、SCLK、DIN、CS)
#初始化库。
显示开始(对比度=60)
disp.clear()
disp.display()
image=image.new('1',(LCD.LCDWIDTH,LCD.lcdhight))
draw=ImageDraw.draw(图像)
#加载默认字体。
font=ImageFont.load\u default()
绘制矩形((0,0,83,47),轮廓=255,填充=255)
draw.text((15,0),“正在加载…”,font=font)
显示图像(图像)
disp.display()
conn=krpc.connect(名称='rpi',地址='192.168.0.10',rpc_端口=50000,流_端口=50001)
容器=连接空间中心活动容器
绘制矩形((0,0,83,47),轮廓=255,填充=255)
draw.text((0,0),'--FLIGHT SYS--',font=font)
draw.text((3,10),“1-表面”,font=font)
draw.text((3,20),'2-Orbit',font=font)
显示图像(图像)
disp.display()
设备。设置PINMode输入(9)
设备。设置PINMode输入(2)
设备。设置PINMode输入(3)
设备。设置PINMode输入(4)
设备。SetPinModeA输出(12)
Vesser.control.sas=错误
上一个输入阶段=0
上一个输入伞=0
输入阶段='0'
输入\降落伞='0'
def屏幕():
全球远点
全关节近端
全球高度
全局按键
全球抽签
全局字体
全局显示
全球康涅狄格州
全球船舶
ut=conn.add_流(getattr,conn.space_中心,'ut')
高度=连接添加高度流(getattr,船只飞行(),“平均高度”)
apoapsis=conn.add_流(getattr,Vesser.orbit,“apoapsis_高度”)
近空=连接添加流(getattr,Vesser.orbit,“近空高度”)
尽管如此:
打印“AP:”,apoapsis()
打印“Pe:”,近中点()
打印“高度:”,高度()
#对于船上的降落伞。零件。降落伞:
#打印降落伞状态
如果按键=='2':
绘制矩形((0,0,83,47),轮廓=255,填充=255)
如果abs(apoapsis())<1000:
draw.text((0,0),'Ap:'+str(round(apoapsis(),2))+'M',font=font)
其他:
draw.text((0,0),'Ap:'+str(round(apoapsis()/1000,2))+'KM',font=font)
如果abs(periapsis())<1000:
draw.text((0,10),'Pe:'+str(round(periapsis(),2))+'M',font=font)
其他:
draw.text((0,10),'Pe:'+str(round(periapsis()/1000,2))+'KM',font=font)
如果按按键=='1':
绘制矩形((0,0,83,47),轮廓=255,填充=255)
如果abs(高度())小于1000:
draw.text((0,0),'Alt:'+str(round(altitude(),2))+'M',font=font)
其他:
draw.text((0,0),'Alt:'+str(圆形(高度()/1000,2))+'KM',font=font)
如果按键=='#':
绘制矩形((0,0,83,47),轮廓=255,填充=255)
draw.text((0,0),'--FLIGHT SYS--',font=font)
draw.text((3,10),“1-表面”,font=font)
draw.text((3,20),'2-Orbit',font=font)
显示图像(图像)
disp.display()
def硬件():
全局输入级
全局上一输入级
全球船舶
全球设备
全局输入伞
全局前置输入降落伞
尽管如此:
输入阶段=非设备。getPinStatus(9)
如果((不是上一个输入阶段)和输入阶段):
船舶。控制。激活下一阶段()
印刷品(“舞台”)
打印“引脚9状态=”,设备。getPinStatus(9)
上一个输入阶段=输入阶段
输入\降落伞=非设备。getPinStatus(2)
如果((不是上一个输入伞)和输入伞):
对于船上的降落伞。零件。降落伞:
降落伞部署
打印(“降落伞”)
打印“引脚2状态=”,设备。getPinStatus(2)
#打印(设备模拟读取(3))
上一个输入伞=输入伞