gpt4 book ai didi

c++ - 通过不同的线程使用 QTcpSockets

转载 作者:行者123 更新时间:2023-11-28 00:05:17 26 4
gpt4 key购买 nike

以下场景:

我创建了一些 QTcpSockets在我的主线程中并将对象保存在一个单例中( std::vector<QTcpSocket*> 和它的 setter/getter );如果用户按下“StartMeasure”按钮,我将启动一个新线程以避免 GUI 中的阻塞行为!

我再次开始 n 个用于硬件通信的新线程(出于速度原因需要并行流)-> 发送/接收某些内容并评估响应。 (对单例中存储的QTcpSockets使用getter)

线程模型:

Thread Model

如果我这样做,我会收到以下警告:

QSocketNotifier: socket notifiers cannot be enabled/disabled from another thread

有时这个错误:

_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

我是否也应该在这里处理线程之间 QTcpSockets 上的信号,或者我该如何解决这个问题? (不想发布代码,因为我只需要一个策略/提示如何正确执行)

谢谢!

最佳答案

要在 Qt 中实现线程间交互,您可以使用以下技术之一。

首先,您可以使用 Qt::QueuedConnectionQt::AutoConnection 属性简单地将 QObjects 的信号和槽连接到单独的线程中。然后,Qt 将使用自己的事件循环系统将一个线程中的信号提升到另一个线程中的插槽。

其次,您可以使用 Qt::QueuedConnectionQt::AutoConnection 从一个线程调用 QMetaObject::invokeMethod 到另一个线程中的 QObject线。 Qt 将再次在另一个线程中提升该调用以进行调用。

实际上,您不能直接从一个线程调用网络对象(例如 QTcpSocket)、QTimers 和其他一些使用 Qt 事件循环系统并存在于其他线程中的方法。

更新

请注意,只有在目标线程中运行了 QEventLoop 时,上述方法才适用(不确定,也许对于信号/槽 apptoach,这对两个线程都是必须的)。如果您不重新实现 run() 或在覆盖的 run( )

关于c++ - 通过不同的线程使用 QTcpSockets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36065240/

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