Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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
C++ 如何处理插槽连接前发出的信号_C++_Qt_Race Condition_Signals Slots - Fatal编程技术网

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

C++ 如何处理插槽连接前发出的信号,c++,qt,race-condition,signals-slots,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(

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

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()));
}
baz要求Foo将其设置为连接的QTcpSocket,设置完成后,套接字的信号将连接到Bar的插槽。但是定时有一个问题:readyRead信号很可能在连接到任何插槽之前发出,因此实际上会丢失。我们这样修复它:

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,并在socketClosed插槽中检查socket->state。。。但我只是觉得这不是正确的方式。实际上,我只是手动检查当前状态,而不是对状态转换做出反应,这就是信号/插槽机制的全部要点


有没有好办法解决这个问题?我想到将信号/插槽对传递给Foo::makeConnection。。。不知何故,它们可以在调用socket->connectToHost之前连接,但我不知道如何连接,而且我也不确定这是否是个好主意。

那么为什么不在初始化socket对象后立即发出connectionAppeared?@thuga,因为连接尚未出现,可能永远不会出现?连接失败信号也存在。事实上,在makeConnection中,我可能需要创建两个TCP连接,第一个是辅助连接,返回创建的第二个。