JFrame(JLogger的实现——基于 JBus)

行文至此,我们有必要说一下 JFrame 的架构了

首先 JBus 是一个动态库,不依赖框架的加载,只要通过 API 调用,随时都能提供 订阅/发布 的功能,但是这里 JLogger 依赖于框架的加载,所以在 JLogger 还没加载起来的时候,内核的日志信息是打印在控制台的!

JLogger 加载起来之后,就可以使用 JLogger::INFO 接口将日志输出到 LoggerPanel,这里指所有插件在构造函数或者 initialize 里面的日志信息都可以输出到 LoggerPanel 了,因为 JLogger 是第一个被加载起来的 插件!

每个插件的析构函数里的 JLogger::INFO 无法生效,因为此时 JLogger的LoggerPanel 已经销毁了!(目前的做法是 JLogger 的 exit 函数里就会销毁 LoggerPanel,以后可能会在 JLogger 本身销毁的时候才会销毁 LoggerPanel,此时如果将 JLogger 放在插件队列最后一个销毁,那么其余插件洗后函数里的 JLogger::INFO 还是可以到 LoggerPanel,但是Frame销毁是一瞬间的事情,谁有会在这一瞬间盯着 LoggerPanel 呢?)

可以看到,内核打印出的日志信息会到控制台,之后插件可以选择将信息输出到 LoggerPanel!

 JLoggerService

 1 JLoggerService::JLoggerService(QObject *parent)
 2     :QObject (parent)
 3 {
 4     m_loggerPanel = new LoggerPanel;
 5     m_loggerPanel->show();
 6     JBus::Regist(onResponse, this, JBus::JBusTopic::LOG_INFO);
 7 }
 8 
 9 JLoggerService::~JLoggerService()
10 {
11     JBus::UnRegist(onResponse, this, JBus::JBusTopic::LOG_INFO);
12 }

 JBus

 1 #ifndef JBUS_H
 2 #define JBUS_H
 3 
 4 #include "jbus_global.h"
 5 #include "jbusservice.h"
 6 
 7 namespace JBus
 8 {
 9     void JBUSSHARED_EXPORT Regist(CALL_BACK_FUNC _func, void *_user, std::string _type);
10     void JBUSSHARED_EXPORT UnRegist(CALL_BACK_FUNC _func, void *_user, std::string _type);
11     void JBUSSHARED_EXPORT Publish(std::shared_ptr<JEvent> _event);
12 
13     namespace JBusTopic
14     {
15         static std::string LOG_INFO = "LOG_INFO";
16     }
17 }
18 
19 #endif // JBUS_H

 

posted @ 2022-04-16 15:17  SSSnail  阅读(202)  评论(0)    收藏  举报