我有一个更复杂的以下代码版本:
void Foo::makeConnection(...) {
QTcpSocket * socket = new QTcpSocket(this);
// ...
socket->disconnect(this);
emit connectionAppeared(socket);
}
void Bar::baz() {
// ...
connect(foo, SIGNAL(connectionAppeared(QTcpSocket*)), this, SLOT(onConnectionAppeared(QTcpSocket*)));
foo->makeConnection(...);
}
void Bar::onConnectionAppeared(QTcpSocket * socket) {
if (!socket) { std::terminate(); }
socket->setParent(this);
connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
connect(socket, SIGNAL(disconnected()), this, SLOT(socketClosed()));
}
Bar::baz
要求Foo
将其设为已连接QTcpSocket
,制作完成后,套接字的信号将连接到Bar
&#39 ; s槽。但是时间存在问题:readyRead
信号很可能被发射,因为它连接到任何时隙,因此有效地丢失。我们已经修复了#34;它是这样的:
void Bar::onConnectionAppeared(QTcpSocket * socket) {
// ... same code as before plus the following line:
emit socket->readyRead(); // Kick it to get started!
}
void Bar::readData() {
while (mSocket->bytesAvailable()) {
// ...
}
}
丢失disconnected()
信号的问题仍然存在,但它并不经常出现。从技术上讲,我可以手动发出disconnected()
,并检查socket->state()
广告位中的socketClosed()
...但我觉得这不是正确的方法。我实际上只是手动检查当前状态,而不是对状态转换作出反应,这是信号/槽机械的全部要点。
有没有很好的办法解决这个问题?我想过以某种方式将信号/插槽对传递给Foo::makeConnection(...)
,所以它们可以在调用socket->connectToHost()
之前连接,但我不知道怎么做,而且我不确定它是什么无论如何,这个好主意。