我不明白 qt 如何在同一个事件循环中处理事件(例如定时器事件、套接字事件等)和信号。据我所知,定时器和套接字事件是通过 select 系统调用(在 Unix 等操作系统中)处理的。
由于 select 系统调用,事件循环如何在睡眠时处理信号。
我不明白 qt 如何在同一个事件循环中处理事件(例如定时器事件、套接字事件等)和信号。据我所知,定时器和套接字事件是通过 select 系统调用(在 Unix 等操作系统中)处理的。
由于 select 系统调用,事件循环如何在睡眠时处理信号。
在 Qt 中,信号用于调用槽。当你发出一个信号时,粗略地说,调用对应的槽只有 2 个选项:
来自 Qt 文档:https ://doc.qt.io/qt-5/signalsandslots.html#signals
当一个信号发出时,连接到它的槽通常会立即执行,就像一个普通的函数调用一样。发生这种情况时,信号和槽机制完全独立于任何 GUI 事件循环。一旦所有槽都返回,将在发出语句之后执行代码。使用排队连接时情况略有不同;在这种情况下,emit 关键字后面的代码将立即继续执行,而 slot 将稍后执行。
至于理解事件循环,事件循环只是一个循环,它在每次迭代时处理来自事件队列的一个事件。
简而言之,这可以表示如下:
QQueue<QEvent> eventQueue; // Events (and pending slot calls as well) are added to this queue
...
// How an event loop works (schematically):
while(event = eventQueue.dequeue())
{
do_what_the_event_wants_or_ignore_it(event);
}