Olaylar#

giriiş#

Olaylar, bir fonksiyonu eşzamansız olarak başlatmanıza olanak tanır. Bir olay yayınlandığında, olayın geri çağırma fonksiyonu kendi görevinde (iş parçacığında) başlatılır, böylece ana kodunuz aynı anda çalışmaya devam edebilir.

Önemli: event nesnesi bir geri çağırma işlevi saklar. Aynı olay nesnesiyle başka bir işlev kaydederseniz, önceki geri çağırma işlevinin yerini alır.

Tek bir tetikleyiciyle birden fazla şeyin gerçekleşmesini istiyorsanız, şunlardan birini yapın:

  • Tek bir geri çağırma fonksiyonundan birden fazla yardımcı fonksiyonu çağırın veya

  • Birden fazla olay nesnesi kullanın ve her birini yayınlayın.

  • Görevleri bağımsız olarak çalıştırmak için ayrı iş parçacıkları kullanın.

Bir etkinlik oluşturmak ve ardından kullanmak için şu adımları sırasıyla izleyin:

  1. event ile olayı oluşturun.

  2. Olayın geri çağırma işlevini olay adını kullanarak ayarlayın (ör: myEvent(myCallback);).

  3. Broadcast an event:

    • broadcast — Bir olay nesnesinde kayıtlı tüm işlevlerin paralel olarak çalışmasını tetikler.

    • broadcastAndWait — Bir olay nesnesinde kayıtlı tüm işlevleri tetikler ve devam etmeden önce bunların bitmesini bekler.

Sınıf Oluşturucuları#

1 — Geri çağrı fonksiyonu olmadan event nesnesi oluşturur.

event();

2 — Geri çağrı fonksiyonuna sahip event nesnesi oluşturur.

event( void (* callback)(void) );

3 — Geri çağrı fonksiyonuna sahip başka bir olaydan event nesnesi oluşturur.

event( 
  event v, 
  void (* callback)(void) );

4 — Bir argüman kabul eden bir geri çağırma fonksiyonuna sahip event nesnesi oluşturur.

event( void (* callback)(void *), void *arg );

5 — Bir argüman kabul eden bir geri çağırma fonksiyonuna sahip başka bir olaydan event nesnesi oluşturur.

event( event v, void (* callback)(void *), void *arg );

Sınıf Yıkıcısı#

event nesnesini yok eder ve ilişkili kaynakları serbest bırakır.

~event();

Parametreler#

Parametre

Tip

Tanım

callback

void (*)(void)

Olayın yayınlanması sırasında yürütülecek şekilde önceden tanımlanmış bir fonksiyon.

v

event

Kopyalanacak mevcut bir olay nesnesi.

callback

void (*)(void *)

Bir void işaretçi argümanı alan ve olay yayınlandığında çalışan bir fonksiyon.

arg

void *

Geri çağrı fonksiyonuna iletilecek verilere işaret eden bir gösterici.

Notlar#

  • event nesnesi bir geri çağırma işlevi saklar. Aynı olay nesnesiyle başka bir işlev kaydederseniz, önceki geri çağırma işlevinin yerini alır.

  • Tek bir tetikleyiciyle birden fazla şeyin gerçekleşmesini istiyorsanız, şunlardan birini yapın:

    • Tek bir geri çağırma fonksiyonundan birden fazla yardımcı fonksiyonu çağırın veya

    • Birden fazla olay nesnesi kullanın ve her birini yayınlayın.

    • Görevleri bağımsız olarak çalıştırmak için ayrı iş parçacıkları kullanın.

Örnek#

// Create a callback function
void onMyEvent() {
  Brain.Screen.print("Callback function executed!");
}

int main() {
  // Create an event called myEvent and set onMyEvent
  // as the callback function.
  event myEvent(onMyEvent);
}

Üye Fonksiyonları#

event sınıfı aşağıdaki üye fonksiyonlarını içerir:

  • operator — Olay için bir geri çağırma fonksiyonu ayarlar.

  • broadcast — Olayın geri çağırma fonksiyonunun paralel olarak çalışmasını tetikler.

  • broadcastAndWait — Olayın geri çağırma fonksiyonunu tetikler ve tamamlanmasını bekler.

