gpt4 book ai didi

c++ - Qt 库组件可以调用 qDebug() 或类似函数吗?

转载 作者:行者123 更新时间:2023-11-28 05:37:06 24 4
gpt4 key购买 nike

我使用 qInstallMessageHandler 注册自定义日志记录功能。此函数格式化消息(例如,它添加时间戳)并将其打印到控制台和日志文件。

我担心的是,如果 Qt 库组件(如 QDateTimeQDirQFile...)可以调用 qDebug (), qWarning() 等 ?

如果是,这可能会导致无限递归......

最佳答案

简单的答案是:避免重新输入您的消息处理程序,然后:

// C++11, Qt 5.4+
void myMessageHandler(…) {
thread_local bool entered = false;
if (entered) return; // oops
QScopedValueRollback set{entered, true};

}

// C++11, Qt 4.8+
void myMessageHandler(…) {
thread_local bool entered = false;
if (entered) return; // oops
QScopedValueRollback back{entered};
entered = true;

}

// C++98, Qt 4
QThreadStorage<bool> entered;
void myMessageHandler(…) {
if (entered.localData()) return;
QScopedValueRollback back(entered.localData());
entered.localData() = true;

}

对于后代来说,这是古老而愚蠢的答案:

只有当你的日志记录是同步的时候,它才会导致无限递归。一旦你使日志记录异步,你就不会再遇到问题了:消息处理程序将永远不会重新进入,因为你在发出信号后立即退出它,并且通过排队连接的信号发射发布零或更多 QMetaCallEvent 实例到相关线程的事件队列,仅此而已。

异步日志记录是通过在消息处理程序中发出信号,并通过显式排队连接处理从连接到信号的插槽/仿函数的日志写入来实现的。您可能希望您的记录器驻留在它自己的线程中,因此这是一种非常自然的方法并且效果很好。

关于c++ - Qt 库组件可以调用 qDebug() 或类似函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38011195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com