[英]how to use QTcpSocket in multithread?
在最后一个问题中,我没有明确表达用例。 现在我描述我的要求。 在我的客户端中,我需要使用QTcpSocket连接到服务器。在大多数情况下,我可以在gui线程(主线程)中进行读写。 但是,在一些耗时的任务中,我需要一个工作线程来执行任务。 当我在gui线程中连接服务器时,我一直保持连接。 如果我在工作线程中使用新的QTcpSocket,是否必须在GUI线程中断开套接字? 并再次连接到服务器?
class Widget:public QWidget
{
Q_OBJECT
public:
Widget()
{
socket = new QTcpSocket(this);
}
private:
QHostAddress host;
unsigned int port;
QTcpSocket *socket;
private slots:
void startConnect()
{
socket->connectToHost(host,port);
}
void sendData()
{
//just send some bytes
//socket->write();
}
void doTimeConsumingTask()
{
//must i disconnect gui->socket connection before the Worker is running?
// socket->disconnectFromHost();
Worker * w = new Worker();
w->start();
}
}
class Worker:public QThread
{
Q_OBJECT
public:
Worker()
{
}
protected:
void run()
{
QTcpSocket socket;
// must i connectToHost again here ?
// do something consuming time
while(true){
//
QThread::msleep(10);
}
}
private:
QHostAddress host;
unsigned int port;
}
解决您的问题的简单方法是不从工作线程直接访问QTcpSocket。 最终,您可能想对工作线程中的套接字进行的所有操作都是向套接字发送数据和/或从套接字接收数据。 在那种情况下,您可以简单地使工作线程发出带有QByteArray参数的信号,然后将该信号连接到GUI线程上的插槽,然后在QTcpSocket上调用write(const QByteArray& byteArray)
。 同样,您可以使数据接收功能(无论连接到套接字的readyRead()信号如何)都驻留在工作线程中,或驻留在您的主线程中,但是在接收到工作线程需要处理的数据时,通过信号/插槽连接传递数据。
另一种选择是,如果您必须直接访问套接字(例如,您需要做的不仅仅是写套接字,也许您必须能够关闭它或执行其他操作),则需要将该套接字的每次使用都包装在互斥体中,两个线程。 最好通过将原始QTcpSocket包装到另一个类中来完成此操作,该类仅公开您需要的一些方法,并且始终具有如下调用: QMutexLocker locker(theMutex);
在每个功能的开头。
您有理由不能将套接字传递给线程的构造函数吗?
class Worker : public QThread{
public:
Worker(QTcpSocket* pSocket) : m_pSocket(pSocket) ...
不确定您的用例,但是有您不能这样做的原因吗?
从文档中: http : //doc.qt.io/qt-4.8/qiodevice.html
QIODevice的某些子类(例如QTcpSocket和QProcess)是异步的。 这意味着诸如write()或read()之类的I / O函数总是立即返回,而当控制权返回事件循环时,与设备本身的通信可能会发生。 QIODevice提供的功能使您可以在阻止调用线程且不进入事件循环的情况下立即强制执行这些操作。 这允许QIODevice子类在没有事件循环的情况下使用,也可以在单独的线程中使用:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.