Herhangi bir event üye fonksiyonunu çağırmadan önce, aşağıda gösterildiği gibi bir event örneği oluşturulmalıdır:

/* This constructor is required when using VS Code.
Event configuration can be created with or without
a callback function as shown in the examples above. */

// Create an event without a callback
event myEvent;

// Or create an event with a callback
event myEvent(onMyEvent);

operator#

Olay için fonksiyon çağrı operatörünü kullanarak bir geri çağırma fonksiyonu ayarlar.

Available Functions
void operator()( void (* callback)() );

Parameters

Parametre

Tip

Tanım

callback

void (*)(void)

Olay yayınlandığında otomatik olarak çağrılan, önceden tanımlanmış bir geri çağırma fonksiyonu. Fonksiyon, gerekli geri çağırma imzasıyla eşleşmelidir. Daha fazla bilgi için Geri Çağırma Fonksiyonları bölümüne bakın.

Return Values

Bu fonksiyon bir değer döndürmez.

Notes
  • Bir geri çağırma işlevi yeniden ayarlandığında, önceki geri çağırma işlevinin yerini alır.

  • Geri çağrı fonksiyonu parametre içermemeli ve void döndürmelidir.

Examples
void drawSquare() {
  Brain.Screen.clearScreen();
  Brain.Screen.drawRectangle(40, 40, 120, 120);
}

void drawCircle() {
  Brain.Screen.clearScreen();
  Brain.Screen.drawCircle(100, 100, 60);
}

int main() {
  // Create the event drawEvent.
  event drawEvent;

  Brain.Screen.print("Drawing a square...");

  // Set the event to drawSquare.
  drawEvent(drawSquare);

  wait(1, seconds);

  // Trigger the event.
  drawEvent.broadcast();

  wait(1, seconds);

  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.print("Drawing a circle...");

  // Replace drawSquare with drawCircle.
  drawEvent(drawCircle);

  wait(1, seconds);

  // Trigger the event a second time.
  drawEvent.broadcast();
}

broadcast#

broadcast , olayın geri çağrısını başlatır ve hemen devam eder.

Member Functions
void broadcast();

Parameters

Bu fonksiyon herhangi bir parametre almaz.

Return Values

Bu fonksiyon bir değer döndürmez.

Examples
// Create a callback function.
void onMyEvent() {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.print("Event fired!");
}

int main() {
  Brain.Screen.print("Broadcasting in 2 seconds...");

  // Create an event called myEvent and set onMyEvent
  // as the callback function.
  event myEvent(onMyEvent);

  wait(2, seconds);

  // Trigger the event.
  myEvent.broadcast();
}

broadcastAndWait#

Geri çağırma işlevini başlatır ve bitene kadar (veya zaman aşımına uğrayana kadar) bekler.

Available Functions
void broadcastAndWait( int32_t timeout = 60000 );

Parameters

Parametre

Tip

Tanım

timeout

int32_t

Kodun tekrar çalışmaya başlamadan önce beklenecek milisaniye miktarı (varsayılan değer 60000’dir).

Return Values

Bu fonksiyon bir değer döndürmez.

Notes
  • Bunu yalnızca sonlanan geri çağırma fonksiyonlarıyla kullanın (sonsuz döngüler olmasın).

  • Bu, geri çağırma işlemi tamamlanana veya zaman aşımına uğrayana kadar yürütmeyi engelleyen bir bekleme fonksiyonudur.

Examples
void startDriving() {
  Drivetrain.drive(forward);
  wait(2, seconds);
}

int main() {
  Brain.Screen.print("Starting drive...");

  event driveEvent(startDriving);

  // Give the event time to be set.
  wait(0.25, seconds);

  // Run the event and wait until it finishes.
  driveEvent.broadcastAndWait();

  // Stop driving after 2 seconds.
  Drivetrain.stop();
  Brain.Screen.clearScreen();
  Brain.Screen.print("Drive complete!");
}