假设我需要在某个时间间隔从文件中读取数据,而不使用带有信号的 QFileSystemWatcher来监视大小等。在互联网上,我遇到了类似的期望
QEventLoop eventLoop;
QObject::connect(m_webView, SIGNAL(loadFinished(bool)), &eventLoop, SLOT(quit()));
QTimer timer;
QObject::connect(&timer, SIGNAL(timeout()), &eventLoop, SLOT(quit()));
timer.setSingleShot(true);
timer.start(defaultTimeout);
eventLoop.exec();
请告诉我这样的解决方案如何合理地消耗操作系统的资源?在计时器停止之前,循环对象到底会做什么?Sleep(1000)如果在新线程上执行,从QRunnable继承,它的效率不等同于bare吗?使用 进行间隔检查不是更好QTimer吗?
不,使用 QEventLoop 不会“释放” QThread。因此,使用它来实现等待并不能解决 QThreadPool 耗尽空闲线程的问题。此外,由于 QObject::connect() 对 DirectConnection 的使用是优先考虑的,因此不应期望从这种等待实现中获得高性能。
下面是按预期使用 QEventLoop 的代码。默认情况下,移动到新线程后,QObject 后代将优先于来自实际线程的 QEventLoop 进行事件处理。
控制台输出如下。如您所见,QEventLoop 确实让我们有机会获得事件队列为空的时刻。这在构建异步实时系统(例如 JavaScript 解释器)时非常有用。
作为执行这段代码的结果,应用程序将在执行任意一组排队事件后正确终止。在处理 QObject::event() 中的事件时,我们还可以将事件排队以延迟完成。
如果你想停止流,最好做这样的事情:
std::this_thread::sleep_for(std::chrono::milliseconds(1000));