Multithreading 将数据写入自己线程中的TcpSocket
我的线程化TCP服务器出现问题。Multithreading 将数据写入自己线程中的TcpSocket,multithreading,qt,tcp,Multithreading,Qt,Tcp,我的线程化TCP服务器出现问题。 我可以打开我的服务器,创建一个新的套接字,我可以通过套接字接收数据(我使用readyRead()信号,然后使用readLine()进行读取,这很好。现在我想从另一个线程将数据写入此套接字,所以我创建了一个公共插槽writeData(),它应该会处理这个问题。我连接了writeData()使用QueuedConnection的插槽(也尝试了自动连接),但调用m_socket->write()时得到的只是一条错误消息: QObject:无法为位于不同线程中的父线程创
我可以打开我的服务器,创建一个新的套接字,我可以通过套接字接收数据(我使用readyRead()信号,然后使用readLine()进行读取,这很好。现在我想从另一个线程将数据写入此套接字,所以我创建了一个公共插槽writeData(),它应该会处理这个问题。我连接了writeData()使用QueuedConnection的插槽(也尝试了自动连接),但调用m_socket->write()时得到的只是一条错误消息: QObject:无法为位于不同线程中的父线程创建子线程。 (父线程是QNativeSocketEngine(0x12f0f70),父线程是ServerThread(0xfbbae8), 当前线程是QThread(0xfa7c48) 这里只是一个简单的例子:
我省略了从另一个线程到writeData()插槽的连接,因为我认为每个人都可以想象;)
提前感谢。您的错误消息意味着: 您的信号槽通信发生在创建的属于主线程的ServerThread实例上。但是创建的ServerThread成员m_socket实例属于其他线程 我建议您创建简单的
QThread
,并将对象移动到其中
void Server::incomingConnection(int socketDescriptor) {
QThread *t = new QThread();
ClientConnection *client = new ClientConnection(socketDescriptor);
client->moveToThread(t);
// go
t->start();
}
class ClientConnection : public QObject {
Q_OBJECT
public:
ClientConnection(int socketDescriptor, QObject *parent = 0);
public slots:
void writeData(QString data);
private:
int m_socketDescriptor;
QTcpSocket *m_socket;
}
您确定使用的是
emit whateVersionSignalisConnectedToWriteData(str)
而不是直接调用writeData
?是的,这就是问题所在..因为我的ServerThread实例的线程关联性与发出信号Qt未执行invokeMethod的实例相同..我的客户端在Client::start时将自己移动到自己的QThread,但我得到了相同的错误
void Server::incomingConnection(int socketDescriptor) {
QThread *t = new QThread();
ClientConnection *client = new ClientConnection(socketDescriptor);
client->moveToThread(t);
// go
t->start();
}
class ClientConnection : public QObject {
Q_OBJECT
public:
ClientConnection(int socketDescriptor, QObject *parent = 0);
public slots:
void writeData(QString data);
private:
int m_socketDescriptor;
QTcpSocket *m_socket;
}