Qt库组件可以调用qDebug()还是simmilar?

时间:2016-06-24 10:27:52

标签: c++ qt qdebug

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

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

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

1 个答案:

答案 0 :(得分:1)

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

// 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个实例发布到相关的线程&#39;事件队列及那个。

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