Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 将数据写入自己线程中的TcpSocket_Multithreading_Qt_Tcp - Fatal编程技术网

Multithreading 将数据写入自己线程中的TcpSocket

Multithreading 将数据写入自己线程中的TcpSocket,multithreading,qt,tcp,Multithreading,Qt,Tcp,我的线程化TCP服务器出现问题。 我可以打开我的服务器,创建一个新的套接字,我可以通过套接字接收数据(我使用readyRead()信号,然后使用readLine()进行读取,这很好。现在我想从另一个线程将数据写入此套接字,所以我创建了一个公共插槽writeData(),它应该会处理这个问题。我连接了writeData()使用QueuedConnection的插槽(也尝试了自动连接),但调用m_socket->write()时得到的只是一条错误消息: QObject:无法为位于不同线程中的父线程创

我的线程化TCP服务器出现问题。
我可以打开我的服务器,创建一个新的套接字,我可以通过套接字接收数据(我使用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;
}