c++ - 并发访问 QTcpSocket 对象

标签 c++ multithreading qt qthread qtcpsocket

我创建了一个继承自 QThread 的类,以便让一个线程与 QTcpSocket 对象一起运行。当这个线程启动时,它会连接到服务器:如果连接被拒绝或连接丢失,线程会尝试重新连接到服务器,尝试重新连接的次数不限。换句话说,这个线程试图保持与指定服务器的连接。

QTcpSocket* 被声明为我类的属性成员_socketrun() 函数的第一行实例化了 _socket 对象并尝试连接到服务器。 run() 函数的最后一行调用 _socket->disconnectFromHost()。我注册了 _socket 对象的断开连接事件,以便调用 _socket->deleteLater()

我创建的这个线程运行正常。 现在我要添加一个函数以便将数据发送到服务器:这个函数应该调用 _socket 对象的 write() 函数并且它应该被另一个线程调用.那么,我应该使用互斥锁来使用 _socket 对象吗?

最佳答案

a class that inherits from QThread

首先解决这个问题。这里很多人会告诉你You're Doing it Wrong!

QThread 与其说是线程,不如说是线程 Controller ,所以除非您想更改 Qt 管理线程的方式,否则我建议您不要继承它。相反,请按照 How to Really, Truly Use QThread 中描述的方法进行操作.

我假设您有充分的理由在单独的线程中使用 QTCpSocket,即使它是异步的。

如果你在不同的线程上有一个 QTcpSocket 并且想调用套接字的写函数,你应该使用信号/槽机制,而不是直接从不同的线程调用对象的函数。

因此,总结一下,阅读 excellent article关于如何使用 QThread,重构您的代码以创建一个从 QObject 派生的单独对象,该对象可以移动到新线程。然后使用信号/槽机制向该对象发送数据,然后该对象可以调用套接字的写入函数。

关于c++ - 并发访问 QTcpSocket 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26341150/

相关文章:

c++ - 带有默认参数的 Qt 插槽

Python - 生成给定长度的所有可能的 1 和 0 数组的算法

c - 如何在gcc中编译带有线程的C程序?

c++ - Qt 拖放在窗口中工作。我可以做到这样我只能放入 Qlabel 而不是整个窗口吗?

c++ - QGraphicsEllipseItem 不可移动

c++ - boost 记录器,多个日志文件和记录器

c++ - 类中的类型名称功能

c++ - Qt 的 MOC 生成的 .cpp 文件中有哪些部分?

c# - 异步等待新线程的行为

java - 为什么我的 run() 方法没有从我的 Actionlistener 中正确调用