【问题标题】:Using async QLocalServer with QEventLoop将异步 QLocalServer 与 QEventLoop 一起使用
【发布时间】:2020-04-27 17:35:45
【问题描述】:

我想在应用程序中使用不使用QCoreApplication 的异步信号/插槽运行QLocalServer。据我了解,这应该使用QEventLoop

void MyThread::startSocketServer()
{
    m_server = new QLocalServer();
    m_server->listen("ExamplePipe");

    /*
    // This works:
    m_server->waitForNewConnection(-1);
    auto socket = m_server->nextPendingConnection();
    socket->write("Test"); */

    // This signal is never triggered
    connect(m_server, &QLocalServer::newConnection, this, [this]()
    {
        auto socket = m_server->nextPendingConnection();
        connect(socket, &QLocalSocket::readyRead, this, [this, socket]()
        {
            //socket->readAll();
            //usleep(1000);
            //socket->write("Test");
        });
    });
}

void MyThread::run()
{
    QEventLoop eventLoop;
    startSocketServer();
    eventLoop.exec();
}

同步版本按预期工作。有没有办法使用QLocalServer的异步方式?

编辑:这是一个基本的版本:

void MyThread::run()
{
    QEventLoop eventLoop;
    m_server = new QLocalServer();
    m_server->listen("ExamplePipe");

    connect(m_server, &QLocalServer::newConnection, &eventLoop, []()
    {
        // not triggered
    });
    eventLoop.exec();
}

问候,

【问题讨论】:

  • 不知道要避开QCoreApplication,但看起来MyThread 是从QThread 继承而来的。为什么eventLoop.exec() 而不仅仅是exec()
  • 据我所知,信号传递需要接收者线程中的事件循环。你有没有这样的事件循环,this 住在哪里?
  • 我添加了一个简短的简单示例,它也不起作用。
  • QThread 中创建QCoreApplication 实例也是可行的(我实际上尝试过,但没有成功)。

标签: qt qt-signals qlocalsocket qlocalserver


【解决方案1】:

我搞定了:

void MyThread::run()
{
    int argc = 0;
    char *argv[] = {NULL};
    m_qtApplication = new QCoreApplication(argc, argv);

    m_server = new QLocalServer();
    m_server->listen("ExamplePipe");

    connect(m_server, &QLocalServer::newConnection, m_qtApplication, []()
    {
        // works
    });

    m_qtApplication->exec();
}

【讨论】:

  • 你没有尽量避免使用 QCoreApplication 吗?
  • 是的,我做到了。但我没有得到它与香草QEventLoop 一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 2019-11-10
  • 2018-07-03
  • 2012-09-02
  • 2018-04-16
相关资源
最近更新 更多