Bagaimana cara kerja pendengar acara?

125

Dalam salah satu kuliah saya hari ini tentang Unity, kami membahas memperbarui posisi pemain kami dengan memeriksa setiap frame jika pengguna memiliki tombol yang ditekan. Seseorang berkata ini tidak efisien dan kita harus menggunakan pendengar acara sebagai gantinya.

Pertanyaan saya adalah, terlepas dari bahasa pemrograman, atau situasi di mana ia diterapkan, bagaimana cara kerja pendengar acara?

Intuisi saya akan mengasumsikan bahwa pendengar acara terus-menerus memeriksa apakah acara telah dipecat, artinya, dalam skenario saya, itu tidak akan berbeda dengan memeriksa setiap frame jika acara telah dipecat.

Berdasarkan diskusi di kelas, tampaknya pendengar acara bekerja dengan cara yang berbeda.

Bagaimana cara kerja pendengar acara?

Gary Holiday
sumber
34
Pendengar acara tidak memeriksa sama sekali. Itu dipanggil ketika acara itu "mendengarkan" api.
Robert Harvey
13
Ya, tetapi bagaimana "mendengarkan", bukankah itu akan terus-menerus memeriksa?
Gary Holiday
28
Nggak. "Event Listener" mungkin adalah pilihan kata yang buruk; sebenarnya tidak "mendengarkan" sama sekali. Semua pendengar acara tidak menunggu untuk dipanggil oleh acara ketika itu menyala, seperti metode lainnya. Sampai dipanggil dengan cara ini, ia tidak melakukan apa-apa.
Robert Harvey
28
Setiap kali Anda memeriksa untuk melihat apakah tombol ditekan, Anda perlu siklus jam. Event handler (pendengar) hanya dikenakan biaya ketika tombol benar-benar ditekan.
Robert Harvey
45
@RobertHarvey - belum tentu, karena "pendengar" masih membutuhkan jajak pendapat konstan di tingkat yang lebih rendah. Anda cukup mendorong kerumitan dari lapisan kode Anda sendiri lebih dalam ke gangguan perangkat keras atau apa pun. Dan ya, ini biasanya akan lebih efisien, tetapi bukan karena mendengarkan lebih baik daripada pemungutan suara, itu karena pemungutan suara pada tingkat yang lebih rendah lebih efisien daripada pemungutan suara dari C # dan 15 lapisan abstraksi antara Anda dan perangkat keras.
Davor Ždralo

Jawaban:

140

Berbeda dengan contoh polling yang Anda berikan (di mana tombol diperiksa setiap frame), pendengar acara tidak memeriksa apakah tombol ditekan sama sekali. Sebaliknya, itu dipanggil ketika tombol ditekan.

Mungkin istilah "pendengar acara" melempar Anda. Istilah ini menunjukkan bahwa "pendengar" secara aktif melakukan sesuatu untuk mendengarkan, padahal sebenarnya, itu tidak melakukan apa-apa sama sekali. "Pendengar" hanyalah fungsi atau metode yang berlangganan acara tersebut. Ketika acara menyala, metode pendengar ("event handler") dipanggil.

Manfaat dari pola acara adalah tidak ada biaya sampai tombol benar-benar ditekan. Acara dapat ditangani dengan cara ini tanpa dipantau karena berasal dari apa yang kita sebut "interupsi perangkat keras," yang secara singkat mendahului kode yang sedang berjalan untuk memecat acara.

Beberapa UI dan kerangka kerja permainan menggunakan sesuatu yang disebut "loop pesan," yang mengantri acara untuk dieksekusi di beberapa periode waktu kemudian (biasanya singkat), tetapi Anda masih memerlukan perangkat keras interupsi untuk memasukkan peristiwa itu ke dalam loop pesan di tempat pertama.

