gpt4 book ai didi

multithreading - 为什么从主线程调用插槽?

转载 作者:行者123 更新时间:2023-12-03 13:18:05 26 4
gpt4 key购买 nike

我有一个Qt应用程序,它具有两个线程:处理GUI的主线程和管理网络连接的第二个线程。这是线程代码:

void thread::run()
{
QTcpServer server;

server.connect(&server,SIGNAL(newConnection()),this,SLOT(OnConnect()));

//...
}

当我在 OnConnect()的开头放置一个断点并调试应用程序时,它宣布从主线程调用 OnConnect()!

如何让 OnConnect()QTcpServer在同一线程中运行?

最佳答案

为了给出更彻底的答案,请更深入地研究信号插槽连接和线程上下文之间的交互方式。基本上,对于更多的连接(自动连接),如果发射器和接收器都在同一线程上下文中,则将直接调用该插槽,否则它将是排队的连接,并且该插槽将在以下线程上下文中运行包含插槽的对象。在这种情况下,必须将它排队,这意味着您的线程是主应用程序线程上下文的一部分,而不是它自己的线程上下文的一部分。 the documentation对此进行了增强。Qt提供了其线程的概述,其中指出QThread实例由创建它的线程上下文“拥有”,而不是它表示的线程上下文。这意味着您有三个主要选择:

  • 您可以使用moveToThread()将线程移动到其自己的上下文中。请注意,这可能会在删除线程时引起问题,除非您将其移回将要销毁的上下文中,并且这只能在源线程上下文中完成,因此必须在退出run函数之前完成。
  • 您可以将QThread实例视为线程的句柄,而不是作为线程本身的一部分。如果需要在新线程的上下文中完成操作,请创建一个不同的对象来处理这些对象,然后在新线程的上下文中(在run函数内部)实例化它们。这就是我的建议。
  • 强制直接连接。这意味着您需要确保在插槽中运行的代码是线程安全的,而忽略Qt内置的使那些函数成为线程安全的方法。 This is what you have done
  • 关于multithreading - 为什么从主线程调用插槽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3844438/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com