windows C++-创建基于代理的应用程序(上)

本文介绍了如何创建基本的基于代理的应用程序。 在这个案例中,你可以创建一个代理,从文本文件中异步读取数据。 应用程序使用 Adler-32 校验和算法来计算该文件内容的校验和。

创建控制台应用

本部分介绍了如何创建 C++ 控制台应用程序,用于引用程序将使用的头文件。 根据所使用的 Visual Studio 版本,初始步骤会有所不同。 若要查看 Visual Studio 首选项的文档,请使用“版本”选择器控件。 它位于此页面上目录表的顶部。

在 Visual Studio 中创建 C# 控制台应用程序
  1. 在主菜单中,选择“文件”>“新建”>“项目”,打开“创建新项目”对话框;
  2. 在对话框顶部,将“语言”设置为“C++”,将“平台”设置为“Windows”,并将“项目类型”设置为“控制台”;
  3. 从筛选的项目类型列表中,选择“控制台应用”,然后选择“下一步” 。 在下一页中,输入 BasicAgent 作为项目的名称,并根据需要指定项目位置;
  4. 选择“创建”按钮创建项目;
  5. 右键单击“解决方案资源管理器”中的项目节点,并选择“属性”。 在“配置属性”>“C/C++”>“预编译标头”>“预编译标头”下,选择“创建”;

注意: 这里演示了对默认情况下的项目改造,实际上,我们可以直接创建C++项目。

更新头文件

在 pch.h(Visual Studio 2017 及更早版本中为 stdafx.h)文件中,添加以下代码:

#include <agents.h>
#include <string>
#include <iostream>
#include <algorithm>

头文件 agents.h 包含 concurrency::agent 类的功能。

验证应用程序

最终,通过生成并运行应用程序来验证其是否已成功创建。 若要生成应用程序,请在“生成”菜单上单击“生成解决方案”。 如果应用程序已成功生成,请单击“调试”菜单上的“开始调试”来运行应用程序。

创建 file_reader 类

本部分介绍如何创建 file_reader 类。 运行时计划每个代理在其自己的上下文中执行工作。 因此,可以创建一个代理,该代理以同步方式执行工作,但与其他组件异步交互。 file_reader 类从给定输入文件读取数据,并将该文件中的数据发送到给定的目标组件。

创建 file_reader 类

1. 将新的 C++ 头文件添加到项目。 为此,请右键单击“解决方案资源管理器”中的“头文件”节点,单击“添加”,然后单击“新建项”。 在“模板”窗格中,选择“头文件(.h)”。 在“添加新项”对话框中,在“名称”框中键入 file_reader.h,然后单击“添加”。

2. 在 file_reader.h 中,添加以下代码:

#pragma once

3. 在 file_reader.h 中,创建一个派生自 agent 的名为 file_reader 的类。

class file_reader : public concurrency::agent
{
public:
protected:
private:
};

4. 将以下数据成员添加到类的 private 部分。

std::string _file_name;
concurrency::ITarget<std::string>& _target;
concurrency::overwrite_buffer<std::exception> _error;

_file_name 成员是代理从中读取的文件名。 _target 成员是代理向其写入文件内容的 concurrency::ITarget 对象。 _error 成员保留代理生命周期内发生的任何错误。

5. 将 file_reader 构造函数的以下代码添加到 file_reader 类的 public 部分。

explicit file_reader(const std::string& file_name, concurrency::ITarget<std::string>& target): _file_name(file_name), _target(target)
{
}explicit file_reader(const std::string& file_name, concurrency::ITarget<std::string>& target,concurrency::Scheduler& scheduler): agent(scheduler), _file_name(file_name), _target(target)
{
}explicit file_reader(const std::string& file_name, concurrency::ITarget<std::string>& target,concurrency::ScheduleGroup& group): agent(group) , _file_name(file_name), _target(target)
{
}

每个构造函数重载均设置 file_reader 数据成员。 第二和第三个构造函数重载使应用程序能够将特定的计划程序与代理一起使用。 第一个重载将默认的计划程序与代理一起使用。 

6. 将 get_error 方法添加到 file_reader 类的公共部分。

bool get_error(std::exception& e)
{return try_receive(_error, e);
}

get_error 方法检索代理生命周期内发生的任何错误。

7. 在类的 protected 部分实现 concurrency::agent::run 方法。