Robert Harvey
sumber
54
Mungkin perlu disebutkan alasan mengapa tidak ada biaya sampai tombol ditekan adalah karena tombol "istimewa", komputer mengalami gangguan dan fasilitas khusus lainnya yang dapat digunakan OS, yang disarikan ke dalam aplikasi userspace.
whatsisname
46
@whatsisname sementara itu adalah kasus yang sangat jauh di bawah tenda, dalam praktiknya mesin game kemungkinan tidak bekerja dengan interupsi, tetapi pada kenyataannya masih mengumpulkan sumber acara dalam satu lingkaran. Hanya saja polling ini terpusat dan dioptimalkan, sehingga menambah acara pendengar tidak menambahkan tambahan polling dan kompleksitas.
gntskn
7
@PieterGeerkens Saya kira gntskn berarti bahwa sebagai bagian dari putaran mesin game, ada langkah yang memeriksa setiap peristiwa luar biasa. Acara akan diproses selama setiap loop bersama dengan semua aktivitas satu kali per loop lainnya. Tidak akan ada loop terpisah untuk memeriksa acara.
Joshua Taylor
2
@ Suara: Semua alasan lagi untuk tidak masuk ke tingkat detail ini dalam posting ini.
Robert Harvey
2
@ Voo: Saya berbicara tentang tombol seperti tombol fisik pada tombol keyboard dan mouse.
whatsisname
52

Seorang pendengar acara yang mirip dengan berlangganan buletin email (Anda mendaftarkan diri Anda untuk menerima pembaruan, yang pengirimannya kemudian diprakarsai oleh pengirim), daripada menyegarkan halaman web tanpa henti (di mana Andalah yang memulai transfer informasi).

Sistem acara diimplementasikan menggunakan objek acara, yang mengelola daftar pelanggan. Objek yang tertarik (disebut pelanggan , pendengar , delegasi , dll.) Dapat berlangganan sendiri untuk diberitahu tentang suatu peristiwa dengan memanggil metode yang berlangganan sendiri ke acara tersebut, yang menyebabkan acara menambahkannya ke daftar. Setiap kali acara dipecat (terminologi juga dapat mencakup: dipanggil , dipicu , dipanggil , dijalankan , dll.), Ia memanggil metode yang tepat pada setiap pelanggan, untuk memberi tahu mereka tentang peristiwa tersebut, menyampaikan informasi kontekstual apa pun yang perlu mereka pahami apa yang terjadi.

Alexander
sumber
38

Jawaban singkat dan tidak memuaskan adalah bahwa aplikasi menerima sinyal (peristiwa) dan bahwa rutin hanya dipanggil pada saat itu.

Penjelasan yang lebih panjang sedikit lebih terlibat.

Dari mana datangnya acara klien?

Setiap aplikasi modern memiliki "lingkaran acara" dalam, biasanya semi-tersembunyi yang mengirimkan peristiwa ke komponen yang benar yang harus menerimanya. Misalnya, acara "klik" dikirim ke tombol yang permukaannya terlihat pada koordinat mouse saat ini. Ini adalah level paling sederhana. Pada kenyataannya OS melakukan banyak pengiriman ini karena beberapa peristiwa dan beberapa komponen akan menerima pesan secara langsung.

Dari mana datangnya acara aplikasi?

Sistem operasi mengirimkan peristiwa saat terjadi. Mereka melakukannya secara reaktif dengan diberi tahu oleh pengemudi mereka sendiri.

Bagaimana driver menghasilkan acara?

Saya bukan ahli, tetapi pasti beberapa menggunakan CPU menyela: perangkat keras yang mereka kontrol menaikkan pin pada CPU ketika data baru tersedia; CPU melepaskan driver yang menangani data yang masuk yang akhirnya menghasilkan (antrian) acara untuk dikirim dan kemudian mengembalikan kontrol kembali ke OS.

Jadi seperti yang Anda lihat, aplikasi Anda tidak benar-benar berjalan sepanjang waktu. Ini adalah sekelompok prosedur yang dipecat oleh OS (agak) sebagai peristiwa terjadi, tetapi tidak melakukan apa pun sepanjang waktu.


