Blokkerende versus niet-blokkerende code - VEX Coding Studio

Haal meer uit VEXcode
We raden u aan over te stappen naar onze nieuwe software. VEXcode heeft zowel op blokken gebaseerde als op tekst gebaseerde opties, die werken op Chromebooks, iPads, Android-tablets, Windows en Macs. Bezoek code.vex.com voor meer informatie over het downloaden van VEXcode.
VEX Coding studio is niet meer leverbaar en kan niet meer worden gedownload. Al gedownload? Het programma blijft werken, maar wordt niet langer ondersteund.
Gebruikers die overstappen op VEXcode kunnen hun C++/C++ Pro-projecten migreren naar VEXcode Pro V5 door dit artikelte volgen.

Stap 1: Herkennen of de code blokkeert of niet-blokkeert

  • Kijk naar de bovenste twee Motor.spin-commando's naast de groene pijlen. Groene pijlen geven niet-blokkerende opdrachten aan.
  • Merk op dat er geen doelstatus is opgenomen in die actiecommando's - alleen om de rechtermotor vooruit en de linkermotor achteruit te laten draaien. Het zijn niet-blokkerende opdrachten die zullen blijven lopen terwijl het programma doorgaat met de volgende opdrachten.
  • Kijk naar de opdrachten Motor.rotateFor en Motor.rotateTo naast de rode pijlen. Rode pijlen geven blokkeeropdrachten aan.
  • Merk op dat er een doelstatus is opgenomen in die actiecommando's - 270 graden draaien of 270 graden draaien. Ze blokkeren commando's omdat het programma dit zal doen totdat het klaar is voordat het doorgaat met het volgende commando.
  • Bekijk de opdrachten Motor.rotateFor en Motor.rotateTo naast de groene pijlen.
  • Merk op dat er een waitForCompletion Boolean-parameter in die opdrachten is opgenomen en dat deze is ingesteld op false. Dat betekent dat de standaardinstelling om het commando te laten wachten tot het klaar is (als een blokkeercommando) is uitgeschakeld (ingesteld op false) en dus zijn ze nu niet-blokkerend. Het programma zal ze starten en doorgaan naar de volgende opdracht.

OPMERKING: Nogmaals, de opdrachten van de linkermotor (rotateTo en roteerFor) naast de onderste groene pijlen zijn ingesteld op niet -blokkeren door de parameter waitForCompletion in te stellen op false. Maar u kunt in plaats daarvan ook een startRotateTo of startRotateFor gebruiken. Beide startRotate-opdrachten zijn niet-blokkerend en laten het programma doorgaan naar de volgende opdracht voordat het wordt voltooid.

OPMERKING: Er zijn veel andere voorbeelden van blokkerende versus niet-blokkerende opdrachten in VCS. Deze voorbeelden zijn gekozen vanwege hun eenvoud.

OPMERKING: Sommige commando's zijn gemakkelijk te herkennen als blokkerend of niet-blokkerend op basis van hun code. Motor.startRotateTo en Motor.startRotateFor zijn bijvoorbeeld van nature niet-blokkerende commando's omdat de actie is gestart maar niet noodzakelijkerwijs is voltooid voordat het programma naar de volgende opdracht gaat.

Stap 2: Gebruik niet-blokkerende code om opdrachten te starten en verder te gaan

  • Kijk naar de twee niet-blokkerende Motor.spin-commando's naast de bovenste groene pijlen.
  • Merk op dat het LeftMotor.spin-commando wordt gestart en dat het programma dan onmiddellijk verdergaat met het RightMotor.spin-commando. Dit is belangrijk zodat beide motoren tegelijkertijd draaien.

OPMERKING: Als ze opdrachten blokkeerden, zou eerst de linkermotor naar voren draaien totdat hij klaar was. Dan zou de rechtermotor achteruit draaien totdat hij klaar is. Daarna zou het programma doorgaan.

  • Bekijk de opdrachten Motor.rotateFor en Motor.rotateTo naast de onderste groene pijlen.
  • Merk op dat de waitForCompletion Boolean-parameter in die opdrachten is ingesteld op false en ze daarom beide niet-blokkerend maakt.

Stap 3: Gebruik niet-blokkerende en blokkerende code samen om parallelle processen te hebben

  • Kijk nog eens naar de opdrachten Motor.rotateFor en Motor.rotateTo naast de blauwe pijlen. Blauwe pijlen worden gebruikt om parallelle opdrachten aan te geven.
  • Merk op dat, omdat de waitForCompletion-parameters van de linkermotorcommando's zijn ingesteld op false, de rechtermotor onmiddellijk na de linkermotor begint te draaien. Dit is belangrijk om de robot in een rechte lijn vooruit of achteruit te laten bewegen.

OPMERKING: De reden dat de opdrachten van de linkermotor niet-blokkerend waren, is omdat de opdrachten vóór die van de rechtermotor waren. commando's. Om ervoor te zorgen dat een paar motoropdrachten tegelijkertijd wordt uitgevoerd, moet de eerste niet-blokkerend zijn en de tweede blokkeren. 

Stap 4: Gebruik blokkeercode om opdrachten uit te voeren totdat u klaar bent

  • Merk op dat om het programma te beëindigen voordat het verder gaat, de commando's van de Rechter Motor blokkeren.

OPMERKING: Alleen de blokkeeropdrachten van de rechtermotor zorgen ervoor dat het programma wacht tot die opdracht is voltooid voordat het verder gaat.Door die blokkering kan de programmeur de robot zien stoppen voordat hij doorgaat met de volgende opdrachten.

Stap 5: Begrijp hoe de niet-blokkerende en blokkerende opdrachten werken met andere opdrachten

OPMERKING: De Motor.spin-opdrachten laten de linkermotor en de rechtermotor in tegengestelde richting draaien.De slaaptaak laat de motoren 3 seconden op die manier draaien voordat de linker- en rechtermotor beide worden gestopt door de Motor.stop-commando's. Dan draaien de linkermotor en de rechtermotor 270 graden naar voren en remmen voordat ze verder gaan omdat het commando van de rechtermotor blokkeert. Vervolgens draaien de linkermotor en de rechtermotor volledig achteruit tot 270 graden en remmen ze voordat het programma wordt beëindigd omdat het commando van de rechtermotor blokkeert.