【问题标题】:Difference between a thread with and without an event loop有和没有事件循环的线程之间的区别
【发布时间】:2013-10-31 08:19:04
【问题描述】:

带有事件循环的线程

我们在一个单独的线程中创建了一个 QTcpServer 对象,它正在侦听传入的连接并在它们发生时对其进行处理。在某些时候,它被删除了,并且没有任何东西可以在线程中生成事件。

如果不手动删除,线程是否会进入无限块(使用内存但没有cpu)?

没有事件循环的线程

一个 QTcpServer 对象已创建并正在侦听。

QTcpServer.listen() 是否阻止线程只运行所有代码并自然完成?

传入的连接呢?是否必须手动轮询?

【问题讨论】:

    标签: c++ qt qthread qtcpserver qeventloop


    【解决方案1】:

    最好将线程的finished 信号连接到它自己的deleteLater 槽,这样它就可以自行清理,但是如果你保留指向 QThread 的指针,这可能会导致指针悬空

    QTcpServer.listen() 将立即返回它只是激活端口

    在监听 TCPServer 时,每次客户端发起新连接时都会发出 newConnection() 信号,之后您可以使用 nextPendingConnection 检索它

    【讨论】:

    • 第二个场景,没有事件循环?例如,我扩展了QThread::run(),这样它就不会调用exec()
    • 如果没有事件循环,则不会在该线程上触发任何事件,在示例中 TCPServer 将永远不会发出 newConnection(),但您可以等待与 waitForNewConnection() 的连接跨度>
    • 但是是否可以安全地考虑一旦其中的所有代码都通过了它就会完成。通过完成,我的意思是释放内存,让我不必担心内部线程上发生的任何事情(留下悬空指针等)
    • 如果您将finisheddeleteLater 插槽连接,那么它会自行清理
    猜你喜欢
    • 2010-09-06
    • 2015-10-13
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多