1

我正在尝试为我的 EV3 积木编写一些代码。我真的很难让多线程工作。我正在使用线程模块,它不会引发任何错误,但应该在另一个线程上运行的函数根本不会运行。我的代码:

   #!/usr/bin/env pybricks
   from pybricks.hubs import EV3Brick
   from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor,
                                    InfraredSensor, UltrasonicSensor, GyroSensor)
   from pybricks.parameters import Port, Stop, Direction, Button, Color
   from pybricks.tools import wait, StopWatch, DataLog
   from pybricks.robotics import DriveBase
   from pybricks.media.ev3dev import SoundFile, ImageFile

   import threading


   # Create your objects here.
   ev3 = EV3Brick()

   def color_thread():
       print("color_thread")
       ev3.light.on(Color.ORANGE)
       wait(100)
       ev3.light.on(Color.GREEN)
       wait(100)

   def speaker_thread():
       print("speaker_thread")
       ev3.speaker.beep(200,100)
       wait(100)
       ev3.speaker.beep(500,100)
       wait(100)
   
   
   t1 = threading.Thread(target=color_thread)
   t2 = threading.Thread(target=speaker_thread)
   
   t1.start()
   t2.start()
   

所以预期的输出是:

   color_thread
   speaker_thread

和一些可见和可听的指示(改变灯光和发出声音),但输出是:

   Starting: brickrun --directory="/home/robot/olgojChorchoj_Stropochod" "/home/robot/olgojChorchoj_Stropochod"
   ----------
   ----------
   Completed successfully.

并且没有其他迹象表明这两个功能正在运行。

你能告诉我我做错了什么吗?谢谢

4

1 回答 1

1

这里的问题是程序在线程有机会运行之前就结束了。由于您在运行线程时没有运行任何耗时的代码,因此线程没有任何“落后”的东西,可以这么说,所以它们会立即退出。

这里有两种解决方案。我会先解释一个更简单的。

Soultuion 1:wait()调用线程后使用

您可以wait()在调用线程后立即调用。这使线程有时间在程序退出之前执行。以下是程序结束时的样子:

t1.start()
t2.start()
wait(230)

请注意,我等待230几毫秒,而不是200,给处理器一些喘息的空间,因为它不是超级快。

解决方案2:只color_thread放入一个线程

另一个可能不太精确的选项是只color_thread()在线程中运行,然后speaker_thread()直接调用。以下是程序结束时的样子:

# Create only one thread, for color_thread
thread = threading.Thread(target=color_thread)

# Start color_thread, and call speaker_thread directly
thread.start()
speaker_thread()
于 2022-02-18T19:41:07.297 回答