3.0 Disruptor的使用介绍(一)

        Disruptor:  其官网定义为:“A High Performance Inter-Thread Messaging Library”,即:线程间的高性能消息框架,与Labview的生产者、消费者模型很相似。

        其组成部分比较多,先介绍几个常用的概念:       

1.  Ring Buffer: Disruptor中的数据结构,用于存储生产者生产的数据。环形的缓冲区。
2.  Producer 即生产者,只是泛指调用 Disruptor 发布事件的对象   
3.  Consumer 消费者。处理事件(数据)的对象。
4.  Event 事件(数据)从生产者到消费者传递的数据叫做Event。
5.  EventHandler. 事件处理接口,事件(数据发布后) 触发该事件。

        ringbuffer可以理解成下面的样子。

一、理论比较复杂,先以一个实际案例感受下:

1. 建立一个ringbuffer,并且指定大小为8; 本窗体为消费者处理窗体

 private static readonly int _ringSize = 8;      //定义环大小
 private RingBuffer<PointPair> ringbuffer;   //

   var dis = new Disruptor.Dsl.Disruptor<PointPair>(
    () => new PointPair(), _ringSize, TaskScheduler.Default);
   dis.HandleEventsWith(this);      //定义本窗体作为事件的处理窗口。
   ringbuffer = dis.Start();

2.生产者使用时,在ringbuffer上申请一个序号,把内容填充后,发布(发送出去)

  long seqNo = ringbuffer.Next();    //从ringbuffer中申请一个位置(序号)
  PointPair NewPoint = ringbuffer[seqNo];
  NewPoint.X = .....;
  NewPoint.Y = .....);                       
  ringbuffer.Publish(seqNo);      //修改后,进行发布。

3. 有事件过来。消费者进行处理。

 public void OnEvent(PointPair data, long sequence, bool endOfBatch)
 {

        //

}

二、实际案例:

首先,通过Nuget安装4.0.0.0版本的Disruptor, 以及ZedGraph。最终效果如下(代码见下链接):

Disruptor的使用介绍(一),最简单的例子资源-CSDN文库

