Python 如何在raspberry pi上使用多线程进行LCD输出

Python 如何在raspberry pi上使用多线程进行LCD输出,python,multithreading,python-3.x,raspberry-pi3,lcd,Python,Multithreading,Python 3.x,Raspberry Pi3,Lcd,写入raspberryp pi上的16x2 LCD显示屏可能需要一段时间才能完成,尤其是我编写的模块会自动滚动超出显示屏长度的文本 我需要使用多线程或类似的方法,将输出发送到显示器并继续程序的其余部分。我已经尝试了一些多线程的方法,但还没有完全实现 这是没有任何多线程的工作代码。我想要的多线程方法是“TextToLCD.ProcessFrameBuffer” 皮贝尔 首先,很高兴看到你的LCD功能。 您正在使用硬件,因此硬件是有限的资源。 为此,您需要某种访问控制,这可以通过一个或多个对象来实现

写入raspberryp pi上的16x2 LCD显示屏可能需要一段时间才能完成,尤其是我编写的模块会自动滚动超出显示屏长度的文本

我需要使用多线程或类似的方法,将输出发送到显示器并继续程序的其余部分。我已经尝试了一些多线程的方法,但还没有完全实现

这是没有任何多线程的工作代码。我想要的多线程方法是“TextToLCD.ProcessFrameBuffer”

皮贝尔
首先,很高兴看到你的LCD功能。 您正在使用硬件,因此硬件是有限的资源。 为此,您需要某种访问控制,这可以通过一个或多个对象来实现

使用显示器时有两种选择:

  • 将当前写入操作运行到末尾
  • 中断当前写入

    import threading
    
    import time
    def parallelWithLock(lock:threading.Lock, name:str):
    
        with lock:
             for i in range(5):
             print(f"{name}: {i}")
             time.sleep(0.5)
             # doWantYouWant(...)
    
    def parallelWithInterrupt(event:threading.Event,lock:threading.Lock,name:str):
    
    
        event.set()
        i = 0
        with lock:
            event.clear()
            while True:# or writing
                 if event.isSet():
                      print(f"{name} Interrupted!")
                      break
                 print(f"{name}: {i}")
                 time.sleep(1)
                 i += 1
                 #doWantYouWant(...)
    
     if __name__ == '__main__':
          lock = threading.Lock()
    
          t1 = threading.Thread(target=parallelWithLock,args=(lock,"Thread_1"))
          t2 = threading.Thread(target=parallelWithLock,args=(lock,"Thread_2"))
          t1.start()
          t2.start()
          t1.join()
          t2.join()
          event = threading.Event()
          lock = threading.Lock()
          t3 = threading.Thread(target=parallelWithInterrupt,args=(event,lock,"Thread_3"))
          t4 = threading.Thread(target=parallelWithInterrupt,args=(event,lock,"Thread_4"))
          t5 = threading.Thread(target=parallelWithInterrupt, args=(event,lock, "Thread_4"))
          t3.start()
          time.sleep(5)
          t4.start()
          time.sleep(3)
          t5.start()
          t3.join()
          t4.join()
          time.sleep(2)
          event.set()
          t5.join()
    

  • 至少,您需要包含
    TextToLCD.ProcessFrameBuffer
    ——以及整个
    TextToLCD
    模块的代码……但不要麻烦,因为stackoverflow不是一个代码编写服务。建议你试着自己写代码,如果你不能让它工作,然后问一个特定的问题。我确实自己写了TextToLCD模块。如果你愿意,我可以把它寄出去。一开始我没有包括它,因为我认为它没有必要。正如我所说的,不要麻烦(只是这样做)。可能更容易使用,而不是
    线程化
    import threading
    
    import time
    def parallelWithLock(lock:threading.Lock, name:str):
    
        with lock:
             for i in range(5):
             print(f"{name}: {i}")
             time.sleep(0.5)
             # doWantYouWant(...)
    
    def parallelWithInterrupt(event:threading.Event,lock:threading.Lock,name:str):
    
    
        event.set()
        i = 0
        with lock:
            event.clear()
            while True:# or writing
                 if event.isSet():
                      print(f"{name} Interrupted!")
                      break
                 print(f"{name}: {i}")
                 time.sleep(1)
                 i += 1
                 #doWantYouWant(...)
    
     if __name__ == '__main__':
          lock = threading.Lock()
    
          t1 = threading.Thread(target=parallelWithLock,args=(lock,"Thread_1"))
          t2 = threading.Thread(target=parallelWithLock,args=(lock,"Thread_2"))
          t1.start()
          t2.start()
          t1.join()
          t2.join()
          event = threading.Event()
          lock = threading.Lock()
          t3 = threading.Thread(target=parallelWithInterrupt,args=(event,lock,"Thread_3"))
          t4 = threading.Thread(target=parallelWithInterrupt,args=(event,lock,"Thread_4"))
          t5 = threading.Thread(target=parallelWithInterrupt, args=(event,lock, "Thread_4"))
          t3.start()
          time.sleep(5)
          t4.start()
          time.sleep(3)
          t5.start()
          t3.join()
          t4.join()
          time.sleep(2)
          event.set()
          t5.join()