ada pengecualian penting misalnya game untuk sekali yang mungkin melakukan hal-hal berbeda

Sklivvz
sumber
10
Jawaban ini menjelaskan mengapa tidak ada pemungutan suara yang terlibat untuk acara klik mouse di browser. Perangkat keras menghasilkan interrupt => driver menyelesaikannya ke OS event => browser menyelesaikannya ke DOM event => JS engine menjalankan pendengar untuk peristiwa itu.
Tibos
@ Tibo afaict juga berlaku untuk acara keyboard, acara timer, acara cat, dll.
Sklivvz
19

Terminologi

  • acara : Suatu jenis hal yang bisa terjadi.

  • event firing : Kejadian spesifik dari suatu acara; sebuah peristiwa terjadi.

  • pendengar acara : Sesuatu yang terlihat untuk pemecatan acara.

  • pengendali kejadian : Sesuatu yang terjadi ketika pendengar acara mendeteksi peristiwa yang terjadi.

  • pelanggan acara : Sebuah respons yang seharusnya dipanggil oleh pawang acara.

Definisi-definisi ini tidak tergantung pada implementasi, sehingga mereka dapat diimplementasikan dengan cara yang berbeda.

Beberapa istilah ini umumnya disalahartikan sebagai sinonim karena sering kali tidak ada kebutuhan bagi pengguna untuk membedakannya.

Skenario umum

  1. Acara pemrograman logika.

    • The event adalah ketika beberapa metode dipanggil.

    • Suatu peristiwa penembakan adalah panggilan khusus untuk metode itu.

    • The pendengar acara adalah hook dalam metode peristiwa yang disebut pada setiap acara penembakan yang memanggil event handler.

    • The event handler panggilan koleksi pelanggan acara.

    • The event pelanggan (s) melakukan tindakan apa pun (s) sistem berarti terjadi dalam menanggapi terjadinya acara.

  2. Peristiwa eksternal.

    • The event adalah terjadinya eksternal yang dapat disimpulkan dari diamati.

    • Suatu peristiwa penembakan adalah ketika peristiwa eksternal itu dapat dikenali telah terjadi.

    • The pendengar acara entah bagaimana mendeteksi acara pemecatan, sering dengan polling yang diamati (s), maka panggilan event handler pada mendeteksi sebuah acara menembak.

    • The event handler panggilan koleksi pelanggan acara.

    • The event pelanggan (s) melakukan tindakan apa pun (s) sistem berarti terjadi dalam menanggapi terjadinya acara.

Polling vs. memasukkan kait ke dalam mekanisme pembakaran acara

Maksud yang dibuat oleh orang lain adalah bahwa pemungutan suara seringkali tidak perlu. Ini karena pendengar acara dapat diimplementasikan dengan membuat acara pembakaran secara otomatis memanggil event handler, yang sering kali merupakan cara paling efisien untuk mengimplementasikan hal-hal ketika peristiwa tersebut merupakan kejadian tingkat sistem.

Dengan analogi, Anda tidak perlu memeriksa kotak surat Anda setiap hari jika pekerja pos mengetuk pintu Anda dan menyerahkannya langsung kepada Anda.

Namun, pendengar acara juga dapat bekerja dengan polling. Polling tidak perlu harus memeriksa nilai tertentu atau dapat diamati lainnya; itu bisa lebih kompleks. Tetapi, secara keseluruhan, titik pemungutan suara adalah untuk menyimpulkan ketika beberapa peristiwa telah terjadi sehingga dapat ditanggapi.

Dengan analogi, Anda harus memeriksa kotak surat Anda setiap hari ketika petugas pos hanya memasukkan surat ke dalamnya. Anda tidak perlu melakukan pekerjaan pemungutan suara ini jika Anda bisa menginstruksikan pekerja pos untuk mengetuk pintu Anda, tetapi itu seringkali tidak mungkin.

