【专题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也是一个槽函数,用来关闭主线程的)。

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