• 事件驱动


    事件驱动:
    
    编程中所有的程序是由事件决定 – 可以是由用户操作(键盘,鼠标),也可以是由其他程序和流的到达或者操作系统事件(如网络数据包到达)来触发执行.
    
    
    基于事件的程序常用到的最大好处是用来做异步,例如我们要下载 100 个文件,下载完后对这些文件进行处理.可能给每个下载和处理的过程写成事件,这些事件可以同步运行(关键在于网络连接和进行文件的读写 IO 时要等待,事件是给这些等待复用起来).
    
    
    WATCHERS(监控者)
    在 select 中,有个角色叫"监控者",就是 select 函数本身.
    在 AnyEvent 中不但可以监控 IO 还可以监控别的一些事件.来做不同的处理.我们可以看成这是不断的盯着某件事情的人
    有如下几个基本的内置的可以用来盯着的事情("监控者").
    
    TIMER : 监控时间,到了一定的条件,然后对不同的时间做不同的事件
    I/O: 这个是监控到 IO 是否可以读写,然后做相应的事件
    IDLE: 空闲时做什么事件
    SIGNAL : 监控观查到不同的信息,调用相应的事件
    CHILD PROCESS: 对子程序的状态来调用相应的处理事件
    
    
    各种WATCHERS(监控者)示例
    
    TIMER WATCHERS
    
    基本语法
    AnyEvent->timer(
    after => $seconds, # 多久之后做相应的操作.
    interval => $seconds, # 在上面条件生效后,每格多久进行一次 callback.
    cb => $cb, # cb 是 callback 的简写,所以知道了吧,只要到了前面的条件,就会运行 cb => 指向的函数.
    );
    
    使用实例
    下面的例子是,5 秒后,每 2 秒进行一次 callback 中的事件,直到 $w 这个注册的事件被 undef 为止(也就是 $count > 10 次).这个中的 undef $w 是取消掉这种 watcher 的方法.
    
    node1:/tmp#cat a1.pl 
    use AnyEvent;
    my $cv = AnyEvent->condvar;
    my $count = 0;
    my $w; $w = AnyEvent->timer(
    after => 5,
    interval => 2,
    cb => sub {
    print "$count===$count
    ";
    $count++;
    warn "这是第 $count 次调用";
    if ($count >= 10) {undef $w;}
    }
    );
    $cv->recv;
    
    node1:/tmp#perl a1.pl
    $count===0
    这是第 1 次调用 at a1.pl line 10.
    $count===1
    这是第 2 次调用 at a1.pl line 10.
    $count===2
    这是第 3 次调用 at a1.pl line 10.
    $count===3
    这是第 4 次调用 at a1.pl line 10.
    $count===4
    这是第 5 次调用 at a1.pl line 10.
    $count===5
    这是第 6 次调用 at a1.pl line 10.
    $count===6
    这是第 7 次调用 at a1.pl line 10.
    $count===7
    这是第 8 次调用 at a1.pl line 10.
    $count===8
    这是第 9 次调用 at a1.pl line 10.
    $count===9
    这是第 10 次调用 at a1.pl line 10.
    
    
    onclick事件 
    
    use Tk;
    use strict;  
    use DBI; 
    # Main Window
    my $mw = new MainWindow;
    my $but1 = $mw -> Button(-text => "view cpu",-width=>80,
    -command =>&push_button);
    $but1 -> pack();
    
    my $but2 = $mw -> Button(-text => "view memory",-width=>80);
    
    $but2 -> pack();
    
    my $but3 = $mw -> Button(-text => "view disk",-width=>80);
    
    $but3 -> pack();
    
    my $but3 = $mw -> Button(-text => "view Event",-width=>80);
    
    $but3 -> pack();
    MainLoop;
    
    #This is executed when the button is pressed
    sub push_button {
    print 'aaaaaaaaaaaaaa';
    }
    
    
    
  • 相关阅读:
    接口的显式实现和隐式实现
    MVC
    委托
    测试用例(TestCase)
    The remote server returned an error: NotFound.
    事件
    WCF大数据量传输配置
    多态随笔
    领域模型(domain model)
    IQueryable接口和IEnumberable接口
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13348293.html
Copyright © 2020-2023  润新知