C++事件库[关闭]

2023-12-19

您能否推荐具有以下功能的轻量级跨平台事件记录/日志库:

  • 简单的界面
  • 增量事件记录(即event++)
  • 更新快
  • 可定制的报告输出(例如 iostream)
  • 时间戳或操作系统集成并不重要

原则上,使用带有字符串/整数键值的映射来使自己成为一个并不难,但我宁愿使用已经编写的映射。我看过 log4cxx 但这似乎有点矫枉过正。

Thanks


这是原型,最终版本是:http://code.google.com/p/asadchev/source/browse/trunk/projects/boost/utility/profiler.hpp http://code.google.com/p/asadchev/source/browse/trunk/projects/boost/utility/profiler.hpp

#define UTILITY_EVENT_HPP

#include "utility/timer.hpp"

#include <string>
#include <map>
#include <boost/thread.hpp>
#include <boost/tuple/tuple.hpp>

#define PROFILE_FUNCTION(...)                                   \
    utility::profiler::event                                    \
    event__(utility::profiler::global[                          \
        utility::detail::profiler_event(__PRETTY_FUNCTION__)(__VA_ARGS__)])



namespace utility {

    namespace detail {
        struct profiler_event {
            profiler_event(const std::string &key) : data_(key) {}
            operator const std::string&() const { return data_; }
            profiler_event& operator()(const std::string &key) {
                data_ += (":" + key);
                return *this;
            }
            profiler_event& operator()() { return *this; }
        private:
            std::string data_;
        };
    }


    struct profiler {

        typedef std::string event_key;

        struct event_data {
            event_data(): size_(0), value_(0) {}
            event_data(const event_data &e)
                : size_(e.size_), value_(e.value_) {}
            event_data& operator+=(double t) {
                boost::lock_guard<boost::mutex> lock(mutex_);
                 ++size_;
                 value_ += t;
                return *this;
            }
            event_data& operator++() { return (*this += 1); }
            std::ostream& to_stream(std::ostream &ostream) const {
                boost::lock_guard<boost::mutex> lock(mutex_);
                ostream << value_ << "/" << size_;
                return ostream;
            }
        private:
            typedef boost::tuple<profiler&, const event_key&> constructor;
            size_t size_;
            double value_;
            mutable boost::mutex mutex_;
        };

        struct event {
            event(event_data &data) : data_(data) {}
            ~event() {
                // std::cout << timer_ << std::endl;
                data_ += double(timer_);
            }
            event_data &data_;
            utility::timer timer_;
        };

        event_data& operator[](const event_key &key) {
            boost::lock_guard<boost::mutex> lock(mutex_);
            return events_[key];
        }
        std::ostream& to_stream(std::ostream &ostream) const {
            boost::lock_guard<boost::mutex> lock(mutex_);
            std::map<event_key, event_data>::const_iterator it = events_.begin();
            while (it != events_.end()) {
                ostream << it->first << ": ";
                it->second.to_stream(ostream);
                ostream << std::endl;
                ++it;
            }
            return ostream;
        }
        static profiler global;
    private:
        std::map<event_key, event_data> events_;
        mutable boost::mutex mutex_;
    };

    inline std::ostream& operator<<(std::ostream &ostream, const profiler &p) {
        return p.to_stream(ostream);
    }

}


#endif // UTILITY_EVENT_HPP
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++事件库[关闭] 的相关文章

随机推荐

  • 如何在控制器中合并 Laravel 对象

    我有一个控制器 我想将多个表中的数据与并行结构结合起来 我最终想要得到的是一个可以从控制器返回的对象 这样我就可以在 Backbone 中解析它 我想做这样的事情 public function index mc MainContact w
  • 为什么左值在某些地方转换为值而不是其他地方? [复制]

    这个问题在这里已经有答案了 考虑这段代码 int x 99 int p x p p 1 为什么要这样做 p在左侧和右侧 运营商不同 编译器如何知道使用左 p成为对象x和右边的 p成为x 具体来说 如果编译器评估 p成为x 为什么 p左侧的计
  • 如何在VBA中安排邮件发送到特定时间

    如何在VBA中安排邮件发送到特定时间 生成邮件的代码 Set olApp CreateObject Outlook application Set olItem olApp CreateItem 0 olItem display olIte
  • Django:按下按钮时提供动态生成的数据作为附件

    问题概述 我正在创建一个基于 Django 的客户端 旨在从 Web 服务返回数据 该项目的目标是根据用户在表单中选择的值从 Web 服务将数据返回给用户 表单提交后 会生成一个查询字符串 发送到 Web 服务 并以字符串形式返回页面数据
  • 在 R 上时 vi 模式到 emacs 模式

    有时 在 R 控制台上 我不小心输入了未知的键盘快捷键 该快捷键将编辑模式从 emacs 更改为 vi 有谁知道从一个键更改为另一个键的组合键通常是什么 我在 Fedora 16 机器上 我查了这方面的信息question https st
  • NSTextView 颜色和字体清除后重置

    我为 NSPanel 内的 NSTextView 设置了一些默认字体和颜色 但是 当我用以下命令清除视图时setString 不仅文本消失 所有默认颜色 字体格式也消失 当我做了另一个之后setString 文本变为默认字体并再次变黑 有人
  • Rust/rocket 将变量传递到端点

    不符合我的喜好 但我今天被迫编写一些 Rust 所以我尝试创建一个只有一个端点的 Rocket 实例 但是 在该端点上我需要访问在 main 期间创建的变量 该变量需要很长时间才能实例化 所以这就是我在那里这样做的原因 我的问题是我找不到安
  • 使用 SwiftUI 成功登录后导航

    我正在使用 Firebase 和 SwiftUI 以用户身份登录 我一切正常 但无法弄清楚用户成功登录后如何导航到下一页 导航链接对我来说似乎很奇怪 所以我想知道是否有其他方法可以导航到下一个视图 这LoginView包含登录屏幕和Logi
  • Spring Boot Oauth2 对同一 URL 使用多个 grant_types

    是否可以配置Spring Boot以允许Oauth2补助金类型password and authorization code在同一个 URL 上 例如 boot 我已经完成了基本的授权配置 如下所示 security oauth2 clie
  • this.setState 在 React 中返回 Promise

    我做了我的componentWillMount 异步 现在我可以使用await与setState 这是示例代码 componentWillMount async gt const fetchRooms this props await th
  • 捕获代码中的异常

    我正在尝试这段代码来检查是否捕获了除以零异常 int main int argc char argv try Divide by zero int k 0 int j 8 k catch std cout lt lt Caught exce
  • Django 使用电子邮件身份验证和 djoser 进行登录

    所以我最近尝试使用 djoser 我想使用电子邮件而不是用户名登录 左塞尔 http djoser readthedocs io en latest index html http djoser readthedocs io en late
  • file.create 之后 My.computer 无法访问文件

    我有一些代码来删除一个文件 创建另一个文件 这样我就可以覆盖它 并在上面写入 My Computer FileSystem DeleteFile pass File Create pass My Computer FileSystem Wr
  • PyMC 错误:hasattr():属性名称必须是字符串

    我在 PyMC 中的模型上运行推理时遇到问题 我正在尝试在相当复杂的模型上运行 MCMC 并且收到以下错误 hasattr attribute name must be string 我在这段代码的最后一行得到了这个 抱歉 这很复杂 但我真
  • 将数据库移至生产服务器需要什么版本的 SQL Server?

    我刚刚在本地 Windows XP 计算机上完成了 ASP NET 的开发 我使用 Visual Studio 2008 和 SQL Server Express 来开发该网站 我的问题是 现在我想将 SQL Server 数据库从我的 X
  • 如何使用 MediaCodec 和 MediaMuxer 录制视频和音频

    我能够在 MediaCodec 和 MediaMuxer 的帮助下录制 编码 视频 接下来 我需要在 MediaCodec 和 MediaMuxer 的帮助下处理音频部分以及将音频与视频复用 我面临两个问题 如何使用 MediaCodec
  • Symfony webpack encore twig 功能不起作用

    我正在 Symfony 4 项目中使用 twig 生成静态 html 页面 我尝试使用简单的循环和 Twig 渲染函数同时生成多个页面 代码如下所示 foreach pages as page html this gt twig gt re
  • 如何访问 WordPress 身份验证令牌

    我们正在尝试使用 OAuth 2 0 将我们的网站链接到 Wordpresses API 希望客户能够从我们的网站进行身份验证并发布到 WordPress 我们需要接收访问令牌才能执行此操作 我们已成功连接 WordPress 以接收我们的
  • 设置类路径层次结构中的其他目录

    有两个目录 出租车 C a c 嗯 我在说目录中 c a b 当我执行 set classpath cd 时 目录 C a b 被分配给类路径变量 但我想将 C a c 分配给类路径 我怎样才能做到这一点 如果您需要将类路径设置为当前所在目
  • C++事件库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您能否推荐具有以下功能的轻量级跨平台事件记录 日志库 简单的界面 增量事件记录 即event 更新快