我创建了一个继承自 QThread
的类,以便让一个线程与 QTcpSocket
对象一起运行。当这个线程启动时,它会连接到服务器:如果连接被拒绝或连接丢失,线程会尝试重新连接到服务器,尝试重新连接的次数不限。换句话说,这个线程试图保持与指定服务器的连接。
QTcpSocket*
被声明为我类的属性成员_socket
。 run()
函数的第一行实例化了 _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/