精华内容
下载资源
问答
  • 1、Qt中的事件Qt中,事件作为一个对象,继承自QEvent类,常见的有键盘事件QKeyEvent、鼠标事件QMouseEvent和定时器事件QTimerEvent等,继承关系图如下图所示:需要说明的是,事件与信号不相同。比如:鼠标单击按钮...

    dbbd6ba2c8bceed27ff83c3d8ed8fba3.png

    1、Qt中的事件

    Qt中,事件作为一个对象,继承自QEvent类,常见的有键盘事件QKeyEvent、鼠标事件QMouseEvent和定时器事件QTimerEvent等,继承关系图如下图所示:

    aae5125e934d9249ff78a462cdb1af83.png

    需要说明的是,事件与信号并不相同。

    比如:鼠标单击按钮,鼠标事件(QMouseEvent),而按钮本身发射clicked()信号。一般而言我们只需要关注单击信号,不用考虑鼠标事件。但是当我们要对该按钮做额外操作,不想通过信号处理,此时事件就是一个很好的选择。关闭事件(QCloseEvent)是一个常用的事件。

    2、事件的处理

    鼠标按钮信号分为单机,双击,右键等操作,而这对鼠标事件而言其都是一个鼠标事件,只不过用枚举类型QEvent::Type来区分不同的操作。QEvent的子类能够表示事件却不能处理事件。

    信号是通过connect()来绑定槽函数处理响应,那么事件是怎么处理的呢?

    处理事件有5种常用的方法:

    (1)、重新实现部件的paintEvent()、mousePressEvent()等事件处理函数。这是最常用的一种方法,不过只能用来处理特定部件的特定事件。

    (2)、重新实现notify()函数。这个函数的功能强大,提供了完全的控制,可以再事件过滤器得到事件之间就获得他们。但是,它一次只能处理一个事件。

    (3)、向QApplication对象上安装事件过滤器。因为一个程序只有一个QApplication对象,实现的功能和notify()函数相同,优点是可以同时处理多个事件。

    (4)、重新实现event()函数。QObject类的event()函数可以在事件达到默认事件处理函数之前获得该事件。

    (5)、在对象上安装事件过滤器。使用事件过滤器可以再一个界面类中同时处理不同子部件的事件。

    实际编程中最常用的是方法(1),其次是方法(5)。方法2要继承QApplication类,方法3需要全局的事件过滤器,减缓事件的传递。

    3、Qt事件过滤器

    很多时候,我们只对某些特定的事件比较关心,例如:鼠标单击或者键盘按下等事件。其它的事件我们并不关心它是否发生,也无需对它们进行处理,这个时候最直接的想法就是将这些事件过滤掉,这样做既可以免去对它们进行处理,也可以避免它们对程序其它部分产生影响。因此,我们引入了事件过滤器这个概念。

    如果对象安装了事件过滤器,则事件在到达目标对象之前先被事件过滤器截获,进行一些处理之后再交给目标对象。

    实现一个事件过滤包括两个步骤:

    (1)、 在目标对象上调用installEventFilter(),注册监视对象。

    (2)、 在监视对象的eventFilter()函数中处理目标对象的事件。

    这两步都在父窗口类中实现。

    后文将结合实例进一步学习,了解事件的传递。

    展开全文
  • 接口事件机制的理解

    2014-07-25 12:49:32
    最开始接触接口事件机制的时候还是很迷糊的,虽然讲过了格式,但还是记不住,并且对这些概念性的东西不是很懂,于是现在又重新看了一遍,仔细总结来了一遍,现在便谈谈我对这个接口事件机制的理解吧。  首先必须要...
      最开始接触接口事件机制的时候还是很迷糊的,虽然讲过了格式,但还是记不住,并且对这些概念性的东西不是很懂,于是现在又重新看了一遍,仔细总结来了一遍,现在便谈谈我对这个接口事件机制的理解吧。
      首先必须要明白接口是什么?接口的作用是什么?接口该怎么用?
      接口,在汉语定义上是两个不同系统或子程序交接并通过它彼此作用的部分。而在Java中,不同程序代码中的方法和属性需要联系在一起,这时接口便是他们联系在一起的纽带,接口通过定义一些常量,一些抽象方法,而类去实现这个接口,实现接口中的抽象方法,又由于不同类实现的是同一个接口的抽象方法,这时就有了方法名的统一。比如在一个公司中要多个程序员合作写一个程序,这时便给出一个接口,不同程序员通过实现这个接口,保证了方法名的一致,也可以说接口是一种特殊的父类,不过与父类不同的是他的方法都是抽象的,是不会有方法体的。可以说接口是丰富了继承同时有了一定的约束作用。
      那么接口该怎么用呢,首先是如何定义接口:
    定义接口的关键字:interface
    定义格式:
    public interface 接口名 extends 接口名,... {
       //定义常量
       public static final 数据类型 常量名 = 值;
       //定义抽象方法
       public 返回值数据类型 方法名(数据类型 形参名,...);
      public abstract 返回值数据类型 方法名(数据类型 形参名,...);
    }
    注意:
    1.常量名的每一个字母都必须要大写。
    2.抽象方法不能加{},因为"{}"表示方法有具体的实现。
    3.接口默认的访问修饰符就是public,而且还会带static和final,这表示定义的是一个常量。
    4.接口不能用来实例化对象。
    5.接口也是一种类。
      然后是实现接口:
    实现接口的关键字是: implements
    实现格式:
    public class 类名 extends 类或抽象类 implements 接口名,......{
      ......
    }
    注意:
    类必须实现接口中所有的抽象方法
    类可以同时实现多个接口,但只能继承一个父类
    类必须先继承类或抽象类再实现接口
      在了解接口后必须要区分的一个便是抽象类了,抽象类是一种和接口功能十分类似的类,他可以定义常量还有抽象方法,并且还有自己的构造方法和普通方法
    展开全文
  • 观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,自动更新。 场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新得逻辑增多...

    观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。

    场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新得逻辑增多之后,代码会变得难以维护.这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码。

    <?php
    /**
     * 观察者接口类
     * Interface ObServer
     */
    interface ObServer
    {
        public function update($event_info = null);
    }
    
    /**
     * 观察者1
     */
    class ObServer1 implements ObServer
    {
        public function update($event_info = null)
        {
            echo "观察者1 收到执行通知 执行完毕!\n";
        }
    }
    
    /**
     * 观察者1
     */
    class ObServer2 implements ObServer
    {
        public function update($event_info = null)
        {
            echo "观察者2 收到执行通知 执行完毕!\n";
        }
    }
    
    /**
     * 事件
     * Class Event
     */
    class Event
    {
    
        //增加观察者
        public function add(ObServer $ObServer)
        {
            $this->ObServers[] = $ObServer;
        }
    
        //事件通知
        public function notify()
        {
            foreach ($this->ObServers as $ObServer) {
                $ObServer->update();
            }
        }
    
        /**
         * 触发事件
         */
        public function trigger()
        {
            //通知观察者
            $this->notify();
        }
    }
    
    //创建一个事件
    $event = new Event();
    //为事件增加旁观者
    $event->add(new ObServer1());
    $event->add(new ObServer2());
    //执行事件 通知旁观者
    $event->trigger();

     

    展开全文
  • 上一篇 理解事件循环一(浅析)</a> 用例子简单理解了下 macrotask 和 microtask 这里再详细的总结下两者的区别和使用 简介 一个事件循环(EventLoop)中会有一个正在执行的任务(Task),而这个任务就是从 ...
  • 也给大家初步介绍了跟Touch事件分发息息相关的三个最重要的方法dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent,给大家留下了一个疑惑:Touch事件在ViewGroup和View中是怎么分发和传递的? 那么,本篇...

          上文我们彻底弄清楚了onTouch、onTouchEvent、onClick这三者的区别和联系,也弄清楚Touch事件的传递原则以及事件在Activity、DecorView中的分发和传递。也给大家初步介绍了跟Touch事件分发息息相关的三个最重要的方法dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent,并给大家留下了一个疑惑:Touch事件在ViewGroup和View中是怎么分发和传递的?    那么,本篇我们将为大家解决这个疑惑,重点介绍Touch事件在ViewGroup和View中的分发机制。

          首先要带大家探究的就是ViewGroup对Touch事件的分发过程,其主要实现是在ViewGroup的dispatchTouchEvent方法中实现的,该方法可以说是相当长、相当复杂。我们一段段来分析,我们先来看一下第一段源码:

    // Check for interception.
                final boolean intercepted;
                if (actionMasked == MotionEvent.ACTION_DOWN
                        || mFirstTouchTarget != null) {
                    final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;
                    if (!disallowIntercept) {
                        intercepted = onInterceptTouchEvent(ev);
                        ev.setAction(action); // restore action in case it was changed
                    } else {
                        intercepted = false;
                    }
                } else {
                    // There are no touch targets and this action is not an initial down
                    // so this view group continues to intercept touches.
                    intercepted = true;
                }

          很明显这一段是对对当前ViewGroup是否该拦截Touch事件进行判断。当当前的是DOWN事件或者当mFirstTouchTarget != null时会判断是否拦截当前事件。那么,这里读者可能有一个疑惑:mFirstTouchTarget是个什么东东???  看官别急,从后面的逻辑咱们可以看到,当ViewGroup的子View处理了Touch事件后,mFirstTouchTarget就会被赋值并指向该子View,换言之就是当ViewGroup不拦截事件并将其交给子View来处理是mFirstTouchTarget != null,一旦ViewGroup拦截事件那么mFirstTouchTarget != null就不成立了,那么当MOVE和UP事件到来的时候就不会走到ViewGroup的onInterceptTouchEvent方法中去了,整个一系列的事件将全部由该ViewGroup来处理。

         当然也有一种特殊情况,那就是FLAG_DISALLOW_INTERCEPT这个标记位,它是由requestDisallowInterceptTouchEvent方法来设置的,一般是在子View中调用。一旦FLAG_DISALLOW_INTERCEPT设置后,ViewGroup将无法拦截除了DOWN事件外的其它事件。为什么会是除了DOWN事件外的其它事件呢?因为如果是DOWN事件,那么就会重置FLAG_DISALLOW_INTERCEPT标记位,从而使子View设置的该标记位失效。所以如果是DOWN事件的话,总会调用onInterceptTouchEvent方法来询问是否拦截,这点从上述源码也能看出。通过下面的这段源码,我们能对ViewGroup处理DOWN事件有着更清晰的认识:

         

    if (actionMasked == MotionEvent.ACTION_DOWN) {
                    // Throw away all previous state when starting a new touch gesture.
                    // The framework may have dropped the up or cancel event for the previous gesture
                    // due to an app switch, ANR, or some other state change.
                    cancelAndClearTouchTargets(ev);
                    resetTouchState();
                }
          如果是DOWN事件,会停止和清除所有的TouchTarget也就是说此时mFirstTouchTarget肯定为空,并调用resetTouchState方法对FLAG_DISALLOW_INTERCEPT进行重置。至此,我们对ViewGroup的dispatchTouchEvent方法基本上已经了解清楚了,当然这还是纯粹从源码的角度来分析的,我们还得写个小demo来进行辅助验证:同样的,我们还是写一个MainActivity,里面有一个继承LinearLayout的自定义ViewGroup——TestLayout,该ViewGroup中放一个自定义的子View——TestView。

          

    /**
     * Created by leevi on 16/9/1.
     */
    public class TestLayout extends LinearLayout{
        private Context mContext;
        public TestLayout(Context context) {
            this(context,null);
            mContext = context;
        }
    
        public TestLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
            mContext = context;
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            Log.d("TestLayout", "dispatchTouchEvent!!!!!!");
            return super.dispatchTouchEvent(ev);
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            Log.d("TestLayout", "onInterceptTouchEvent!!!!!!");
            return super.onInterceptTouchEvent(ev);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            Log.d("TestLayout", "onTouchEvent!!!!!!");
            return super.onTouchEvent(event);
        }
    }
           先只关注ViewGroup的情况,这种情况下,我们点击TestView,能得到如下log:


           很明显可以看出能走到onInterceptTouchEvent方法,那我们再将dispatchTouchEvent方法的返回值改成true和false看看是什么结果:

           返回值改成true的情况:


          很明显可以看出,走了两次dispatchTouchEvent方法,说明DOWN 和 UP事件都只走到ViewGroup的dispatchTouchEvent方法就不能往下走了,会父上传递给父控件的onTouchEvent方法(后面会聊到。)

          那再来看看返回值是false的情况吧:


          纳尼!!!!!!!居然只打印了一次dispatchTouchEvent,这大大出乎我们的意料吧,意思是当我们DOWN事件到来后碰到这种情况整个Touch事件就结束了,后面的MOVE和UP事件都不会处理了。

          所以我们可以得出结论,只有当ViewGroup的dispatchTouchEvent返回super.dispatchTouchEvent(event)的时候才能将事件传递下去。


          那接下来我们就再以这个例子来探讨一下ViewGroup的onInterceptTouchEvent方法。

    public boolean onInterceptTouchEvent(MotionEvent ev) {
            if (ev.isFromSource(InputDevice.SOURCE_MOUSE)
                    && ev.getAction() == MotionEvent.ACTION_DOWN
                    && ev.isButtonPressed(MotionEvent.BUTTON_PRIMARY)
                    && isOnScrollbarThumb(ev.getX(), ev.getY())) {
                return true;
            }
            return false;
        }

         以上是ViewGroup的onInterceptTouchEvent的源码,我们可以理解成默认是返回false的,表示不拦截Touch事件。那么默认情况下,Touch事件是怎么传递的呢?在这里我要强调一句:View是没有onInterceptTouchEvent方法的,只有dispatchTouchEvent、onTouchEvent。

         当ViewGroup的onInterceptTouchEvent返回super或者false的时候,我们会得到以下log:


         从以上log我们可以看出,事件由ViewGroup的dispatchTouchEvent方法传递给onInterceptTouchEvent方法,再传递给子View的dispatchTouchEvent方法,最后传递给子View的onTouchEvent方法来处理。

        那如果我们将TestLayout的onInterceptTouchEvent方法的返回值改成true来拦截该事件呢?我们又会得到什么情况呢?


         我们可以发现,该事件不会传递到子View,并且会由onInterceptTouchEvent传递给onTouchEvent,由于没有任何部分能处理DOWN事件,所以MOVE和UP事件也不复存在了。这就是我们看到上述log并没有打印两次的原因。


        至此,Touch事件在ViewGroup中的传递我们基本上已经完全弄清楚了。那接下来我们看看当事件传递给子View后是怎么分发和传递的呢?首先我们也是来研究一下View的dispatchTouchEvent方法。同样还是从源码入手:

    public boolean dispatchTouchEvent(MotionEvent event) {
            // If the event should be handled by accessibility focus first.
            if (event.isTargetAccessibilityFocus()) {
                // We don't have focus or no virtual descendant has it, do not handle the event.
                if (!isAccessibilityFocusedViewOrHost()) {
                    return false;
                }
                // We have focus and got the event, then use normal event dispatch.
                event.setTargetAccessibilityFocus(false);
            }
    
            boolean result = false;
    
            if (mInputEventConsistencyVerifier != null) {
                mInputEventConsistencyVerifier.onTouchEvent(event, 0);
            }
    
            final int actionMasked = event.getActionMasked();
            if (actionMasked == MotionEvent.ACTION_DOWN) {
                // Defensive cleanup for new gesture
                stopNestedScroll();
            }
    
            if (onFilterTouchEventForSecurity(event)) {
                if ((mViewFlags & ENABLED_MASK) == ENABLED && handleScrollBarDragging(event)) {
                    result = true;
                }
                //noinspection SimplifiableIfStatement
                ListenerInfo li = mListenerInfo;
                if (li != null && li.mOnTouchListener != null
                        && (mViewFlags & ENABLED_MASK) == ENABLED
                        && li.mOnTouchListener.onTouch(this, event)) {
                    result = true;
                }
    
                if (!result && onTouchEvent(event)) {
                    result = true;
                }
            }
    
            if (!result && mInputEventConsistencyVerifier != null) {
                mInputEventConsistencyVerifier.onUnhandledEvent(event, 0);
            }
    
            // Clean up after nested scrolls if this is the end of a gesture;
            // also cancel it if we tried an ACTION_DOWN but we didn't want the rest
            // of the gesture.
            if (actionMasked == MotionEvent.ACTION_UP ||
                    actionMasked == MotionEvent.ACTION_CANCEL ||
                    (actionMasked == MotionEvent.ACTION_DOWN && !result)) {
                stopNestedScroll();
            }
    
            return result;
        }

           相比较ViewGroup的dispatchTouchEvent方法,View的dispatchTouchEvent方法要简便得多,主要是判断了有没有注册onTouchListener,如果onTouchListener中的onTouch方法返回true则不会走onTouchEvent方法。这也解释了我们在前面一篇所得到的onTouch方法的优先级高于onTouchEvent。从上面的log我们也能看出,当View 的dispatchTouchEvent返回super.dispatchTouchEvent时,事件是会传递给View的onTouchEvent的。那我们将该返回值改成true和false再来看看log的情况:

            先将返回值改为true。


          改成false的情况如下:


         我们可以看出,跟ViewGroup的情况非常相似,无论是返回true还是false,事件都没办法传递到View的TouchEvent中来。而这里我们会发现一个特别有意思的地方,当返回值为false的时候,事件会向上传递给父容器的onTouchEvent方法。这就是Touch事件的传递规则,先由外至内,如果内部不消化的话再由内传递至外。

        我们还是可以得出一个结论,只有当dispatchTouchEvent返回值是super.dispatchTouchEvent(ev)时,Touch事件才能向下传递。

        那最后我们再来看看View的onTouchEvent方法,默认返回值是false,代表不处理,不处理的话会传递给父控件的onTouchEvent方法。那我们如果将onTouchEvent的返回值改成true呢?

       

         我们可以看到,onTouchEvent方法返回true就将该事件消费了,事件不会再由内向外传递。那我们就通过一张流程图来总结一下Touch事件在ViewGroup和View中的分发和传递。




             通过上图,我们已经非常清楚地了解到了事件的分发机制。那最后我们就来了解一下,解决实际开发中冲突的两类方法:

             (1)、外部拦截法。所谓外部拦截法,就是Touch事件先传递给父容器,由父容器来决定拦截处理。如果父容器需要该事件,那就在onInterceptTouchEvent中返回true进行拦截,如果不需要该事件那就在onInterceptTouchEvent中返回false,将事件传递给子View。

            (2)、内部拦截法。内部拦截法顾名思义就是父控件默认不拦截任何事件,所有事件全部传递给子View,如果子View需要事件则在onTouchEvent中返回true消费,否则返回false交给父容器处理。这里需要配合requestDisallowInterceptTouchEvent方法使用,才能达到想要的效果。我们要重写子View的dispatchTouchEvent方法,根据具体情况调用requestDisallowInterceptTouchEvent来对请求父控件对事件进行拦截和不拦截。这里需要特别注意的是,父控件一定不能拦截DOWN事件,要不然所有事件都不会传递到子View了(前面已经验证了),内部拦截法也起不了作用了。



            至此,Touch事件分发机制基本上全部讲完了,相信大家结合上下两篇文章,对事件分发机制都有较为深入的了解了。后续还会带来更多高质量的博客,如果大家有什么需要深入了解的知识点,也可以再留言里跟我说,我可以根据你们的留言写相应的博客。

    展开全文
  • 写JS代码时经常用到DOM事件,却不怎么理解事件的一些相关原理。所以将关于DOM事件的知识系统整理一下,差不多涵盖DOM事件的方方面面。下面用到的事件表格和相关图片都来源于网上(代码都是自己亲手写的,验证正确)...
  • 我试着理解python的一些代码。我想用缩放选择打开图像的一部分保存选定的部分。现在我正在尝试通过按键快速保存打开和缩放的图像。为了更好地解释,我需要通过按键盘键来启动函数savefig()。在我尝试使用urwid模块...
  • 解决了 数据怎么来?从哪来?</strong> 的问题。 其次,<code>hexo提供的<code>__config.yml配置文件也可以记录在<code>json格式文件里。上述两者就成为了<code>SPA的应用源。我部署在<code>...
  • 这有点粗糙(不是非常简洁),但你可以做类似下面的事情(你当然可以使它更简洁省略中间变量,但我把它们放在这里以便更容易理解发生了什么).df['new'] = (df.reset_index().Date.diff() == pd.Timedelta('1min')).as...
  • Android 事件拦截机制

    千次阅读 2016-04-20 10:25:35
    其实理解这个问题不困难。  首先,你的明白事件拦截机制到底是怎么一回事?这里说的事件拦截机制,指的是对触摸事件的拦截机制。那何为触摸事件?所谓的触摸事件,就是指系统捕获的触摸屏幕所产生的事件。当我们...
  • 在上一章中我们有简要的介绍了事件源是怎么一回事,但是没有进行详细的描述。那么往下的这几个小节我们就需要把这方面的知识给补充完整。 这一节我们先主要围绕MonkeySourceNetwork这个事件源来学习事件源的框架...
  • 用户属性、事件、埋点是产品工作中常见的名词,但是对于新接触这些概念的同学来说,其实不特别好理解。接下来想用下面的内容,将这些概念说明白。一、生活案例假设你是一家便利店的老板,有三个固定的客户,他们...
  • 在上一章中我们有简要的介绍了事件源是怎么一回事。可是没有进行详细的描写叙述。那么往下的这几个小节我们就须要把这方面的知识给补充完整。 这一节我们先主要环绕MonkeySourceNetwork这个事件源来学习事件源的...
  • 摘要:事件驱动模型,也就是我们经常提到用到的观察者模式。当然也可以将其理解为发布-订阅模型。具体的实现要素有如下几个方面。1、首先是一对多的关系,一是目标对象,多则是观察者对象。比如报社是一个,而订报者...
  • 因为不知道怎么去运用,其实这个地方理解起来比较简单,我写这么一篇文章就是为了串一串这个知识点。 脱离源码浅谈分发 事件分发是在最上层 View 一直往下层传递事件通过 onTouchEvent(MotionEvent ev) 这个方法...
  • 其实理解这个问题不困难。 首先,你的明白事件拦截机制到底是怎么一回事?这里说的事件拦截机制,指的是对触摸事件的拦截机制。那何为触摸事件?所谓的触摸事件,就是指系统捕获的触摸屏幕所产生的事件。当我们...
  • 在上一章中我们有简要的介绍了事件源是怎么一回事,但是没有进行详细的描述。那么往下的这几个小节我们就需要把这方面的知识给补充完整。 这一节我们先主要围绕MonkeySourceNetwork这个事件源来学习事件源的框架...
  • 委托与事件(一)

    2018-06-28 12:52:59
    委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说不容易。它们就像是一道坎,过了这个坎的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得...
  • 概念性的东西,让你学会了怎么为控件添加事件。 然而,我不打算讲概念,我只想讲讲我对事件 驱动学习的理解。所以,这是一篇经过思考的文章。 事件类: Java___________ :java . util .EventObject JavaFX的一层...
  • 前言 续上一章将的addEventListener和attachEvent比较的第四个不同点续讲… 事件冒泡 概念: 当一个元素接收到事件的时候 会把他接收到的事件传给自己的父级,一直...这就话怎么理解 >>> 看代码 var ...
  • 学习和理解C#的委托

    2019-09-28 16:26:06
    去年自学C#用的教程是入门级的《学通C#的24堂课》,教材里面也没有...对于如我一样的初学者来说,较好地理解委托和事件并是一件容易的事。其实掌握了的人,会觉得也没什么,而没有掌握的人,每次见到委托和事件就...
  • 去年学习C#的时候按照进度把C#的委托和事件“认真”的学习了一下,自己知道委托和事件的重要性,所以也努力的学习,可说实也没怎么学懂。碰巧这段时间在做一个解析GPS数据的小项目,因为其中有需要条件自动判断...
  • 深入理解 JS 垃圾回收

    2020-12-09 17:06:52
    JS之memoization,memoization 的原理是以参数作为 key,函数结果作为 value, 用对象进行缓存起来,以内存空间换 CPU 执行事件。memoization 的潜在陷阱即是严格意义的缓存有着完善的过期策略,而普通对象的键值对...
  • 软件工程的理解

    2020-06-29 22:57:22
    以程序员的我,表示没有什么卵用。直到有一天,我明白了原来软件工程讲的是让我怎么开展一件事情。 软件工程 软件工程 事件 产物 问题的定义 对系统的实际用户和使用部门负责人的访问调查 提出关于问题...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 218
精华内容 87
关键字:

并事件怎么理解