【專題7:qt上位機詳解】 之 【1.信號與槽 - 原理(重點)】

一個默默耕耘的工程師…

各專題目錄
【專題1:工作兩年再學嵌入式】
【專題2:freertos系統詳解】
【專題3:從0到1寫嵌入式操作系統】
【專題4:直流無刷電機控制】
【專題5:從0到1寫bootloader、iap升級和產品量產】
【專題6:mcu硬件電路設計】
【專題7:qt上位機詳解】
【專題8:linux應用及qt移植】
【專題9:從linux內核借鑑寫代碼的思路】
【專題10:面向對象和事件驅動】
【專題11:從0到1開發儀表】
【專題12:常用複雜模塊從0到1】
【專題13:讀書筆記】

1.信號與槽

  信號函數:調用信號函數就是給外界發信號,只管發送,不需要知道誰來接收或有多少個人來接收。
  槽函數:一個普遍的函數,不需要要管信號是誰發過來的。通過QObject來綁定。
  一個信號可以連接多個槽,而一個槽也可以監聽多個信號。

2.信號槽的原理

  信號函數只需要聲明,不需要定義,定義由moc程序自動實現,可以把信號函數當作一個變量來對待,調用信號函數,就是將信號寫入隊列中,有一個主線程,主線程會從隊列中獲取信號,然後進行處理並調用信號對應的綁定函數。

  要注意,主線程從隊列中取信號:取出一個信號,處理完之後,纔會取下一個信號並進行處理。如果槽函數阻塞時間很長(譬如網絡通信),會導致下一個信號不能及時被處理,界面可能會卡死。所以在槽函數中一般都不會做太長時間的操作,如果實在需要做長時間的操作,可以開一個線程來處理。

  Qt提供的很多槽函數(包含控件裏面的槽函數)都只能在主線程中調用或者通過信號來調用這個槽函數,而不能在其他線程直接調用這些槽函數。因爲有可能消息隊列中有一個事件也綁定了這個槽函數,即事件/信號來了,主線程中也可能會調用該槽函數,主線程和子線程同時調用該槽函數,程序會宕掉。

3.信號與槽的關係圖

在這裏插入圖片描述

4.信號槽函數的處理主循環

  這個主循環也就是整個程序的主線程,這個主線程就是整個程序的入口程序:QApplication a(argc, argv);再調用a.exec()函數進行處理信號。a.exec函數的作用:進入信號槽主循環,然後主循環會一直處於等待狀態,即等待隊列中接收到信號。直到調用exit()函數被調用(這裏猜測,exit也是一個槽函數,用來關閉主線程的)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章