1

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

void thread::run()
{
    QTcpServer server;

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

    //...
}

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

我怎样才能OnConnect()在同一个线程中运行QTcpServer

4

2 回答 2

4

要给出更全面的答案,请更深入地了解信号槽连接和线程上下文如何交互。基本上,对于更多的连接(auto-connect),如果发射器和接收器都在同一个线程上下文中,则直接调用slot,否则为排队连接,slot运行在线程上下文中包含插槽的对象。在这种情况下,它必须排队,这意味着您的线程是主应用程序线程上下文的一部分,而不是它自己的。Qt 提供的关于其线程的概述的文档强化了这一点,其中声明 QThread 实例由创建它的线程上下文“拥有”,而不是它所代表的线程上下文。这意味着您有三个主要选择:

  1. 您可以使用 moveToThread() 将线程移动到自己的上下文中。请注意,删除线程时这可能会导致问题,除非您将其移回将被销毁的上下文,并且这只能在源线程上下文中完成,因此必须在 run 函数退出之前完成。
  2. 您可以将 QThread 实例视为线程的句柄,而不是线程本身的一部分。如果您需要在新线程的上下文中完成某些事情,请创建一个不同的对象来处理它们,并在新线程的上下文中(在 run 函数内)实例化它们。这是我会推荐的。
  3. 强制直接连接。这意味着您需要确保在插槽中运行的代码是线程安全的,忽略 Qt 使这些函数成为线程安全的内置方法。 这就是你所做的。
于 2010-10-04T17:27:35.783 回答
0

似乎问题在于我没有Qt::DirectConnection作为connect().

添加后,它起作用了。

于 2010-10-02T05:15:36.447 回答