【发布时间】:2017-05-17 03:16:57
【问题描述】:
假设在一个单线程应用程序中,我创建了一个服务器并使用新的连接到达信号连接了一个插槽,如下所示,
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 的新手 :(
【问题讨论】:
-
我不太明白这个问题:你说你有一个单线程应用程序。如:只有一个线程。问一个 slot 将在哪个线程上执行很奇怪:只有一个线程,你已经知道 slot 将在哪个线程上执行!
-
@KubaOber,我想无论如何,事件循环总是被处理。这就是为什么我很好奇,如果主线程不能用于该处理,那么谁来做。
-
你需要问一个更基本的问题:为什么你认为信号和槽必然与事件循环有关?在您的情况下,信号槽连接完全像使用函数指针。从信号体内调用插槽。当信号返回时(毕竟它只是一个方法),槽已经被调用了。没有任何地方出现任何事件循环。事件循环用于传递跨线程/排队槽调用,但你没有这样做。
-
那么当connect函数返回时,它已经发出newConnection信号并执行了SLOT?这意味着连接调用将被阻止,直到新的连接到来?
-
不,
connect方法只是将一个条目添加到连接列表中。它是执行所有实际调用插槽工作的信号。再次考虑一下,如果信号是函数指针,并且槽是您分配给指针的函数而不是使用connect,它将如何工作。这或多或少是这样工作的。将信号视为带有特殊调用运算符的函数指针列表:当您调用它时,列表中的任何插槽都会立即被调用(如果它们接收对象在同一个线程中,这里当然是因为没有其他线程)。
标签: multithreading qt event-loop