Logika peristiwa rantai

Dalam banyak bahasa pemrograman, Anda dapat menulis acara yang baru dipanggil ketika tombol pada keyboard ditekan atau pada waktu tertentu. Meskipun ini adalah peristiwa eksternal, Anda tidak perlu memilihnya. Mengapa?

Itu karena sistem operasi untuk Anda. Misalnya, Windows memeriksa hal-hal seperti perubahan kondisi keyboard, dan jika terdeteksi, itu akan memanggil pelanggan acara. Jadi, ketika Anda berlangganan acara pers keyboard, Anda sebenarnya berlangganan acara yang juga merupakan pelanggan acara yang melakukan polling.

Dengan analogi, katakan bahwa Anda tinggal di kompleks apartemen dan seorang pekerja pos mengirim surat ke daerah penerimaan surat bersama. Kemudian, pekerja seperti sistem operasi dapat memeriksa surat itu untuk semua orang, mengirimkan surat ke apartemen orang-orang yang menerima sesuatu. Ini membuat semua orang kesulitan untuk melakukan polling di area penerimaan surat.


Intuisi saya akan mengasumsikan bahwa pendengar acara terus-menerus memeriksa apakah acara telah dipecat, artinya, dalam skenario saya, itu tidak akan berbeda dengan memeriksa setiap frame jika acara telah dipecat.

Berdasarkan diskusi di kelas, tampaknya pendengar acara bekerja dengan cara yang berbeda.

Bagaimana cara kerja pendengar acara?

Seperti yang telah Anda duga, suatu acara dapat bekerja melalui pemungutan suara. Dan jika suatu peristiwa entah bagaimana terkait dengan kejadian eksternal, misalnya tombol keyboard ditekan, maka pemungutan suara memang harus terjadi di beberapa titik.

Benar juga bahwa acara tidak perlu melibatkan pemilihan. Misalnya, jika acara adalah ketika sebuah tombol ditekan, maka pendengar acara tombol tersebut adalah metode yang dapat dipanggil kerangka kerja GUI ketika menentukan bahwa klik-mouse menekan tombol. Dalam hal ini, polling masih harus terjadi agar klik mouse terdeteksi, tetapi mouse-listener adalah elemen yang lebih pasif yang terhubung ke mekanisme polling primitif melalui event-chaining.

Pembaruan: Pada jajak pendapat perangkat keras tingkat rendah

Ternyata perangkat USB dan protokol komunikasi modern lainnya memiliki seperangkat protokol yang mirip jaringan untuk interaksi, memungkinkan perangkat I / O termasuk keyboard dan mouse untuk terlibat dalam topologi ad hoc .

Menariknya, " interupsi " adalah hal yang cukup penting, sinkron, sehingga mereka tidak menangani topologi jaringan ad hoc . Untuk memperbaikinya, " interupsi " telah digeneralisasi menjadi paket prioritas tinggi asinkron yang disebut " transaksi interupsi " (dalam konteks USB) atau " interupsi sinyal-pesan " (dalam konteks PCI). Protokol ini dijelaskan dalam spesifikasi USB:

masukkan deskripsi gambar di sini

- " Gambar 8-31. Mesin Negara Host Transaksi Massal / Kontrol / Interupsi OUT " dalam "Spesifikasi Universal Serial Bus, Revisi 2.0" , dicetak-halaman-222; PDF-halaman-250 (2000-04-27)

Intinya tampaknya bahwa perangkat I / O dan komponen komunikasi (seperti hub USB) pada dasarnya bertindak seperti perangkat jaringan. Jadi, mereka mengirim pesan, yang membutuhkan polling port mereka dan semacamnya. Ini mengurangi kebutuhan akan jalur perangkat keras khusus.

Sistem operasi seperti Windows tampaknya menangani proses pemungutan suara itu sendiri, misalnya seperti yang dijelaskan dalam dokumentasi MSDN untuk USB_ENDPOINT_DESCRIPTOR's yang menggambarkan bagaimana mengontrol seberapa sering Windows memilih pengontrol host USB untuk pesan interupsi / isokron:

