Слот Qt5 вызывается несколько раз из одного оператора emit

Я относительно новичок в Qt, но я немного искал вокруг. У меня есть базовый класс, который обрабатывает широковещательную рассылку UDP и делает операторы connect в конструкторе класса следующим образом:

NetworkConnection::NetworkConnection(QObject *parent)
    : QObject(parent) // Based on QObject
    , m_server_search( new QUdpSocket ) // Our UDP Broadcast socket
    , m_waiting_for_server( false )
    , m_found_server( false )
{
    qDebug() << "NetworkConnection::constructor";
    connect( m_server_search, SIGNAL(readyRead()), this, SLOT(serverResponse()), Qt::UniqueConnection );
    if ( m_server_search->bind( QHostAddress::AnyIPv4, (quint16)PORT_MULTICAST, QUdpSocket::ShareAddress ) )
    {
        if ( m_server_search->joinMulticastGroup( QHostAddress( MULTICAST_GROUP ) ) )
        {
            connect( this, SIGNAL(broadcast(NetworkMessage)), this, SLOT(broadcast_message(NetworkMessage)), Qt::UniqueConnection );
            this->m_ping_timer = this->startTimer(2000);
            qDebug() << "Ping timer id=" << this->m_ping_timer;
        } else qDebug() << "Couldn't start multicast listener";
    } else qDebug() << "Couldn't bind multicast to port" << PORT_MULTICAST;
}

Я настроил интерфейс сигнал / слот для вещания:

signals:
    void serverFound();
    void serverNotFound();
    void broadcast(NetworkMessage);

private slots:
    void serverResponse();
    void broadcast_message( NetworkMessage msg );

А также broadcast_message выглядит так:

void NetworkConnection::broadcast_message( NetworkMessage msg )
{
    QByteArray raw = msg.toString();
    qDebug() << "NetworkConnection::broadcast_message>" << raw;
    if ( m_server_search->writeDatagram( raw.data(), raw.size(), QHostAddress(MULTICAST_GROUP), (quint16)PORT_MULTICAST ) < 1 ) qDebug() << "Failed broadcast last message";
}

Мой таймер работает хорошо, а вот код:

void NetworkConnection::timerEvent(QTimerEvent *event)
{
    qDebug() << "NetworkConnection::timerEvent with id" << event->timerId() << "(ping timer=" << this->m_ping_timer << ")";
    if ( event->timerId() == this->m_ping_timer )
    {
        qDebug() << "NetworkConnection::pingForServer";
        if ( m_waiting_for_server && !m_found_server )
        {
            qDebug() << "Server not found!";
            emit this->serverNotFound();
            return;
        }
        if ( !m_found_server )
        {
            qDebug() << "Sending a ping to the server";
            NetworkMessage msg( m_software_guid, get_microseconds(), QString("whoisaserver") );
            emit this->broadcast( msg );
            m_waiting_for_server = true;
            m_found_server = false;
        }
    }
}

Я получаю только текст "Отправка пинты на сервер" только один раз, но мой файл broadcast_message выводит: qDebug() многократно.

Я не использую явно несколько потоков, и, как вы можете видеть, я использую Qt::UniqueConnection, который, по-видимому, никак не влияет?

Так почему слот будет вызываться несколько раз? Я даже попытался немного отладить его и просто вызвать this->broadcast( ...) без использования emit, и он все еще вызывается несколько раз.

Изменить: я просто добавил счетчик к broadcast_message слот, и он вызывается 340 раз. Есть ли какое-то значение для этого?

0 ответов

Другие вопросы по тегам