الخيوط#

مقدمة#

تتيح الخيوط البرمجية للروبوت تشغيل مهام متعددة في وقت واحد ضمن البرنامج نفسه. فهي تمكّن الروبوت من أداء مهام متعددة، مما يسمح له بتنفيذ إجراءات مستقلة في الوقت نفسه.

مُنشئات الفئات#

1 — يقوم بإنشاء وبدء سلسلة عمليات جديدة باستخدام دالة.

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

2 — يقوم بإنشاء وبدء سلسلة رسائل جديدة باستخدام دالة تقبل وسيطًا.

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

مُدمِّر الفئة#

يقوم بتدمير الكائن ذي الخيط thread وتحرير الموارد المرتبطة به.

~thread();

حدود#

المعلمة

يكتب

وصف

callback

void (*)(void)

دالة مُعرَّفة مسبقاً سيتم تشغيلها في سلسلة العمليات الجديدة.

callback

int (*)(void *)

دالة مُعرَّفة مسبقًا تقبل وسيطًا من نوع مؤشر فارغ، وسيتم تشغيلها في سلسلة العمليات الجديدة.

arg

void *

مؤشر فارغ يتم تمريره إلى دالة الاستدعاء.

ملحوظات#

  • يجب تعريف الدالة دائمًا قبل استدعائها.

  • عند إنشاء سلسلة رسائل، يمكنك تسميتها لإدارتها بشكل فردي في مشروعك.

  • بمجرد إيقاف سلسلة العمليات باستخدام interrupt()لا يمكن إعادة تشغيلها. لتشغيلها مرة أخرى، يجب إنشاء سلسلة عمليات جديدة.

مثال#

عرّف الدالة (خارج النطاق 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);
  }
}

قم بتسجيل الخيط داخل 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);
}

عرّف الدالة (خارج النطاق 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);
}

قم بتسجيل الخيط داخل 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);
}

الدوال الأعضاء#

تتضمن فئة الخيوط الدوال الأعضاء التالية:

  • interrupt – إيقاف مؤشر الترابط يدويًا، وهو أمر مفيد لإيقاف السلوك في الخلفية.

interrupt#

يقوم بإيقاف سلسلة العمليات يدويًا، وهو أمر مفيد عندما لا تكون هناك حاجة إلى مهمة ما أو عندما يحتاج البرنامج إلى إعادة ضبط سلاسل العمليات.

Available Functions
void interrupt();

Parameters

هذه الدالة لا تحتوي على معلمات.

Return Values

هذه الدالة لا تُرجع قيمة.

Notes
  • بمجرد إيقاف عملية ما، لا يمكن إعادة تشغيلها. لتشغيلها مرة أخرى، يجب إنشاء عملية جديدة باستخدام thread.

  • يُعد هذا مفيدًا عندما لا تعود هناك حاجة إلى مهمة ما أو عندما يحتاج البرنامج إلى إعادة ضبط أو إعادة تعيين الخيوط.

Examples

عرّف الدالة (خارج النطاق 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);
  }
}

قم بتسجيل الخيط داخل 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();
}