The bIntervalnilai berisi interval polling untuk endpoint interupsi dan isochronous. Untuk jenis titik akhir lainnya, nilai ini harus diabaikan. Nilai ini mencerminkan konfigurasi perangkat dalam firmware. Driver tidak dapat mengubahnya.

Interval pemungutan suara, bersama-sama dengan kecepatan perangkat dan jenis pengontrol host, menentukan frekuensi pengemudi harus memulai interupsi atau transfer isochronous. Nilai dalam bIntervaltidak mewakili jumlah waktu yang tetap. Ini adalah nilai relatif, dan frekuensi polling yang sebenarnya juga akan tergantung pada apakah perangkat dan pengontrol host USB beroperasi pada kecepatan rendah, penuh atau tinggi.

- "USB_ENDPOINT_DESCRIPTOR struktur" , Pusat Pengembangan Perangkat Keras, Microsoft

Protokol koneksi monitor yang lebih baru seperti DisplayPort tampaknya melakukan hal yang sama:

Multi-Stream Transport (MST)

  • MST (Multi-Stream Transport) ditambahkan di DisplayPort Ver.1.2

    • Hanya SST (Single-Stream Transport) yang tersedia di Ver.1.1a
  • MST mengangkut beberapa aliran A / V melalui satu konektor

    • Hingga 63 aliran; bukan “Stream per Lane”

      • Tidak ada sinkronisitas yang diasumsikan di antara aliran yang diangkut; satu aliran mungkin dalam periode pengosongan sementara yang lain tidak
    • Transportasi berorientasi koneksi

      • Path dari sumber stream ke target stream sink yang dibuat melalui Transaksi Pesan melalui AUX CHʼs sebelum dimulainya transmisi stream

      • Penambahan / penghapusan aliran tanpa mempengaruhi aliran yang tersisa

masukkan deskripsi gambar di sini

-Slide # 14 dari "Ikhtisar DisplayPortTM Ver.1.2" (2010-12-06)

Abstraksi ini memungkinkan untuk beberapa fitur yang rapi, seperti menjalankan 3 monitor dari satu koneksi:

DisplayPort Multi-Stream Transport juga memungkinkan menghubungkan tiga perangkat atau lebih secara bersamaan tetapi sebaliknya, konfigurasi yang kurang berorientasi "konsumen": secara simultan menggerakkan banyak tampilan dari satu port output.

- "DisplayPort" , Wikipedia

Secara konseptual, titik untuk mengambil dari ini adalah bahwa mekanisme pemungutan suara memungkinkan untuk komunikasi serial yang lebih umum, yang luar biasa ketika Anda menginginkan fungsionalitas yang lebih umum. Jadi, perangkat keras dan OS melakukan banyak polling untuk sistem logis. Kemudian, konsumen yang berlangganan acara dapat menikmati detail yang ditangani untuk mereka oleh sistem tingkat bawah, tanpa harus menulis protokol pemungutan suara / penyampaian pesan mereka sendiri.

Pada akhirnya, peristiwa-peristiwa seperti penekanan tombol tampaknya melalui serangkaian peristiwa yang agak menarik sebelum sampai ke mekanisme penembakan-peristiwa yang penting di tingkat perangkat lunak.

