首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QFileSystemWatcher文件已更改信号仅在少数文件更新时发出

QFileSystemWatcher文件已更改信号仅在少数文件更新时发出
EN

Stack Overflow用户
提问于 2021-08-08 12:24:42
回答 1查看 52关注 0票数 0

我使用QFileSystemWatcher来控制日志文件的更改。为了创建和更新日志文件,我使用的是boost库。

当我在一个方法中记录几条消息时,文件更改信号只发出一些(对于最后一条消息),但我看到该文件在添加日志消息后每次都会更新。

因此,QFileSystemWatcher的代码是

代码语言:javascript
复制
    std::string fn = "app.log";
    logging::init_log(fn);
    QFileSystemWatcher* watcher = new QFileSystemWatcher();
    auto success = QObject::connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT(handleFileChanged(QString)));
    Q_ASSERT(success);
    watcher->addPath(QString::fromStdString(fn));

添加日志消息

代码语言:javascript
复制
void a(){
    /* some code */
    logging::write_log("test error", logging::kError);
    logging::write_log("test info", logging::kInfo);
}

QFileSystemWatcher仅为信息级消息发出信号。在文件管理器中,我看到文件在每次调用(测试错误、测试信息)后更新。在日志文件初始化中,我使用

代码语言:javascript
复制
    sink->locked_backend()->auto_flush(true);

因此文件会立即更新。

我该如何解决这个问题呢?或者可能还有另一种方法来处理日志文件更新,以便在GUI中显示消息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-09 10:24:49

类似的文件系统事件通知通常被合并为一个,除非它们被读取器使用。例如,如果编写器将10个字节写入文件,则监视该文件写入的线程通常会看到一个事件,而不是10个事件。这在Linux上的inotify描述说明中有明确的概述,该说明很可能由QFileSystemWatcher内部使用。

这对于文件系统监控软件的任何正确实现都无关紧要。该通知仅允许监视器注意到发生了某些事件(例如,发生了写入),并且由软件来发现有关该事件的更多细节(例如,写入的数据量和写入位置)。

如果您的目标是仅显示写入的日志,则应该能够从当前读取位置到文件末尾只读取文件内容。该读取操作可以返回一个或多个日志记录。如果C++标准库以某种方式实现(例如,当auto_flush被禁用时,流缓冲区在发出write之前用部分日志记录内容填充内部缓冲区),它也可能返回不完整的日志记录。监控软件应解析读取的内容以分离日志记录,并检测不完整的日志记录(例如,按换行符拆分数据)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68700737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档