Event Handler

iOS下的定时器之NSTimer & CADisplayLink & GCD

不打扰是莪最后的温柔 提交于 2020-08-16 02:53:55
概述 在日常的开发中,我们经常需要跟定时打交道,比如刷新界面动画,短信倒计时发送等,这便笔记总结了一些我在工作中使用到的一些开发,请大家多交流 NSTimer iOS中最基础的定时器,本质是通过Runloop来实现的,一般情况下比较准确,但是当运行循环耗时操作比较多时,就会出现不准确。同时也受所加入Runloop的Mode影响,具体可以参考Runloop的特性 创建 构造方法主要分为自动启动和手动启动,手动启动的构造方法需要我们在创建NSTimer后启动它,iOS10之后还加入block的构造方法,防止内存泄漏,点赞 /// 构造并开启(启动NSTimer本质上是将其加入RunLoop中) // "scheduledTimer"前缀的为自动启动NSTimer的,如: + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block /// 构造但不开启 // "timer"前缀的为只构造不启用的,如: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)

C#设计模式之订阅发布模式

試著忘記壹切 提交于 2020-08-16 01:50:10
什么是Pub-Sub 发布订阅是一种设计模式,它允许应用程序组件之间进行松散耦合。 其实订阅发布设计中主要是发布者生成事件通道,用于在不了解任何订阅者存在的情况下通知订阅者。 当然委托EventHandlers和Event关键字在此事件处理机制中担任着重要的角色。下面我们来看看如何使用它们。 Pub和Sub的使用 首先我们看一个简单地订阅发布模式. 定义一个Action委托,无返回值. namespace PubSubPattern { public class Pub { public Action OnChange { get; set; } public void Raise() { if (OnChange != null) { //Invoke OnChange Action OnChange(); } } } class Program { static void Main(string[] args) { var p = new Pub(); p.OnChange += () => Console.WriteLine("Sub 1"); p.OnChange += () => Console.WriteLine("Sub 2"); p.Raise(); Console.WriteLine("Press enter !"); Console.ReadLine(); }

Abp领域事件(EventBus)源码解析

廉价感情. 提交于 2020-08-15 21:46:36
Abp中使用EventBus来解耦领域中的业务逻辑,也是订阅-发布模式的一种实现。简单来说就是,当我触发一个事件,注册了这个事件的处理器就会被找到并执行。 先看看整体代码结构 其中 Entities 文件夹中是对于实体相关的领域事件的实现与本章主题无关,我们就可以先当他不存在了。 可以看到有四个东西我们需要注意 EventData 这个我们可以就当作是事件类型,需要触发的事件就是这个东西。 EventHandler 事件处理器。当有事件触发的时候,如果处理器注册了这个事件那么会来执行这个处理器 EventHandlerFactory 事件处理器工厂。 维护事件处理器的新建,获取和销毁。一个事件处理器对应一个事件处理器工厂 EventBus 负责注册,取消注册和触发事件 我们把这四个东西联合起来描述下领域事件的流程就是这样的(一个例子): 我定义了一个订单创建成功的事件 OrderCreated_EventData 当订单创建成功,我需要发送邮件,那么我创建一个处理器, SendMailEventHandler 将 SendMailEventHandler 包装到一个工厂中,并 和 OrderCreated_EventData 一起注册到 EventBus 里面 通过 EventBus 触发事件 OrderCreated_EventData ,那么就会执行已经

Reactor和Proactor对比

試著忘記壹切 提交于 2020-08-14 03:23:18
常见的IO事件处理模型有两种:Reactor和Proactor。Redis中的ae就是采用的Reactor事件处理模型,Proactor需要操作系统的支持,目前暂时还没接触到相关的使用场景,主要是学习模型结构。 Reactor模型 Handler :用来标识一个文件描述符 Synchronous Event Demultiplexer :同步事件多路分解器,由select、poll或者epoll函数来实现,调用后会阻塞,直到等待Handler上的一个或多个事件发生 Event Handler :事件处理接口 Concrete Event Handler :事件处理接口的实现类,用来实现应用程序所提供的特定事件处理逻辑 Reactor :Reactor反应堆,主要实现以下功能: 1)注册和删除关注的文件描述符 2)运行事件循环 3)有就绪事件到来时,分发事件到之前注册的回调函数上处理 Reactor时序图 运行主程序,将关注的事件handler注册到Reactor中 主程序调用Reactor,进入无限事件循环,等待注册的事件到来 当事件到来时,调用select返回待处理的事件,Reactor将事件分发到之前注册的回调函数中去处理 Proactor模型 Handler :用来标识一个文件描述符; Asynchronous Operation Processor :异步操作处理器

EventBus/EventQueue 再思考

馋奶兔 提交于 2020-08-13 02:13:15
EventBus/EventQueue 再思考 Intro 之前写过两篇文章,造轮子系列的 EventBus / EventQueue ,回想起来觉得当前的想法有点问题,当时对 EvenStore 可能有点误解,有兴趣可以参考 https://www.cnblogs.com/weihanli/p/implement-a-simple-event-bus.html / https://www.cnblogs.com/weihanli/p/implement-event-queue.html , 最近把 Event 相关的逻辑做了一个重构,修改 EventStore ,引入了 IEventHandlerFactory ,重新设计了 Event 相关的组件 重构后的 Event Event: 事件的抽象定义 EventHandler:事件处理器抽象定义 EventHandlerFactory:事件处理器工厂,用来根据事件类型获取事件处理器(新增) EventPublisher:事件发布器,用于事件发布 EventSubscriber:事件订阅器,用于管理事件的订阅 EventSubscriptionManager:事件订阅管理器,在 EventSubscriber 的基础上增加了一个根据事件类型获取事件订阅器类型的方法 EventBus:事件总线,由 EventPubliser 和

诺禾-EventBus/EventQueue 再思考

五迷三道 提交于 2020-08-11 13:56:03
最近把 Event 相关的逻辑做了一个重构,修正 EventStore,引入了 IEventHandlerFactory,重新设计了 Event 相关的组件 重构后的 Event Event: 事情的笼统定义 EventHandler:事情处置器笼统定义 EventHandlerFactory:事情处置器工厂,用来依据事情类型获取事情处置器(新增) EventPublisher:事情发布器,用于事情发布 EventSubscriber:事情订阅器,用于管理事情的订阅 EventSubscriptionManager:事情订阅管理器,在 EventSubscriber 的根底上增加了一个依据事情类型获取事情订阅器类型的办法 EventBus:事情总线,由 EventPubliser 和 EventSubscriber 组合而成,用来比拟便当的做事情发布和订阅 EventQueue:事情队列,希望某些音讯次第处置的时分能够思索用 EventQueue 的形式 EventStore:事情存储,事情的耐久化存储(在之前的版本里,EventStore 实践作用是一个 EventSubscriptionManager,在最近的版本更新中已修正) 以上 EventSubscriber 和 EventSubscriptionManager 普通不直接用,普通用 EventBus 来处置即可

C#实现WinForm窗体逐渐显示效果

旧城冷巷雨未停 提交于 2020-08-11 09:32:43
C#实现WinForm窗体逐渐显示效果,这个博客园里面已经有其它人已经实现了,原理很简单,就是通过定时改变窗体的透明度(从0到1,即透明度从完全透明到不透明),我这里也是按照这个思路来实现的,但是我做的这个窗体是可复用的,即其它窗体继承自它后,就能实现渐显效果,代码如下: using System; using System.ComponentModel; using System.Windows.Forms; namespace TEMS.Forms { public partial class FormBase : Form { private Timer formTimer = null ; /// <summary> /// 获取Opacity属性 /// </summary> [DefaultValue( 0 )] [Browsable( false )] public new double Opacity { get { return base .Opacity; } set { base .Opacity = 0 ; } } public FormBase() { InitializeComponent(); formTimer = new Timer() { Interval = 100 }; formTimer.Tick += new EventHandler

javafx启动第二个窗体

我的梦境 提交于 2020-08-11 01:04:29
特别要注意第二窗体对应的view的fxml文件路径写法(view和controller都放在各自的包下): @FXML protected void show2Action() throws IOException { Stage stage = new Stage(); stage.setTitle("第二个窗体实验"); AnchorPane pane = FXMLLoader.load(getClass().getResource("../javafxcontroller2.fxml"));//要注意fxml文件的类路径写法(与本JavaFXController.java的相对关系) Scene scene = new Scene(pane,300,400); stage.setScene(scene); stage.initModality(Modality.APPLICATION_MODAL);//模式窗体 stage.setOnCloseRequest(new EventHandler<WindowEvent>() { @Override public void handle(WindowEvent event) { System.out.println("window close event"); if(i++<2){ event.consume(); // i=0;

C#拾色器工具源码

大兔子大兔子 提交于 2020-08-10 07:47:43
public partial class MainForm : Form { private MouseKeyHook mousekeyHook = new MouseKeyHook(); private Timer time = new Timer(); private Point point; private int width = 40 ; private int height = 40 ; public MainForm() { InitializeComponent(); } private void MainForm_Load( object sender, EventArgs e) { try { this .mousekeyHook.MouseMoveEvent += new MouseKeyHook.MouseMoveHandler( this .Mouse_Move); this .mousekeyHook.MouseClickEvent += new MouseKeyHook.MouseClickHandler( this .Mouse_Click); this .mousekeyHook.DirectionKeyDown += new KeyEventHandler( this .Direction_KeyDown); this .time.Tick +=

python中文件变化监控-watchdog

99封情书 提交于 2020-08-09 21:34:41
起步 在python中文件监控主要有两个库,一个是 pyinotify ,一个是 watchdog 。pyinotify依赖于Linux平台的inotify,后者则对不同平台的的事件都进行了封装。因为我主要用于Windows平台,所以下面着重介绍watchdog(推荐大家阅读一下watchdog实现源码,有利于深刻的理解其中的原理)。 watchdog在不同的平台使用不同的方法进行文件检测。在init.py中发现了如下注释: |Inotify| Linux 2.6.13+ ``inotify(7)`` based observer |FSEvents| Mac OS X FSEvents based observer |Kqueue| Mac OS X and BSD with kqueue(2) ``kqueue(2)`` based observer |WinApi|(ReadDirectoryChangesW) MS Windows Windows API-based observer |Polling| Any fallback implementation 给出示例代码如下: #!/usr/bin/env python # -*- coding:utf-8 -*- # Created by victor # 本模块的功能:<检测文件夹变化> #