Nat
sumber
Mengenai paragraf terakhir Anda, umumnya tidak ada polling yang dilakukan pada level rendah, sistem operasi bereaksi terhadap gangguan perangkat keras yang dipicu oleh perangkat periferal. Komputer biasanya memiliki banyak perangkat yang terhubung (mouse, keyboard, drive disk, kartu jaringan) dan polling semuanya akan sangat tidak efisien.
Barmar
Namun, analogi Anda dengan pengiriman surat persis bagaimana saya akan menjelaskan aktivitas tingkat yang lebih tinggi.
Barmar
1
@Barmar Ya tahu, ketika perangkat pindah ke koneksi USB, ada banyak pembicaraan tentang bagaimana mereka beralih dari secara langsung menghasilkan interupsi (seperti keyboard PS / 2 tidak) untuk memerlukan polling (seperti keyboard USB), dan beberapa sumber mengklaim bahwa polling dilakukan oleh CPU. Tapi, sumber lain mengklaim bahwa itu dilakukan pada pengontrol khusus yang mengubah polling menjadi interupsi untuk CPU.
Nat
@Barmar Apakah Anda tahu yang mana yang benar? Saya mungkin telah melihat lebih banyak sumber mengklaim bahwa CPU melakukan polling daripada yang lain, tetapi controller khusus untuk itu tampaknya lebih masuk akal. Maksud saya, saya pikir Arduino dan perangkat tertanam lainnya cenderung membutuhkan CPU untuk melakukan polling, tetapi saya tidak tahu tentang perangkat tipe x86.
Nat
1
Jika ada yang bisa mengkonfirmasi sehingga saya dapat memperbarui jawaban ini, saya pikir perangkat I / O modern, misalnya yang terhubung dengan USB, langsung menulis ke memori , melewati kontrol CPU (yang merupakan alasan mengapa mereka cepat / efisien dan keamanan bahaya terkadang ). Kemudian, diperlukan OS modern untuk memilah memori untuk memeriksa pesan baru.
Nat
8

Tarik vs Dorong

Ada dua strategi utama untuk memeriksa apakah suatu peristiwa terjadi, atau keadaan tertentu tercapai. Misalnya, bayangkan menunggu pengiriman penting:

  • Tarik : setiap 10 menit, pergi ke kotak surat Anda dan periksa apakah sudah terkirim,
  • Push : beri tahu petugas pengiriman untuk menghubungi Anda ketika mereka melakukan pengiriman.

The tarik Pendekatan (juga disebut polling) adalah sederhana: Anda dapat menerapkannya tanpa fitur khusus. Di sisi lain, ini seringkali kurang efisien karena Anda berisiko melakukan pemeriksaan tambahan tanpa ada yang ditunjukkan kepada mereka.

Di sisi lain, pendekatan push umumnya lebih efisien: kode Anda hanya berjalan ketika ada sesuatu yang harus dilakukan. Di sisi lain, diperlukan mekanisme untuk Anda mendaftarkan pendengar / pengamat / panggilan balik 1 .

1 Sayangnya, tukang pos saya kurang memiliki mekanisme seperti itu.

Matthieu M.
sumber
1

Tentang persatuan secara spesifik - tidak ada cara lain untuk memeriksa input pemain selain polling setiap frame. Untuk membuat pendengar acara, Anda masih membutuhkan objek seperti "sistem acara" atau "manajer acara" untuk melakukan polling, sehingga hanya akan mendorong masalah ke kelas yang berbeda.

Memang, begitu Anda memiliki seorang manajer acara, Anda hanya memiliki satu kelas polling input setiap frame, tetapi ini tidak memberikan keuntungan kinerja yang jelas, karena sekarang kelas ini harus beralih ke pendengar dan memanggil mereka, yang, tergantung pada permainan Anda desain (seperti dalam, berapa banyak pendengar di sana dan seberapa sering pemain menggunakan input), mungkin sebenarnya lebih mahal.

Terlepas dari semua ini, ingatlah kaidah emas - pengoptimalan prematur adalah akar dari semua kejahatan , yang khususnya benar dalam video game, di mana sering kali proses rendering setiap frame begitu mahal, sehingga optimisasi skrip kecil seperti ini sama sekali tidak signifikan

