Dalam seri artikel ini, kita telah mempelajari tentang bagaimana signals dan slots bekerja di Qt. Pada bagian sebelumnya, kita telah membahas tentang DirectConnection, QueuedConnection, dan EventLoopConnection. Pada bagian ini, kita akan mempelajari tentang BlockingQueuedConnection.
BlockingQueuedConnection
BlockingQueuedConnection adalah gabungan dari DirectConnection dan QueuedConnection. Seperti dengan DirectConnection, argumen dapat tinggal di stack sejak stack berada pada thread yang diblokir. Tidak perlu mengcopykan argumen. Seperti dengan QueuedConnection, sebuah event diposting ke loop event lainnya. Event tersebut juga memuat pointer ke QSemaphore. Thread yang menangani event akan melepaskan semaphore setelah slot telah dijalankan. Sementara itu, thread yang mengaktifkan signal akan mengakses semaphore untuk menunggu hingga event diproses.
Destruction of QMetaCallEvent
It is the destructor of QMetaCallEvent which will release the semaphore. This is good because the event will be deleted right after it is delivered (i.e., the slot has been called) but also when the event is not delivered (e.g., because the receiving object was deleted).
Dangers of BlockingQueuedConnection
Anda harus berhati-hati saat menggunakan BlockingQueuedConnection untuk menghindari deadlock. Jika Anda terhubung dua objek menggunakan BlockingQueuedConnection yang hidup di thread yang sama, Anda akan mengalami deadlock segera. Anda mengirimkan event ke thread lain dan kemudian menunggu hingga event diproses. Karena thread diblokir, event tidak pernah diproses dan thread akan diblokir selamanya. Qt mendeteksi hal ini secara runtime dan mencetak peringatan, tetapi tidak mencoba memperbaiki masalah untuk Anda.
Real Dangers
Dalam beberapa kasus, Anda harus berhati-hati agar Anda tidak mengalami deadlock lainnya. Anda harus tahu dari mana thread A ke thread B event akan diirimkan. Ketika Anda melakukan BlockingQueuedConnection dari thread A ke thread B, thread B tidak boleh menunggu hingga thread A, atau Anda akan memiliki deadlock lagi.
Dalam artikel ini, kita telah mempelajari tentang BlockingQueuedConnection dan bagaimana Anda harus berhati-hati saat menggunakan teknologi ini. Kita juga telah membahas tentang bahaya yang terkait dengan penggunaan BlockingQueuedConnection. Dengan demikian, harapan saya adalah bahwa artikel ini dapat membantu Anda memahami lebih baik tentang signals dan slots di Qt dan bagaimana Anda dapat membuat aplikasi yang lebih baik menggunakan teknologi ini.