私のスレッド化されたTCPサーバーに問題があります。
ソケットを介してデータを受け取ることができる新しいソケットが作成されました(私はreadyRead()シグナルを使用してreadLine()を使用して読み取りましたが、正常に動作しています。このソケットを別のスレッドから作成したので、これを処理するpublicスロットwriteData()を作成しました。私はwriteData()スロットをQueuedConnection(AutoConnectionも試しました)に接続しましたが、m_socket-> writeエラーメッセージ:自分のスレッドでTcpSocketにデータを書き込む
にQObject:別のスレッドである親のために子を作成することはできません (親がQNativeSocketEngine(0x12f0f70)、親のスレッドはQThread ServerThread(0xfbbae8)、 現在のスレッドがされているである(0xfa7c48)
ここだけで、最小限の例:
は、私は誰もがそれを想像することができると思うので、書き込みデータ()スロットに私の他のスレッドから接続省略;)事前に
class Server : public QTcpServer {
Server();
protected:
void incomingConnection(int socketDesc);
}
Server::Server() : QTcpServer() {
this->listen(QHostAddress::Any, PORT);
}
void Server::incomingConnection(int socketDescriptor) {
ServerThread *t = new ServerThread(socketDescriptor);
t->start();
}
class ServerThread : public QThread {
ServerThread(int socketDescriptor);
protected:
void run();
public slots:
void writeData(QString data);
private:
int m_socketDescriptor;
QTcpSocket *m_socket;
}
ServerThread::ServerThread(int socketDescriptor) : QThread(), m_socketDescriptor(socketDescriptor) {}
void ServerThread::run() {
m_socket = new QTcpSocket();
m_socket->setSocketDescriptor(m_socketDescriptor);
exec();
}
void ServerThread::writeData(QString data) {
m_socket->write(data.toAscii());
}
感謝。
'writeData'を直接呼び出す代わりに' whitSignalIsConnectedToWriteData(str) 'を使用していると確信していますか? –