单线程应用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 计算 运行 放在不同的线程中,以继续处理新的连接和事件。这里有不同的选择。
在大多数讨论中有点不受欢迎,但对于长时间 运行 计算期间不必处理 signals/events 的操作仍然有效是子类 QThread
并重新实现 run()
函数。
将您的计算移动到一个函数中,然后 运行 它使用 QtConcurrent::run()
,它将自动使用它自己的线程。
创建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
假设在一个单线程应用程序中,我创建了一个服务器并连接了一个带有新连接到达信号的插槽,如下所示,
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 计算 运行 放在不同的线程中,以继续处理新的连接和事件。这里有不同的选择。
在大多数讨论中有点不受欢迎,但对于长时间 运行 计算期间不必处理 signals/events 的操作仍然有效是子类
QThread
并重新实现run()
函数。将您的计算移动到一个函数中,然后 运行 它使用
QtConcurrent::run()
,它将自动使用它自己的线程。创建
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