Потоки на микропитоне EV3

Я пытаюсь написать код для своего блока 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.

и никаких других указаний на то, что эти две функции работают.

Можете ли вы сказать мне, что я делаю неправильно? спасибо

1 ответ

Проблема в том, что программа завершается до того, как потоки успевают запуститься. Поскольку вы не запускаете какой-либо трудоемкий код во время выполнения потоков, потокам, так сказать, нечего «запускать», поэтому они просто немедленно завершаются.

Здесь есть два решения. Сначала я объясню более простой.

Soultuion 1: использование после вызова потоков

Вы можете позвонить 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()
Другие вопросы по тегам