1

Qt 5.7.1 で Lambda とタイマーの動作がおかしくなりました。おそらく私の間違いです。

ソケットとの接続を開始し、タイマーを設定して、一定時間後に接続されたかどうかを確認します。

ソケットに接続された信号は時間を停止します。

ただし、以下の実装では、接続されたシグナルが呼び出されてもタイマーは停止しません。

constructor:

m_connectTimeout.setInterval(5000);

connect(&m_socket, &QLocalSocket::connected, [&]()
{
    // this is called first and should stop the timer.
    m_connectTimeout.stop();
});


connect(&m_connectTimeout, &QTimer::timeout, [&](){
       // this is still called
});

これは、Qt5.7.1 および Windows 10 で再現可能な問題の最小限の例です。

#include <QtCore>
#include <QtNetwork>

#define PIPENAME "testbug"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QTimer timer;
    QLocalSocket socketClient, *socketServer;
    QLocalServer server;
    timer.setInterval(2000);


    QObject::connect(&timer, &QTimer::timeout, [&]
    {
        qDebug() << "client connection timed out";
        timer.stop();
    });

    QObject::connect(&socketClient, &QLocalSocket::connected, [&]
    {
        qDebug() << "client connected";
        timer.stop();
    });

    QObject::connect(&server, &QLocalServer::newConnection, [&]
    {
        qDebug() << "server got connection";
        socketServer = server.nextPendingConnection();
    });

    server.setSocketOptions(QLocalServer::WorldAccessOption);
    server.listen(PIPENAME);

    qDebug() << "client connecting. . .";
    socketClient.connectToServer(PIPENAME, QLocalSocket::ReadWrite);
    timer.start();

    return a.exec();
}

プログラムの出力:

client connecting. . .
client connected
server got connection
client connection timed out

また、常に再現できるとは限らず、ランダムに見えることにも気付きました。

4

1 に答える 1