スレッド#

導入#

スレッドを使用することで、ロボットは同じプログラム内で複数のタスクを同時に実行できます。これによりマルチタスクが可能になり、ロボットは複数の独立した動作を同時に実行できます。

注: スレッドで使用するには、まず関数を定義する必要があります。

コンストラクタ – 新しいスレッドを作成して開始します。

  • Thread – メインプログラムと並行して指定された関数を実行する新しいスレッドを開始します。

アクション – 実行中のスレッドを制御します。

  • stop – スレッドを手動で停止します。バックグラウンド動作を停止する場合に便利です。

コンストラクタ#

Thread#

Thread はスレッドを作成して開始します。スレッドを作成する際に名前を付けることで、不要になったときに停止させることができます。

使用法:

my_thread = Thread(my_function)

パラメータ

説明

my_thread

オプション。新しいスレッドの名前。

my_function

以前に定義された 関数 の名前。

注: 関数は呼び出される前に必ず定義されていなければなりません。

# Drive forward while blinking lights
def blink_lights():
    while True:
        robot.led.on(ALL_LEDS, RED)
        wait(0.5, SECONDS)
        robot.led.on(ALL_LEDS, BLUE)
        wait(0.5, SECONDS)
blink_lights_thread = Thread(blink_lights)
robot.move_at(0)

# Run multiple threads simultaneously
# Turn right, blink lights and display heading at once
def blink_lights():
    while True:
        robot.led.on(ALL_LEDS, RED)
        wait(0.5, SECONDS)
        robot.led.on(ALL_LEDS, GREEN)
        wait(0.5, SECONDS)

def display_heading():
    while True:
        robot.screen.clear_row()
        robot.screen.set_cursor(1, 1)
        robot.screen.print(f"Heading: {robot.inertial.get_yaw()}")
        wait(50, MSEC)

blink_lights_thread = Thread(blink_lights)     
display_heading_thread = Thread(display_heading)
robot.turn(RIGHT)

アクション#

stop#

stop はスレッドを手動で停止します。これは、タスクが不要になった場合や、プログラムがスレッドをリセットする必要がある場合に便利です。スレッドが停止すると、再開することはできません。再度実行するには、Thread を使用して新しいスレッドを作成する必要があります。

使用法:

my_thread.stop()

パラメータ

説明

my_thread

以前に開始されたスレッドオブジェクト。これは、 Threadを使用してスレッドが作成されたときに割り当てられた名前です。

"""
Run multiple threads simultaneously
Turn right, blink lights and display heading at once
Stop blinking lights after 2 seconds
"""
def blink_lights():
    while True:
        robot.led.on(ALL_LEDS, RED)
        wait(0.5, SECONDS)
        robot.led.off(ALL_LEDS)
        wait(0.5, SECONDS)

def display_heading():
    while True:
        robot.screen.clear_row()
        robot.screen.set_cursor(1, 1)
        robot.screen.print(f"Heading: {robot.inertial.get_yaw()}")
        wait(50, MSEC)

blink_lights_thread = Thread(blink_lights)     
display_heading_thread = Thread(display_heading)
robot.turn(RIGHT)

wait(2, SECONDS)
blink_lights_thread.stop()