zoukankan      html  css  js  c++  java
  • 回调函数的隐患

    如果你正在编写的类会通过回调函数或Observer模式广播某种状态的改变或时间的发生,那么请小心:你无法预料Observer会做什么事情,它可能又会调用这个类的某个方法,从而导致你的类被“重入”,这可能会破坏类状态。下面是本人在写代码时遇到过的类似情形:

    类ClassA::DoSomething()会处理某些数据,同时会将该情况通报给observer(假设关系已经预先设定好)。这个假设observer在SomethingHappened的实现中又调用了ClassA的RemoveData方法,那么不幸的事情发生了。

    这种问题有以下几种解决方案:

    1.对回调函数或事件处理函数施加一定的约束:比如规定了SomethingHappened的实现就不能call RemoveData方法。在GUI编程中,

    在对窗体的sizeChange事件处理中,不允许调整该窗体的size,否则会造成死循环,这个约束是合理的,自然的,容易让人理解的。但事情并不总是如此,如果程序的需求就要求能在SomethingHappened调用RemoveData呢?

    2、用post event取代回调函数,既在广播某种情况的发生时,不是通过回调函数,而是post一个event给observer对象。这样就使得DoSomething()的执行不会被打断,避免了类的重入。这种方法一遍需要某种Framework的支持。

    3、在Symbian下第二种方法可以用AO来实现,就是规定所有的observer在收到广播后启动一个CTimer AO,在这个AO的RUNL方法里面在去执行业务逻辑。

    4、调整DoSomething()代码:先复制一份mDataArray到函数局部,基于局部数据发出广播。

  • 相关阅读:
    CSS中可以通过哪些属性定义,使得一个DOM元素不显示在浏览器可视范围内?
    贝塞尔曲线
    A little composer
    ABAQUS操作笔记
    ABAQUS薄板实例
    引用
    引用、重载、递归概念及应用
    Photoshop图片处理-云毕业照
    图片存储大小更改
    论文公式之“公式居中,序号在右”
  • 原文地址:https://www.cnblogs.com/longhuihu/p/10423424.html
Copyright © 2011-2022 走看看