void run()
{FILE* stream;try{// Open the file.if (fopen_s(&stream, _file_name.c_str(), "r") != 0){// Throw an exception if an error occurs.            throw std::exception("Failed to open input file.");}// Create a buffer to hold file data.char buf[1024];// Set the buffer size.setvbuf(stream, buf, _IOFBF, sizeof buf);// Read the contents of the file and send the contents// to the target.while (fgets(buf, sizeof buf, stream)){asend(_target, std::string(buf));}   // Send the empty string to the target to indicate the end of processing.asend(_target, std::string(""));// Close the file.fclose(stream);}catch (const std::exception& e){// Send the empty string to the target to indicate the end of processing.asend(_target, std::string(""));// Write the exception to the error buffer.send(_error, e);}// Set the status of the agent to agent_done.done();
}

run 方法打开文件并从中读取数据。 run 方法使用异常处理来捕获文件处理期间发生的任何错误。

每次该方法从文件读取数据时,它都会调用 concurrency::asend 函数,将该数据发送到目标缓冲区。 它将空字符串发送到其目标缓冲区,以指示处理结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/55697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下docker学习02(yum源切换及docker安装配置)

2 前期工作 2.1 切换yum源并更新 删除/etc/yum.repos.d/原有repo文件&#xff0c;将Centos-7.repo库文件拷贝到该目录下。 然后清楚原有缓存yum clean all 生成新的缓存yum makecache 更新yum update –y 然后再确认/etc/yum.repos.d/不会有其他库文件&#xff0c;只留下…

RabbitMq生产者可靠性

基本概念&#xff1a; RabbitMQ生产者可靠性主要涉及确保消息能够可靠地发送到RabbitMQ服务器&#xff0c;并且在出现故障时能够进行适当的处理。 消息确认机制&#xff08;Publisher Confirms&#xff09;&#xff1a; 启用 Publisher Confirms&#xff1a;生产者在发送消息之…

elasticsearch设置账号和密码

1、es安装&#xff0c;挂载路径根据实际情况修改 docker run -d --restart always \ --name es \ -e "ES_JAVA_OPTS-Xms512m -Xmx512m" \ -e "discovery.typesingle-node" \ -e "TZAsia/Shanghai" \ -v /mnt/data/efk/es/data:/usr/share/elast…

Android高级控件

文章目录 1.下拉列表Spinner1.数组适配器ArrayAdapter2.简单适配器SimpleAdapter3.基本适配器BaseAdapter 2.列表视图ListView3.网格视图GridView4.翻页视图ViewPager5.翻页标签栏pagerTabStrip6.ViewPager实现引导页7.碎片Fragment1.Fragment静态注册2.Fragment生命周期3.Frag…

【数据库】MongoDB的索引功能及其在Java中的实现

MongoDB 的索引功能极大地提高了查询性能。通过创建索引&#xff0c;MongoDB 可以快速定位到数据&#xff0c;而无需扫描整个集合。本文将介绍 MongoDB 的索引功能及其在 Java 中的实现方法。 1. 什么是索引&#xff1f; 索引是数据库中用于快速查找和排序数据的一种数据结构。…

Hack Uboot

在硬件评估过程中&#xff0c;经常会遇到采用U-Boot的设备。本文旨在阐述U-Boot是什么&#xff0c;从攻击角度来看它为何如此吸引人&#xff0c;以及这种流行的引导程序所关联的攻击面。 U-Boot 特性 U-Boot&#xff0c;即通用引导加载程序&#xff08;Universal Boot Loader…

SpringBoot实现:古典舞在线交流平台全攻略

第一章 绪论 1.1研究背景 在当今的社会&#xff0c;可以说是信息技术的发展时代&#xff0c;在社会的方方面面无不涉及到各种信息的处理。信息是人们对客观世界的具体描述&#xff0c;是人们进行交流与联系的重要途径。人类社会就处在一个对信息进行有效合理的加工中。它将促进…

java中创建不可变集合

一.应用场景 二.创建不可变集合的书写格式&#xff08;List&#xff0c;Set&#xff0c;Map) List集合 package com.njau.d9_immutable;import java.util.Iterator; import java.util.List;/*** 创建不可变集合:List.of()方法* "张三","李四","王五…

问题解决实录 | bash 中 tmux 颜色显示不全

点我进入博客 如下图&#xff0c;tmux 中颜色显示不全: echo $TERM输出的是 screen 但在 bash 里面输出的是 xterm-256 color 在 bash 里面输入&#xff1a; touch ~/.tmux.conf vim ~/.tmux.conf set -g default-terminal "xterm-256color"使之生效 source …

【设计模式-中介者模式】

定义 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为设计模式&#xff0c;通过引入一个中介者对象&#xff0c;来降低多个对象之间的直接交互&#xff0c;从而减少它们之间的耦合度。中介者充当不同对象之间的协调者&#xff0c;使得对象之间的通信变得简单且…

微知-梅林系统设置无线桥接模式后如何登录梅林路由器?

背景&#xff1a; 本文将介绍2种使用路由器桥接后无法登录桥接路由器的解决办法&#xff0c;主要涉及到华为梅林系统&#xff08;刷机或者原生&#xff09;的无线桥接模式。 当图中梅林路由器设置为无线桥接模式后&#xff0c;连接到梅林路由器的调试电脑E&#xff0c;因为会从…

基于ucontext库实现协程类

文章目录 前言协程基础知识协程上下文对称协程与⾮对称协程有栈协程与⽆栈协程 ucontext库接口熟悉一个简单的函数切换自动调用 协程类的实现接口全局变量线程局部变量malloc封装协程切换构造函数协程执行的方法 测试协程切换手动切换复用 前言 协程&#xff08;Coroutine&…

【从0开始搭建微服务并进行部署】SpringBoot+dubbo+zookeeper

文章目录 说明环境搭建创建项目父模块设置子模块 dubbo-api子模块 dubbo-provider子模块 dubbo-consumer测试项目 docker部署项目完整项目地址 说明 jdk1.8SpringBoot2.x低版本dubbo&#xff1a;请查看之前教程【微服务】SpringBootDubboZooKeeper 实战 关于本教程将采用jdk1…

HTML流光爱心

文章目录 序号目录1HTML满屏跳动的爱心&#xff08;可写字&#xff09;2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心&#xff08;简易版&#xff09;7HTML粒子爱心8HTML蓝色动态爱心9HTML跳动的爱心&#xff08;双心版&#xff09;1…

百度飞桨(paddlepaddle)安装

百度飞桨&#xff08;paddlepaddle&#xff09;安装 Anaconda升级 打开 Anaconda Prompt &#xff08;或者 Mac 下的终端&#xff09;&#xff0c;键入&#xff1a; conda upgrade --all pip 安装 python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/s…

如何用AI绘画工具生成中国风插画?Midjourney保持风格一致出图

​ 如何运用AI绘画工具如Midjourney&#xff0c;生成符合我们特定要求的艺术作品是一门精进的技巧&#xff0c;尤其当你想生成具有鲜明特色的国风插画时&#xff0c;纯文本提示词的局限性常常使我们难以达到预期效果。然而&#xff0c;借助Midjourney的高级参数功能——特别是s…

【课程学习】随机过程之泊松过程

随机过程之泊松过程 泊松分布泊松过程 泊松分布 二项分布是离散性的分布&#xff0c;泊松分布是把二项分布取n趋于无穷得到的连续分布。也就是在一段时间内不停的观察某件事情发生的次数。 如&#xff1a;一个小时内观察一段路上经过行人的数目&#xff0c;如果每个半个小时观…

Prompt 模版解析:诗人角色的创意引导与实践

Prompt 模版解析&#xff1a;诗人角色的创意引导与实践 Prompt 模版作为一种结构化工具&#xff0c;旨在为特定角色——本例中的“诗人”——提供明确的指导和框架。这一模版详尽地描绘了诗人的职责、擅长的诗歌形式以及创作规则&#xff0c;使其能在自动化系统中更加精确地执…

【Unity】双摄像机叠加渲染

一、前言 之前我在做我的一个Unity项目的时候&#xff0c;需要绘制场景网格的功能&#xff0c;于是就用到了UnityEngine.GL这个图形库来绘制&#xff0c;然后我发现绘制的网格线是渲染在UI之后的&#xff0c;也就是说绘制出来的图形会遮盖在UI上面&#xff0c;也就导致一旦这些…

计算机网络:物理层 —— 物理层下的传输媒体

文章目录 传输媒体导向性媒体同轴电缆双绞线光纤光纤分类中心波长光纤规格光纤的优缺点 非导向性媒体ISM 频段无线电波微波激光红外线可见光 传输媒体 传输媒体是计算机网络设备之间的物理通路&#xff0c;也称为传输介质或传输媒介&#xff0c;并不包含在计算机网络体系结构中…