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

浙公网安备 33010602011771号