Các sợi chỉ#

Giới thiệu#

Luồng (thread) cho phép robot thực hiện nhiều tác vụ đồng thời trong cùng một chương trình. Chúng tạo điều kiện cho đa nhiệm, cho phép robot thực hiện các hành động độc lập cùng một lúc.

Hàm tạo lớp#

1 — Tạo và bắt đầu một luồng mới với một hàm.

thread( void (* callback)(void) );

2 — Tạo và bắt đầu một luồng mới với một hàm chấp nhận một đối số.

thread( int (* callback)(void *), void *arg );

Lớp Destructor#

Hủy đối tượng thread và giải phóng các tài nguyên liên quan.

~thread();

Thông số#

Tham số

Kiểu

Sự miêu tả

callback

void (*)(void)

Một hàm đã được định nghĩa trước đó sẽ chạy trong luồng mới.

callback

int (*)(void *)

Một hàm đã được định nghĩa trước đó, chấp nhận một đối số là con trỏ kiểu void và sẽ chạy trong luồng mới.

arg

void *

Một con trỏ rỗng được truyền vào hàm gọi lại.

Ghi chú#

  • A function must always be defined before it is called.

  • Khi tạo một luồng, bạn có thể đặt tên cho nó để quản lý riêng lẻ trong dự án của mình.

  • Một khi luồng bị dừng bằng lệnh interrupt(), nó không thể được khởi động lại. Để chạy lại, bạn phải tạo một luồng mới.

Ví dụ#

Định nghĩa hàm (bên ngoài int main())

// Drive forward while blinking screen
void blinkScreen() {
  while (true) {
    Brain.Screen.clearScreen(red);
    wait(0.5, seconds);
    Brain.Screen.clearScreen();
    wait(0.5, seconds);
  }
}

Đăng ký luồng bên trong int main()

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  // Begin project code
  thread blinkScreenThread = thread(blinkScreen);
  Drivetrain.drive(forward);
}

Định nghĩa hàm (bên ngoài int main())

// Run multiple threads simultaneously
// Turn right, blink screen at once
void blinkScreen() {
  while (true) {
    Brain.Screen.clearScreen(red);
    wait(0.5, seconds);
    Brain.Screen.clearScreen();
    wait(0.5, seconds);
  }
}

void turning() {
  Drivetrain.turn(right);
}

Đăng ký luồng bên trong int main()

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  // Begin project code
  thread blinkScreenThread = thread(blinkScreen);
  thread turningThread = thread(turning);
}

Chức năng thành viên#

Lớp luồng bao gồm các hàm thành viên sau:

  • interrupt – Dừng một luồng theo cách thủ công, hữu ích để dừng hành vi nền.

interrupt#

Dừng một luồng theo cách thủ công, điều này hữu ích khi một tác vụ không còn cần thiết hoặc khi một chương trình cần thiết lập lại các luồng.

Available Functions
void interrupt();

Parameters

Hàm này không có tham số.

Return Values

Hàm này không trả về giá trị nào.

Notes
  • Một khi luồng đã bị dừng, nó không thể được khởi động lại. Để chạy lại, bạn phải tạo một luồng mới bằng cách sử dụng thread.

  • Điều này hữu ích khi một tác vụ không còn cần thiết nữa hoặc khi một chương trình cần thiết lập lại hoặc phân công lại các luồng.

Examples

Định nghĩa hàm (bên ngoài int main())

// Loop through red and green
void colorLoop() {
  while (true) {
    Brain.Screen.drawRectangle(0, 120, 480, 120, red);
    wait(0.5, seconds);
    Brain.Screen.drawRectangle(0, 120, 480, 120, green);
    wait(0.5, seconds);
  }
}

// Display the current heading
void displayHeading() {
  Brain.Screen.setFont(prop60);
  while (true) {
    Brain.Screen.clearLine(1);
    Brain.Screen.setCursor(1, 1);
    Brain.Screen.print(
      "Heading: %.1f",
      DrivetrainInertial.heading(degrees)
    );
    wait(50, msec);
  }
}

Đăng ký luồng bên trong int main()

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  // Turn right, change screen color, and display heading at once
  thread colorThread = thread(colorLoop);
  thread displayHeadingThread = thread(displayHeading);

  Drivetrain.turn(right);
  wait(2, seconds);

  // Stop the flashing colors
  colorThread.interrupt();
}