【发布时间】: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