Tidak tahu
sumber
Saya tidak akan melihat loop peristiwa pusat sebagai pengoptimalan tetapi sebagai penulisan kode yang lebih mudah dibaca dan dapat dipahami yang bertentangan dengan polling yang tersebar di seluruh basis kode. Ini juga memungkinkan acara dan acara "sintetis" tidak datang dari pemungutan suara mesin game.
BlackJack
@ BlackJack Saya setuju dan saya biasanya mengkodekannya sendiri, tetapi OP bertanya tentang kinerja. Btw, Unity secara mengejutkan memiliki banyak keputusan desain kode yang meragukan seperti ini, seperti memiliki fungsi statis hampir di mana-mana.
tahu
1

Kecuali jika Anda memiliki beberapa dukungan dalam OS / Kerangka Kerja Anda yang menangani acara-acara seperti tombol push atau timer overflow atau kedatangan pesan - Anda harus tetap menerapkan derai Listener Event ini menggunakan polling (di suatu tempat di bawahnya).

Tetapi jangan berpaling dari pola desain ini hanya karena Anda tidak memiliki manfaat kinerja di sana segera. Berikut adalah alasan mengapa Anda harus menggunakannya terlepas dari apakah Anda memiliki dukungan yang mendasari untuk penanganan acara atau tidak.

  1. Kode terlihat lebih bersih dan lebih terisolasi (jika diterapkan dengan benar, tentu saja)
  2. Kode yang didasarkan pada pengendali acara lebih baik berubah (karena Anda biasanya memodifikasi hanya beberapa penangan acara)
  3. Jika Anda berpindah ke platform dengan dukungan acara yang mendasari - Anda dapat menggunakan kembali penangan acara yang ada dan hanya menyingkirkan kode polling.

Kesimpulan - Anda beruntung untuk berpartisipasi dalam diskusi dan belajar satu alternatif jajak pendapat. Cari peluang untuk menerapkan konsep ini dalam praktiknya dan Anda akan menghargai betapa anggun kode ini.

OpalApps
sumber
1

Sebagian besar loop acara dibangun di atas beberapa primitif pemungutan suara polling yang disediakan oleh sistem operasi. Di Linux, primitif itu sering kali adalah poll(2) system call (tapi bisa jadi yang lama select). Dalam aplikasi GUI, server tampilan (mis. Xorg , atau Wayland ) berkomunikasi (melalui soket (7) atau pipa (7) ) dengan aplikasi Anda. Baca juga tentang Protokol dan Arsitektur Sistem X Window .

Primitif pemungutan suara seperti itu efisien; kernel dalam praktiknya akan membangunkan proses Anda ketika beberapa input dilakukan (dan beberapa interupsi ditangani).

Secara konkret, pustaka toolkit widget Anda berkomunikasi dengan server tampilan Anda, menunggu pesan, dan mengirimkan pesan-pesan ini ke widget Anda. Pustaka Toolkit seperti Qt atau GTK cukup rumit (jutaan baris kode sumber). Keyboard dan mouse Anda hanya ditangani oleh proses server display (yang menerjemahkan input tersebut ke pesan acara yang dikirim ke aplikasi klien).

(Saya menyederhanakan; pada kenyataannya hal-hal jauh lebih kompleks)

Basile Starynkevitch
sumber
1

Dalam sistem berbasis polling murni, subsistem yang mungkin ingin tahu ketika beberapa tindakan tertentu terjadi perlu menjalankan beberapa kode setiap kali tindakan itu mungkin terjadi. Jika ada banyak subsistem yang masing-masing akan perlu bereaksi dalam 10ms dari beberapa peristiwa yang tidak-harus-unik terjadi, mereka semua perlu memeriksa setidaknya 100 kali / detik apakah acara mereka telah terjadi. Jika subsistem tersebut berada di utas berbeda (atau lebih buruk, proses) proses, yang akan membutuhkan peralihan di setiap utas tersebut atau proses 100x / detik.

