如何处理插槽连接前发出的信号

时间:2014-09-25 07:12:36

标签: c++ qt race-condition signals-slots

我有一个更复杂的以下代码版本:

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()之前连接,但我不知道怎么做,而且我不确定它是什么无论如何,这个好主意。

0 个答案:

没有答案