https://download.csdn.net/download/qq_34047402/90530673

 public partial class Form1: Form, IEventHandler<PointPair>{private static readonly int _ringSize = 8;private RingBuffer<PointPair> ringbuffer;PointPairList list1 = new PointPairList();public Form1(){InitializeComponent();var dis = new Disruptor.Dsl.Disruptor<PointPair>(() => new PointPair(), _ringSize, TaskScheduler.Default);dis.HandleEventsWith(this);ringbuffer = dis.Start();createPane(this.zedGraphControl1);Task.Factory.StartNew(() =>{while(true){Thread.Sleep(500);long seqNo = ringbuffer.Next();PointPair NewPoint = ringbuffer[seqNo];NewPoint.X = this.list1[this.list1.Count - 1].X + 1;NewPoint.Y = Math.Sin((double)NewPoint.X * 0.2);                       ringbuffer.Publish(seqNo);}});//Task.Factory.StartNew(//   () =>//   {//       while (true)//       {//           Thread.Sleep(500);//           long seqNo = ringbuffer.Next();//           PointPair NewPoint = ringbuffer[seqNo];//           NewPoint.X = this.list1[this.list1.Count - 1].X + 1;//           NewPoint.Y =3* Math.Sin((double)NewPoint.X * 0.2);//           ringbuffer.Publish(seqNo);//       }//   }//   );}public void OnEvent(PointPair data, long sequence, bool endOfBatch){list1.RemoveAt(0);list1.Add(data);if (this.zedGraphControl1.InvokeRequired){this.zedGraphControl1.Invoke(new Action(delegate{this.zedGraphControl1.AxisChange();this.zedGraphControl1.Refresh();}));}else{this.zedGraphControl1.AxisChange();this.zedGraphControl1.Refresh();}}private void createPane(ZedGraphControl zgc){//得到GraphPane的引用GraphPane myPane = zgc.GraphPane;// 设置标题 myPane.Title.Text = "Disruptor的介绍";myPane.XAxis.Title.Text = "My X Axis";myPane.YAxis.Title.Text = "My Y Axis";//生成正弦函数的数据集合 double x, y1, y2;for (int i = 0; i < 36; i++){x = (double)i ;y1 = Math.Sin((double)i * 0.2);list1.Add(x, y1);}//用钻石符合形状生成红色的曲线和图例LineItem myCurve = myPane.AddCurve("Porsche",list1, Color.Red, SymbolType.Diamond);//利用圆型的符号生成蓝色的曲线和图例        zgc.AxisChange();}}

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

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

相关文章

在 Windows 系统下,将 FFmpeg 编译为 .so 文件

1. 准备环境 确保你的 Windows 系统已安装以下工具&#xff1a; Android Studio NDK&#xff08;Native Development Kit&#xff09; MSYS2&#xff08;用于提供类 Unix 环境&#xff09; FFmpeg 源码 Git Bash&#xff08;可选&#xff0c;推荐使用&#xff09; 安装 …

leetcode二叉树3

404.左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24示例 2: 输入: root [1] 输…

QT网络通信的接口与使用

文章目录 前言1.服务端实现流程1.1步骤 1&#xff1a;创建 QTcpServer 并监听端口1.2步骤 2&#xff1a;处理新连接请求1.3步骤 3&#xff1a;接收客户端数据1.4步骤 4&#xff1a;处理客户端断开 2.客户端实现流程2.1步骤 1&#xff1a;创建 QTcpSocket 并连接服务器2.2步骤 2…

华为OD机试2025A卷七日集训第1期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第1期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、逻辑分析第3天、逻辑分析第4天、逻辑分析第5天、双指针第6天、二叉树第7天、回溯 六、集训总结六、国内直接使用最新GPT-4.5、满…

Qt 重入和线程安全

重入和线程安全 在整个文档中&#xff0c;"重入"和 "线程安全 "这两个术语被用来标记类和函数&#xff0c;以表明它们在多线程应用程序中的使用方式&#xff1a; 线程安全函数可以同时被多个线程调用&#xff0c;即使调用使用的是共享数据&#xff0c;因…

Elasticsearch:构建 AI 驱动的搜索体验

Elasticsearch 介绍 当你开始使用 Elastic 时&#xff0c;你将使用 Elasticsearch Relevance Engine™&#xff08;ESRE&#xff09;&#xff0c;它专为 AI 搜索应用程序提供支持。借助 ESRE&#xff0c;你可以利用一整套开发者工具&#xff0c;包括 Elastic 的文本搜索、向量…

鸿蒙生态开发

鸿蒙生态开发概述 鸿蒙生态是华为基于开源鸿蒙&#xff08;OpenHarmony&#xff09;构建的分布式操作系统生态&#xff0c;旨在通过开放共享的模式连接智能终端设备、操作系统和应用服务&#xff0c;覆盖消费电子、工业物联网、智能家居等多个领域。以下从定义与架构、核心技术…

JVM如何处理Java中的精度转换: 从源码到字节码

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

vue-next-admin修改配置指南

官方文档地址&#xff1a;vue-next-admin 1.如何开启侧边栏logo 在scr-layout-navbars-topBar-setings.vue中添加 getThemeConfig.value.isShowLogo true; 设置为true即可默认打开 2.修改侧边栏顶部的logo与文字 先把想要的图标存到我的项目然后下载 然后把后面的几个文件拉…

gin学习

gin学习笔记&#xff0c;不仅包含了基本的增删查改外&#xff0c;还包括参数传递&#xff0c;上传下载&#xff0c;模版、session与中间件等&#xff0c;方便收藏自习可用 文章目录 获得个请求get打印字符串get请求xmlget请求跳转http方法路由可以通过Context的Param方法来获取…

Flutter运行错误:UG! exception in phase ‘semantic analysis‘

最近在Mac Mini M4上通过Android Studio导入Flutter项目并运行&#xff0c;结果一直跑不起来&#xff0c;错误日志如下&#xff1a; 执行命令查看版本信息&#xff1a; flutter doctor --verbose通过输出信息Java version OpenJDK Runtime Environment (build 21.0.41242208…

【计算机网络运输层详解】

文章目录 一、前言二、运输层的功能1. 端到端通信2. 复用与分用3. 差错检测4. 流量控制5. 拥塞控制 三、运输层协议&#xff1a;TCP 和 UDP1. TCP&#xff1a;面向连接的可靠传输协议2. UDP&#xff1a;无连接的传输协议 四、端口号与进程通信1. 端口号分类2. 端口通信模型 五、…

51单片机和STM32 入门分析

51单片机和STM32是嵌入式开发中两种主流的微控制器&#xff0c;它们在架构、性能、应用场景等方面存在显著差异。以下是两者的对比分析及选择建议&#xff1a; 1. 51单片机与STM32的定义与特点 51单片机 定义&#xff1a;基于Intel 8051内核的8位微控制器&#xff0c;结构简单…

开源视觉语言模型MiniMax-VL-01:动态分辨率+4M超长文本,性能比肩GPT-4o

在人工智能领域&#xff0c;构建能够像人类一样理解、思考和行动的智能体&#xff08;AI Agent&#xff09;一直是研究人员的终极目标之一。而实现这一目标的关键在于模型是否具备足够强大的感知能力、记忆能力和推理能力。近期&#xff0c;国内人工智能公司MiniMax重磅开源了其…

excel 列单元格合并(合并列相同行)

代码 首先自定义注解CellMerge&#xff0c;用于标记哪些属性需要合并&#xff0c;哪个是主键**&#xff08;这里做了一个优化&#xff0c;可以标记多个主键&#xff09;** import org.dromara.common.excel.core.CellMergeStrategy;import java.lang.annotation.*;/*** excel…

flowable适配达梦7 (2.1)

经过第一版的问题解决&#xff0c;后端项目可以启动&#xff0c;前端页面也集成进去。 前端在流程设计页面报错 之后发现主要是组件中modelerStore这个值没有 解决方法:在data增加对象 给component/process/designer.vue 中涉及到的每个子组件传入 :modelerStore“modeler…

Prometheus Exporter系列-Mysql_Exporter一键部署

新项目旧项目都需要给研发配置mysql监控&#xff0c;这里mysql监控对应aws 阿里云 腾讯云 华为云的云mysql产品或开源自建mysql。 exporter安装虽然简单&#xff0c;经常手动操作不免让人心烦&#xff0c;一键完成省去繁琐的常规操作。 配置信息对的情况下测试多次都可以正常安…

2025年移动端开发性能优化实践与趋势分析

启动速度优化 本质&#xff1a;缩短首次可见帧渲染时间。 方法&#xff1a; iOS&#xff1a;利用Core ML本地模型轻量化部署&#xff0c;减少云端等待。Android&#xff1a;强制启用SplashScreen API&#xff0c;通过setKeepOnScreenCondition控制动画时长。冷启动需将耗时操…

【MySQL篇】DEPENDENT SUBQUERY(依赖性子查询)优化:从百秒到秒级响应的四种优化办法

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;从事IT领域✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(…