单线程应用qt slot在哪个线程执行

Single thread application qt slot executes in which thread

假设在一个单线程应用程序中,我创建了一个服务器并连接了一个带有新连接到达信号的插槽,如下所示,

 connect(mTcpServer, SIGNAL(newConnection()), this, SLOT(newClientConnected()));

在这一行之后,我进入了一个巨大的循环,在那里我做了一些计算。所以作为主线程的我的单线程在一个循环中很忙,现在一个新的连接到达了。

所以我的问题是,

1) In which thread the new slot will be executed? I ask this because
main thread is already executing some code in a loop. 

2) In which thread the event loop is maintained? Because certainly my single
thread is executing some code in a loop and is not maintaining the event loop.

我是QT新手:(

主线程。

由于您是 运行 单线程应用程序,所有内容都将在那里处理(基本级别的一些 IO 除外)。

您的插槽将始终在调用线程中执行,除非您在拥有插槽的对象所属的线程中创建 Qt::QueuedConnection 到 运行 插槽。一旦你 运行 多个线程,这就变得很重要。

每个标准 QThread 都有自己的事件队列。由于您有一个单线程应用程序,您的事件队列也将 运行 在主线程中。

这在您的长 运行ning 循环期间结束,不会有任何事件处理,也不会处理新连接。

解决方案:将您的长 运行ning 计算 运行 放在不同的线程中,以继续处理新的连接和事件。这里有不同的选择。

  1. 在大多数讨论中有点不受欢迎,但对于长时间 运行 计算期间不必处理 signals/events 的操作仍然有效是子类 QThread 并重新实现 run() 函数。

  2. 将您的计算移动到一个函数中,然后 运行 它使用 QtConcurrent::run(),它将自动使用它自己的线程。

  3. 创建QRunnable的子类并使用全局线程池

所有选项都有效,但在实现上略有不同。有关更多详细信息,请参阅文档:http://doc.qt.io/qt-5/thread-basics.html

In which thread the event loop is maintained? Because certainly my single thread is executing some code in a loop and is not maintaining the event loop.

每个线程都可以有一个事件循环。如果您的代码没有将控制权返回到它运行的线程中的事件循环,那么您将不会处理任何事件,并且正在为失败做好准备。所以不要那样做。按如下方式转换您的代码:

// before
forever {
  code();
}

// after
void timerEvent(QTimerEvent *ev) {
  if (ev->timerId() == m_timer.timerId())
    code();
}

void start() {
  m_timer.start(0, this);
}

QBasicTimer m_timer; // class member