Jika banyak hal yang akan diperhatikan oleh aplikasi agak mirip, mungkin lebih efisien untuk memiliki subsistem pemantauan terpusat - mungkin didorong oleh tabel - yang dapat mengawasi banyak hal dan mengamati apakah ada yang berubah. Jika ada 32 switch, misalnya, sebuah platform mungkin memiliki fungsi untuk membaca semua 32 switch sekaligus menjadi sebuah kata, memungkinkan kode monitor untuk memeriksa apakah ada switch yang berubah di antara polling dan - jika tidak - tidak khawatir tentang kode apa yang mungkin menarik bagi mereka.

Jika ada banyak subsistem yang ingin pemberitahuan ketika sesuatu berubah, memiliki subsistem pemantauan khusus memberi tahu subsistem lain ketika peristiwa terjadi yang mereka minati mungkin lebih efisien daripada meminta setiap subsistem menyurvei acara mereka sendiri. Menyiapkan subsistem pemantauan khusus dalam kasus-kasus di mana tidak ada yang tertarik pada peristiwa apa pun, bagaimanapun, akan mewakili pemborosan sumber daya murni. Jika hanya ada beberapa subsistem yang tertarik pada acara, biaya untuk mereka menonton acara yang mereka minati mungkin kurang dari biaya mendirikan subsistem pemantauan tujuan khusus, tetapi titik impas titik akan bervariasi signifikan antara platform yang berbeda.

supercat
sumber
0

Pendengar acara seperti telinga yang menunggu pesan. Ketika acara tersebut terjadi, subrutin yang dipilih sebagai pendengar acara bekerja menggunakan argumen acara.

Selalu ada dua data penting: saat di mana peristiwa itu terjadi dan objek di mana peristiwa ini terjadi. Argumen lain adalah lebih banyak data tentang apa yang terjadi.

Pendengar acara menentukan reaksi terhadap apa yang terjadi.

Rafael Marazuela
sumber
0

Seorang Pendengar Acara mengikuti Pola Publikasikan / Berlangganan (sebagai pelanggan)

Dalam bentuknya yang paling sederhana, objek penerbitan menyimpan daftar instruksi pelanggan yang harus dilakukan ketika sesuatu perlu dipublikasikan.

Ini akan memiliki semacam subscribe(x)metode, di mana x tergantung pada bagaimana event handler dirancang untuk menangani acara tersebut. Ketika berlangganan (x) dipanggil, x ditambahkan ke daftar penerbit dari instruksi / referensi pelanggan.

Penerbit mungkin berisi semua, sebagian atau tidak ada logika untuk menangani acara tersebut. Ini mungkin hanya memerlukan referensi ke pelanggan untuk memberi tahu / mengubahnya dengan logika yang ditentukan ketika acara tersebut terjadi. Mungkin tidak mengandung logika dan membutuhkan objek pelanggan (metode / pendengar acara) yang dapat menangani acara tersebut. Kemungkinan besar mengandung campuran keduanya.

Ketika suatu peristiwa terjadi, penerbit akan mengulangi dan mengeksekusi logikanya untuk setiap item dalam daftar instruksi / referensi pelanggan.

Tidak peduli seberapa kompleks penampil acara, pada intinya ia mengikuti pola sederhana ini.

Contohnya

Untuk contoh pendengar acara, Anda memberikan metode / fungsi / instruksi / pendengar acara untuk berlangganan () metode pengendali acara. Pengatur kejadian menambahkan metode ke daftar panggilan balik pelanggannya. Ketika suatu peristiwa terjadi, pengendali peristiwa iterates atas daftar dan mengeksekusi setiap panggilan balik.

Sebagai contoh dunia nyata, ketika Anda berlangganan buletin di Stack Exchange, referensi ke profil Anda akan ditambahkan ke tabel database pelanggan. Ketika tiba waktunya untuk menerbitkan buletin, referensi akan digunakan untuk mengisi templat buletin dan akan dikirim ke email Anda. Dalam hal ini, x hanyalah referensi untuk Anda, dan penerbit memiliki seperangkat instruksi internal yang digunakan untuk semua pelanggan.

Dom
sumber