Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah mekanisme dipacu peristiwa bagi fungsi C++ dalam pengaturcaraan serentak?

Apakah mekanisme dipacu peristiwa bagi fungsi C++ dalam pengaturcaraan serentak?

PHPz
PHPzasal
2024-04-26 14:15:021149semak imbas

Mekanisme dipacu peristiwa dalam pengaturcaraan serentak bertindak balas kepada peristiwa luaran dengan melaksanakan fungsi panggil balik apabila peristiwa berlaku. Dalam C++, mekanisme dipacu peristiwa boleh dilaksanakan menggunakan penunjuk fungsi: penunjuk fungsi boleh mendaftarkan fungsi panggil balik untuk dilaksanakan apabila peristiwa berlaku. Ungkapan Lambda juga boleh melaksanakan panggilan balik acara, membenarkan penciptaan objek fungsi tanpa nama. Kes praktikal menggunakan penunjuk fungsi untuk melaksanakan peristiwa klik butang GUI, memanggil fungsi panggil balik dan mencetak mesej apabila peristiwa itu berlaku.

C++ 函数在并发编程中的事件驱动机制?

Mekanisme fungsi C++ dipacu peristiwa dalam pengaturcaraan serentak

Pengenalan

Pacuan peristiwa ialah paradigma pengaturcaraan serentak di mana urutan atau proses untuk melaksanakan operasi luaran tertentu. Dalam C++, mekanisme dipacu peristiwa biasanya dilaksanakan melalui penggunaan penunjuk fungsi atau ungkapan lambda.

Melaksanakan acara menggunakan penunjuk fungsi

Penunjuk fungsi ialah penunjuk kepada fungsi yang membolehkan anda menghantar fungsi sebagai parameter kepada fungsi lain. Dalam pengaturcaraan dipacu peristiwa, anda menggunakan penunjuk fungsi untuk mendaftarkan fungsi panggil balik yang akan dilaksanakan apabila peristiwa tertentu berlaku.

void RegisterEventCallback(const std::function<void()>& callback) {
  // 将 callback 添加到回调函数列表
}
RegisterEventCallback([]() {
  std::cout << "事件发生了!" << std::endl;
});

Dalam contoh ini, fungsi RegisterEventCallback menerima sebagai hujah penunjuk fungsi yang menunjuk kepada fungsi panggil balik yang dilaksanakan apabila peristiwa itu berlaku.

Gunakan ungkapan lambda untuk melaksanakan acara

Ekspresi lambda membolehkan anda mencipta objek fungsi tanpa nama tanpa mentakrifkan nama fungsi secara eksplisit. Ia boleh digunakan bersama-sama dengan penunjuk fungsi untuk melaksanakan panggilan balik acara.

RegisterEventCallback([] {
  std::cout << "事件发生了!" << std::endl;
});

Kes praktikal

Berikut ialah contoh mudah untuk melaksanakan aplikasi GUI dipacu peristiwa dalam C++ menggunakan penunjuk fungsi:

#include <iostream>
#include <vector>
#include <memory>

class Button {
public:
  using ButtonCallback = std::function<void(Button*)>;

  Button(const std::string& name)
    : name_(name) {}

  void Click() {
    for (const auto& callback : callbacks_) {
      callback(this);
    }
  }

  void AddClickCallback(const ButtonCallback& callback) {
    callbacks_.push_back(callback);
  }

private:
  std::string name_;
  std::vector<ButtonCallback> callbacks_;
};

class GUI {
public:
  GUI() {
    // 创建两个按钮
    buttons_.push_back(std::make_unique<Button>("Button 1"));
    buttons_.push_back(std::make_unique<Button>("Button 2"));
  }

  void Run() {
    // 注册按钮点击回调
    buttons_[0]->AddClickCallback([](Button* btn) {
      std::cout << "Button " << btn->GetName() << " clicked!" << std::endl;
    });
    buttons_[1]->AddClickCallback([](Button* btn) {
      std::cout << "Button " << btn->GetName() << " clicked!" << std::endl;
    });

    // 模拟按钮点击事件
    buttons_[0]->Click();
    buttons_[1]->Click();
  }

private:
  std::vector<std::unique_ptr<Button>> buttons_;
};

int main() {
  GUI gui;
  gui.Run();
  return 0;
}

Program ini mencipta GUI dengan dua butang. Apabila sebarang butang diklik, fungsi panggil balik yang dikaitkan dengan butang itu dipanggil dan mesej dicetak dalam konsol.

Atas ialah kandungan terperinci Apakah mekanisme dipacu peristiwa bagi fungsi C++ dalam pengaturcaraan serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn