windows C++-创建数据流代理(三)
以下示例展示了 log_agent 类,它类似于 dataflow_agent 类。 log_agent 类实现异步记录代理,用于将日志消息写入文件和控制台。 log_agent 类使应用程序能够将消息分类为信息性、警告或错误消息。 它还使应用程序能够指定每个日志类别是写入文件、控制台还是同时写入这两者。 本示例将所有日志消息写入文件,并仅将错误消息写入控制台。
消息代理
// log-filter.cpp
// compile with: /EHsc
#include <windows.h>
#include <agents.h>
#include <sstream>
#include <fstream>
#include <iostream>using namespace concurrency;
using namespace std;// A synchronization primitive that is signaled when its
// count reaches zero.
class countdown_event
{
public:countdown_event(unsigned int count = 0L): _current(static_cast<long>(count)) {// Set the event if the initial count is zero.if (_current == 0L){_event.set();}}// Decrements the event counter.void signal(){if(InterlockedDecrement(&_current) == 0L){_event.set();}}// Increments the event counter.void add_count(){if(InterlockedIncrement(&_current) == 1L){_event.reset();}}// Blocks the current context until the event is set.void wait(){_event.wait();}private:// The current count.volatile long _current;// The event that is set when the counter reaches zero.event _event;// Disable copy constructor.countdown_event(const countdown_event&);// Disable assignment.countdown_event const & operator=(countdown_event const&);
};// Defines message types for the logger.
enum log_message_type
{log_info = 0x1,log_warning = 0x2,log_error = 0x4,
};// An asynchronous logging agent that writes log messages to
// file and to the console.
class log_agent : public agent
{// Holds a message string and its logging type.struct log_message{wstring message;log_message_type type;};public:log_agent(const wstring& file_path, log_message_type file_messages, log_message_type console_messages): _file(file_path), _file_messages(file_messages), _console_messages(console_messages), _active(0){if (_file.bad()){throw invalid_argument("Unable to open log file.");}}// Writes the provided message to the log.void log(const wstring& message, log_message_type type){ // Increment the active message count._active.add_count();// Send the message to the network.log_message msg = { message, type };send(_log_buffer, msg);}void close(){// Signal that the agent is now closed._closed.set();}protected:void run(){//// Create the dataflow network.//// Writes a log message to file.call<log_message> writer([this](log_message msg){if ((msg.type & _file_messages) != 0){// Write the message to the file.write_to_stream(msg, _file);}if ((msg.type & _console_messages) != 0){// Write the message to the console.write_to_stream(msg, wcout);}// Decrement the active counter._active.signal();});// Connect _log_buffer to the internal network to begin data flow._log_buffer.link_target(&writer);// Wait for the closed event to be signaled._closed.wait();// Wait for all messages to be processed._active.wait();// Close the log file and flush the console._file.close();wcout.flush();// Set the agent to the completed state.done();}private:// Writes a logging message to the specified output stream.void write_to_stream(const log_message& msg, wostream& stream){// Write the message to the stream.wstringstream ss;switch (msg.type){case log_info:ss << L"info: ";break;case log_warning:ss << L"warning: ";break;case log_error:ss << L"error: ";}ss << msg.message << endl;stream << ss.str();}private: // The file stream to write messages to.wofstream _file;// The log message types that are written to file.log_message_type _file_messages;// The log message types that are written to the console.log_message_type _console_messages;// The head of the network. Propagates logging messages// to the rest of the network.unbounded_buffer<log_message> _log_buffer;// Counts the number of active messages in the network.countdown_event _active;// Signals that the agent has been closed.event _closed;
};int wmain()
{// Union of all log message types.log_message_type log_all = log_message_type(log_info | log_warning | log_error);// Create a logging agent that writes all log messages to file and error // messages to the console.log_agent logger(L"log.txt", log_all, log_error);// Start the agent.logger.start();// Log a few messages.logger.log(L"===Logging started.===", log_info);logger.log(L"This is a sample warning message.", log_warning);logger.log(L"This is a sample error message.", log_error);logger.log(L"===Logging finished.===", log_info);// Close the logger and wait for the agent to finish.logger.close();agent::wait(&logger);
}
本示例将以下输出写入控制台。
error: This is a sample error message.
此示例还生成 log.txt 文件,其中包含以下文本。
info: ===Logging started.===
warning: This is a sample warning message.
error: This is a sample error message.
info: ===Logging finished.===
编译代码
复制示例代码,并将它粘贴到 Visual Studio 项目中,或粘贴到名为 log-filter.cpp 的文件中,再在 Visual Studio 命令提示符窗口中运行以下命令。
cl.exe /EHsc log-filter.cpp
相关文章:
windows C++-创建数据流代理(三)
以下示例展示了 log_agent 类,它类似于 dataflow_agent 类。 log_agent 类实现异步记录代理,用于将日志消息写入文件和控制台。 log_agent 类使应用程序能够将消息分类为信息性、警告或错误消息。 它还使应用程序能够指定每个日志类别是写入文件、控制台…...
C语言学习-循环嵌套打印字母金字塔
前言 最近博主也是在努力的学习C语言,在学习的过程当中碰到了一个对我来说的“难题”,足足控了我有半小时,不过这个问题也是挺有趣的,我也就借着本道题目来写一篇文章和大家交流交流 准备工作 vs2022(其他编辑器当然也可以)c语…...
探索CI/CD:持续集成与持续部署的基本概念
在现代软件开发中,持续集成(CI)和持续部署(CD)已经成为提高开发效率和产品质量的关键实践。本文将详细介绍CI/CD的基本概念、优势以及如何在实际项目中实施CI/CD。 一、什么是持续集成(CI)&…...
大厂面试真题:说一说CMS和G1
CMS垃圾回收器四个主要步骤 初始标记阶段(Initial Mark Phase) 目的:标记老年代中所有从GC Roots直接可达的对象。特点:此阶段会导致STW(Stop The World),即暂停应用程序的执行,但停…...
使用Qt Creator创建项目
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 使用Qt Creator创建项目 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 温馨提示: 1. 新…...
C++ 与 C 的那些事儿:深度剖析两者区别
在编程的世界里,C 和 C 就像是一对有着紧密血缘关系却又各具特色的兄弟。对于很多初学者或者有一定编程经验的人来说,分清它们之间的差异至关重要。今天,我们就来深入探讨一下 C 和 C 的区别。 <1>、C 是一种静态类型的、编译式的、通…...
学习Redis 高可用性
Redis 高可用性(High Availability)是指在 Redis 系统中实现持续的可用性,即使在发生硬件故障或其他意外情况下,系统仍能保持运行。 Redis 高可用性(High Availability)是指在 Redis 系统中实现持续的可用性…...
【含开题报告+文档+PPT+源码】基于springBoot+vue超市仓库管理系统的设计与实现
开题报告 随着电子商务的快速发展和物流行业的日益壮大,超市仓库管理系统的重要性也日益凸显。传统的超市仓库管理方式存在许多问题,比如人工操作繁琐、数据统计不准确、管理效率低下等。因此,需要设计和实现一个高效、智能的超市仓库管理系…...
美发店管理革新:SpringBoot系统的应用
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理美发门店管理系统的相关信息成为必然。开发…...
C++从0到1
左值和右值: 左值左值是可以位于赋值操作左边的表达式。意味着左值代表一个对象的身份内存中的具体位置。可以被取地址,并且可以位于赋值操作的左边或右边右值右值是不能位于赋值操作左边的表达式。右值代表一个对象的值,通常是一个临时对象…...
VMware Tools 安装和配置
1. 使用 ISO 映射文件,并且选择.iso文件 2. 启动虚拟机,如果 VMware Tools 是灰色的,那么卸载 open-vm-tools(不要重装),重新启动虚拟机。卸载可以参考:重装 open-vm-tools-CSDN博客 3. 拷贝挂载…...
云原生化 - 基础镜像(简约版)
根据最佳实践的建议,每个容器只做一件事,并尽可能减少基础镜像的内容,这里列举一些常用的基础镜像,可供选择。(完整版请查阅这里) 基础镜像推荐 1. BusyBox 描述:一个包含了许多常用UNIX工具的…...
云计算相关
文章目录 一、虚拟化1、虚拟化技术概述特点 2、虚拟化与云化3、计算虚拟化分类与作用常见的计算服务架构 4、存储虚拟化5、网络虚拟化 二、行业管理规章制度1、服务器管理制度访问控制变更管理备份与恢复监控与审计 2、操作系统安全管理规范更新与补丁管理用户账号管理防火墙与…...
人机协作:科技与人类智慧的融合
随着科技的飞速发展,越来越多的领域开始借助人工智能(AI)和自动化技术来提升工作效率。人机协作(Human-Machine Collaboration)这一概念逐渐成为现代技术进步的核心。它不仅改变了我们的工作方式,也在重新定…...
keras yolo8目标检测
是从coco数据集提取其中的veh_ids[3,6,8,10] labels[car,bus,truck,traffic light]来做目标检测,分别表示汽车,公交车,卡车,交通灯,用的backbone keras_cv.models.YOLOV8Backbone.from_preset( "yolo_v8_m_backbone_coco" ),不用预训练…...
PowerJob做定时任务调度
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、区别对比二、使用步骤1. 定时任务类型2.PowerJob搭建与部署 前言 提示:这里可以添加本文要记录的大概内容: PowerJob是基于java开…...
前后端分离开发YApid
开头先声明以下,这篇主要用于概念的介绍…… 在当今的互联网应用开发中,前后端分离逐渐成为主流的开发模式。相比于传统的前后端混合开发,这种新模式在灵活性、可维护性和团队协作等方面具有显著优势。 前后端混合开发 在前后端混合开发模式…...
leetcode 22.括号生成
思路:dfs回溯 其实这道题看起来很像栈,但考虑到多种可能方案输出,我们需要用dfs来做。 乍一看好像没啥思路。我们可以从括号的特点入手,括号我们知道都是成对存在的,那么无论多少对括号,其实第一个符号肯…...
如何启动一个OpenSearch
创建两个集群,标注 不含备用节点 选择集群版本和配置集群版本 冷热存储和专用主节点这个按需开启 然后是网络,是否使用自定义域名,集群开在VPC还是公网上。 选择是否开启认证: 访问策略,其实就是资源策略 维护时段…...
自媒体工具箱 v1.0,支持涂抹加水印、无水印下载、加水印、消除原声、视频压缩
自媒体工具箱,打开App,非常干净清爽,只有视频工具板块,总共有11个功能,包括涂抹加水印、无水印下载、加水印、消除原声、视频压缩等功能。...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
数据分析六部曲?
引言 上一章我们说到了数据分析六部曲,何谓六部曲呢? 其实啊,数据分析没那么难,只要掌握了下面这六个步骤,也就是数据分析六部曲,就算你是个啥都不懂的小白,也能慢慢上手做数据分析啦。 第一…...
window 显示驱动开发-如何查询视频处理功能(三)
D3DDDICAPS_GETPROCAMPRANGE请求类型 UMD 返回指向 DXVADDI_VALUERANGE 结构的指针,该结构包含特定视频流上特定 ProcAmp 控件属性允许的值范围。 Direct3D 运行时在D3DDDIARG_GETCAPS的 pInfo 成员指向的变量中为特定视频流的 ProcAmp 控件属性指定DXVADDI_QUER…...
NineData数据库DevOps功能全面支持百度智能云向量数据库 VectorDB,助力企业 AI 应用高效落地
NineData 的数据库 DevOps 解决方案已完成对百度智能云向量数据库 VectorDB 的全链路适配,成为国内首批提供 VectorDB 原生操作能力的服务商。此次合作聚焦 AI 开发核心场景,通过标准化 SQL 工作台与细粒度权限管控两大能力,助力企业安全高效…...
简单聊下阿里云DNS劫持事件
阿里云域名被DNS劫持事件 事件总结 根据ICANN规则,域名注册商(Verisign)认定aliyuncs.com域名下的部分网站被用于非法活动(如传播恶意软件);顶级域名DNS服务器将aliyuncs.com域名的DNS记录统一解析到shado…...
OCC笔记:TDF_Label中有多个相同类型属性
注:OCCT版本:7.9.1 TDF_Label中有多个相同类型的属性的方案 OCAF imposes the restriction that only one attribute type may be allocated to one label. It is necessary to take into account the design of the application data tree. For exampl…...
