1

我不明白 qt 如何在同一个事件循环中处理事件(例如定时器事件、套接字事件等)和信号。据我所知,定时器和套接字事件是通过 select 系统调用(在 Unix 等操作系统中)处理的。

由于 select 系统调用,事件循环如何在睡眠时处理信号。

4

1 回答 1

0

在 Qt 中,信号用于调用槽。当你发出一个信号时,粗略地说,调用对应的槽只有 2 个选项:

  1. 直接插槽调用。这可以被认为是用仅具有插槽调用的线路发出的信号替换线路。事件循环不用于处理此信号本身。
  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);
}

另请阅读https://wiki.qt.io/Threads_Events_QObjects

于 2020-04-09T11:25:31.317 回答