Tob*_*ias 4 qt multithreading tcp
我的线程TCP-Server出了问题.
我可以打开我的服务器,创建一个新的Socket,我可以通过套接字接收数据(我使用了readyRead()信号然后使用readLine()来读取,这工作正常.现在我想把数据写入这个Socket从另一个线程,所以我创建了一个公共插槽writeData(),它应该处理这个.我连接writeData()插槽与QueuedConnection(也试过自动连接)但我得到的所有,当我调用m_socket-> write()是一个错误信息:
QObject:无法为位于不同线程中的父级创建子级.(Parent是QNativeSocketEngine(0x12f0f70),父线程是ServerThread(0xfbbae8),当前线程是QThread(0xfa7c48)
这里只是一个最小的例子:
我省略了从我的其他线程到writeData()槽的连接,因为我认为每个人都可以想象;)
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());
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
小智 5
您的错误消息表示:
您的信号槽通信发生在已创建且属于主线程的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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6577 次 |
| 最近记录: |