状态机

.NET 异步编程

心已入冬 提交于 2020-01-02 05:08:22
计算限制的异步操作 如果CPU的使用率不到100%,表明当前运行的进程没有使用计算机全部计算能力(IO操作时,设备驱动管理器让硬件设备在干活儿,而CPU无事可做),此时可以并行执行计算,提高资源利用率,能显著提高应用程序的吞吐能力。 ThreadPool Task Parallel的静态方法For ,ForEach ,Invoke方法 PLINQ (Parallel LINQ) 定时计算限制操作Timer 1.System.Threading.Timer 2.System.Windows.Forms.Timer 3.System.Windows.Threading.DispatcherTimer 4.Windows.UI.Xaml.DispatcherTimer 5.System.Timers.Timer 本质是System.Threading.Timer的包装类,不建议使用 注意Timer.Change()方法的使用,防止调用时间重叠。 static void DoOneByOne() { Timer timer = null; Random r = new Random(); timer = new Timer(x => { Console.Write(Thread.CurrentThread.ManagedThreadId + " "); Console.WriteLine

幂等性的实现方案

随声附和 提交于 2019-12-31 02:37:34
我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果的。 幂等性的概念 幂等(Idempotent)是一个数学与计算机学的概念,常见于抽象代数中。 f(n) = 1^n // 无论n等于多少,f(n)永远值等于1 在编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数或幂等方法是指可以使用相同参数重复执行,并能获得相同结果的函数/方法。这些函数/方法不会影响系统状态,因此不用担心重复执行会对系统造成改变。例如: 1.前端重复提交选中的数据,后台也只会产生对应这个数据的一个反应结果。 2.用户发起一笔付款请求,就应该只扣用户一次钱,即使遇到网络重发或系统bug重发请求,也应该之扣一次钱。 3.发送验证短息也应该只发一次,同样的验证短信不应该发送多次。 4.创建业务订单,一个业务请求只能创建一个业务订单,创建多个就会出大问题。 这些等等很多的业务逻辑都需要幂等的特性来支持。 简单来理解就是,幂等就是一个操作,这个操作不管执行多少次,产生的效果和返回的结果都是一样的。比如说有一个getOne()函数,无论执行这个函数多少次,它返回的都是1,这时就可以说它是一个幂等函数。 幂等性的技术方案 1.查询操作 查询一次和查询多次,在数据不变的情况下,查询结果都是一样的,select是天然的幂等操作。 2.删除操作 删除操作也是幂等的

Qt状态机实例

筅森魡賤 提交于 2019-12-28 04:30:56
本文转载自: https://www.cnblogs.com/hicjiajia/archive/2011/01/19/1939507.html 作者:hicjiajia 转载请注明该声明。 Qt4.6引入了动画框架,摆脱了以往控件只能安静的呆在布局里的时代,利用Qt提供的动画框架,我们可以让控件跳起舞来,呵呵,很有趣啊… 在Qt4.7中又引入了Qt quick技术,其中的QML语言也是专门来定制GUI动画效果的,这是一种新的GUI动画机制,我刚也接触了些,语法类似CSS,实现预定义的动画很方便,所见即所得,路还得一步步走,先学习一下传统的Qt动画方式—— 状态机 这里先直接给出例子(见图): 下面是源码: #include < QApplication > #include < QStateMachine > #include < QPushButton > #include < QSignalTransition > #include < QPropertyAnimation > int main( int argc, char ** argv) { QApplication app(argc,argv); QWidget * w = new QWidget; w -> resize( 240 , 320 ); QPushButton * button = new

C#状态机简记

非 Y 不嫁゛ 提交于 2019-12-23 00:23:23
状态机 简介 基础状态抽象类 状态机父类 示例 本人的状态机使用代码简记。 简介 只是简单地状态转换。 基础状态抽象类 using UnityEngine ; /// <summary> /// 基础状态机抽象类 /// </summary> /// <typeparam name="T">其状态衍生类的状态类型枚举</typeparam> public abstract class BaseState < T > : OnStateEnter , OnStateUpdate , OnStateRepeat , OnStateExit where T : struct { public BaseState ( Object owner ) { m_owner = owner ; } protected T m_stateType ; public T StateType { get { return m_stateType ; } } protected Object m_owner ; public Object Owner { get { return m_owner ; } } public virtual void OnEnter ( ) { } public virtual void OnUpdate ( ) { } public virtual void

有限状态机(FSM)的设计与实现(二)

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-22 09:28:03
分层状态机的设计: 对于状态较多的状态机,通常的设计会维护一个庞大的二维矩阵,所有状态耦合在一起,这往往导致维护困难,由于可能存在许多公共的特性,也会导致许多状态具有相同的处理函数。针对这些问题我们可以通过设计分层状态机来解决,主要的思想就是根据不同的功能模块设计出多个状态机,各个状态机分布在不同的层次上。上层状态机调用下层状态机时,上层状态机入栈,下层状态机变为当前处理状态机。通常我们使用堆栈来保存当前状态机的上层状态机信息。 下图描述一个分层状态机设计实现: 如上图所示,假设L1为上层状态机,L1状态机在L1_STATE2中可以通过L1L2_EVENT1事件触发进入L2状态机,L2状态机在L2_STATE2中通过L1L2_EVENT2事件触发返回L1状态机,L1和L2各自维护自己的状态表。 数据结构: struct FSM_S { int curState; //当前状态机状态 int curFsmTableSize; //当前状态机查询表大小 STATE_TABLE_T* curFsmTable; //当前状态机查询表 FSM_STACK_T stack[MAX_FSM_STACK_DEP];//状态机堆栈 int curStackTop; //栈顶 FSM_REGIST_T registFsm[MAX_FSM_NUM]; //注册状态机 int registFsmNum;

基于FPGA的有限状态机浅析

三世轮回 提交于 2019-12-22 09:24:31
  前言:状态机大法好,状态机几乎可以实现一切时序逻辑电路。 有限状态机(Finite State Machine, FSM),根据状态机的输出是否与输入有关,可分为Moore型状态机和Mealy型状态机。Moore型状态机输出仅仅与现态有关和Mealy型状态机不仅与现态有关,也与输入有关,所以会受到输入的干扰,可能会产生毛刺(Glith)的现象,所以我们通常使用的是Moore型状态机。 状态机的编码,二进制编码(Binary),格雷码编码(Gray-code),独热码(One-hot)。不同的编码方式是防止在状态转移中发生突变,使得状态转移更为稳定,系统更加可靠,但是通常情况下我们直接采用的是二进制进行编码,除非系统对稳定性和状态编码有特殊要求。 状态机的描述,一段式、二段式、三段式。 一段式状态机,将组合逻辑和时序逻辑混合在一起,这样的写法对于逻辑简单的状态机来说还是可以使用的,但是对于复杂的逻辑就不推荐了,如果状态复杂也会容易出错,而且一个always块中信号太多也不利于维护和修改。 1 //状态参数声明 2 parameter S0 = 4'b0000, 3 S1 = 4'b0001, 4 s2 = 4'b0010; 5 //FSM one segment 6 reg [3:0] state; 7 always @(posedge clk or negedge rst_n

彻底搞懂状态机(一段式、两段式、三段式)

故事扮演 提交于 2019-12-22 09:24:11
实例:FSM实现10010串的检测 状态转移图:初始状态S0,a = 0,z = 0.如果检测到1,跳转到S1。 下一状态S1,a = 1,z = 0.如果检测到0,跳转到S2。 下一状态S2,a = 0,z = 0.如果检测到0,跳转到S3。 下一状态S3,a = 0,z = 0.如果检测到1,跳转到S4。 下一状态S4,a = 1,z = 0.如果检测到0,跳转到S5。 下一状态S5,a = 0,z = 1.如果检测到1,跳转到S1;如果检测到0,跳转到S3(因为之前S4已经是1,S5是0,若再检测到0,就是100,因此跳转到S4)。 程序中将一段式(one_fsm)、两段式(two_fsm)、三段式(three_fsm)以及对应的仿真文件(XXX_tb)包含在了一个工程中。要单独运行、仿真每一种方式,只需将他们( one_fsm.v、two_fsm.v、three_fsm.v )分别设为顶层文件(选中右击,然后选择Set as Top-Level En ti ty),然后在仿真设置里面选择对应的仿真文件即可。见下图: 补充: (转)PART1 1、好的状态机标准 好的状态机的标准很多,最重要的几个方面如下: 第一,状态机要安全,是指FSM不会进入死循环,特别是不会进入非预知的状态,而且由于某些扰动进入非设计状态,也能很快的恢复到正常的状态循环中来。这里面有两层含义

Verilog IIC通信实验笔记

╄→гoц情女王★ 提交于 2019-12-22 06:33:10
Verilog IIC通信实验笔记 Write by Gianttank 我实验的是 AT24C08的单字节读,单字节写,页读和页写,在高于3.3V系统中他的通信速率最高400KHZ的,我实验里用的是100KHZ的速率。图1是硬件原理图 图1 图2 图2是器件地址,我的原理图是A2接高。 IIC通信协议中要注意的地方: 1. 当时钟线SCL 高电平时,如果把数据线SDA 从高电平拉到低电平,则表示通信开始(START);如果把数据线SDA 从低电平拉到高电平,则表示通信结束(STOP)。SDA数据不变,视为数据采样。 2. 前一个STOP 结束后。与下一个START开始要保证5ms的间隔。 3. 页写有字节限制,而页读没有,可以一次读出所有的数据。 4. SDA信号在FPGA为接受方时要设置为高阻态。 5. 应答信号永远是接收方发送的,这个很重要,我就是卡在这里几天没找到原因。FPGA在读数据的时候,第9个周期是FPGA发低电平给EEPROM的。 图3为RTL视图 图3 引脚定义 信号名称 方向 描述 clk input 50M的主时钟 rst_n input 复位信号 sw1 input 按键1 低电平有效 按下执行字节写 sw2 input 按键2 低电平有效 按下执行字节读 sw3 input 按键3 低电平有效 按下执行 页写 sw4 input 按键4 低电平有效

UML中的事务

半城伤御伤魂 提交于 2019-12-21 15:14:22
前言 什么是UML,它是如何定义的呢?   UML是一种面向对象的建模语言,它的作用是帮助用户对软件系统进行面向对象的描述和建模,它可以描述整个软件从需求分析直到实现和测试的开发全过程。 组成: UML中的事务: 事务分为四类:结构、行为、组织、辅助等事务。 结构事务:有以下七种。 一、类(Class)  类是具有相同属性、相同方法、相同语义和相同关系的一组对象集合。一个类可以实现一个或多个接口。UML图中类又包括类名、属性和方法的矩形来表示。如下图所示: 二、接口(Interface)  接口是指类或组件所提供的、可以完成特定功能的一组操作的集合。接口描述了类或组件的对外的、可见的动作。通常一个类实现一个或多个接口。在UML图中,接口通常用一个圆形来表示。 三、用例(Use Case)   用例定义了系统执行的一组操作,对特定的用户产生可以观察的结果。用例通常用一个实线椭圆表示。 四、协作(Collaboration)  协作定义了交互的操作,表示一些角色和其他元素一起工作,提供一些合作的动作。一个给定的类可能是几个协作的组成部分,这些协作代表构成系统的模式的实现。通常用一个虚线椭圆表示。 五、活动类(Active Class)  活动类是指类对象有一个或多个线程或进程的类。活动类的表示方法和普通类的表示方法相似,也是用一个矩形表示,只是最外面的边框使用的是粗线。 六、组件

Web服务器——HTTP状态机解析

99封情书 提交于 2019-12-21 06:06:07
Web服务器——HTTP状态机解析 程序说明 主要练习HTTP解析的状态机的使用。接收一个客户端请求,判断是否是一个正确的GET请求,并解析出相应字段。   主要练习HTTP解析的状态机的使用。接收一个客户端请求,判断是否是一个正确的GET请求,并解析出相应字段。   有两个状态机,主状态机和从状态机,分别解析出相关字段。   注意一个地方,每次recv时,并没有把buffer给覆盖,而是继续加到buffer现有字段的后面,类似于append方式读取。   当读取到构成一个完整的行(携带\r\n)时,然后开始进行解析,分两步:     第一步,解析GET、 index.html、HTTP/1.1等信息     第二步,解析Host信息   其实就是按照请求消息的内容顺序解析储这4个字段。 运行方法 编译 g++ main.cpp -o main 直接运行也可以,默认ip为127.0.0.1,默认端口为8888 运行 curl 127.0.0.1:7777/index.html 运行结果: 客户端发起请求: # 方式1:命令行curl方式 yongpu@ubuntu:~$ curl 127.0.0.1:7777/index.html I get a correct result # 方式2:浏览器 输入: 127.0.0.1:7777/index.html 浏览器页面无法显示结果