python PyQt5事件监听机制

1. 事件监听机制实际上应该是事件循环机制(搜这个搜到的结果更多更详细)

2. qt的事件循环实际上不是多线程实现的,实现机制实际上是事件循环和消息队列

        随便打开一个QT编写的程序,运行ProcessExplorer等待一段时间后查看进程后发现内部只有一个线程。这说明事件循环是只有一个主线程的。(如下图)

python PyQt5事件监听机制_第1张图片

3. 简述事件循环与消息队列

       入门可以参考如下两篇文章:

第十七章(第3节):消息循环 - 知乎 (zhihu.com)icon-default.png?t=MBR7https://zhuanlan.zhihu.com/p/350180633

Qt实用技能3-理解事件循环 - 知乎 (zhihu.com)icon-default.png?t=MBR7https://zhuanlan.zhihu.com/p/72758194

4. 耗时的计算和sleep等阻塞的函数为什么会导致界面卡顿?

        这个问题在第二篇文章的最后有解答,实际上就是界面自身根据刷新率自身有一个刷新界面的事件,由于事件循环是在处理完当前事件前无法处理其他事件的,因此若阻塞事件或计算事件超过了两次刷新事件的时间间隔,那么下一次的刷新事件就没法按时执行,界面就一直保持在前一帧的状态直到阻塞被唤醒或者计算结束,这样一来就导致了卡顿。

——————————————————以下都是错的———————————————————

1. 监听某一事件的函数相当于阻塞自己,直到该事件发生(一个事件监听函数独占一个线程)。

2. 事件监听函数不能阻塞自己,因此不能调用time.sleep()或者s.recvFrom(),前者可以用QTime实现,后者可以用创建一个新的线程来接收。

3. 主函数会阻塞在app.exec_()上,直到最后一个窗口关闭这一事件发生。

4. 多个函数可以监听同一事件,就是一个Button上可以clicked.connect多个函数,当这一事件发生时多个线程同时启动

5. 每个函数对应一个线程,在一个事件发生后,监听函数运行完之前再次发生该事件,函数将不响应,说明函数对应的线程是唯一的。

你可能感兴趣的:(PyQt5,socket,网络,服务器,运维,python)