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到函数局部,基于局部数据发出广播。

  • 相关阅读:
    duilib clabelui 属性
    C++ 时间戳和时间的互相转换
    VS提示已有主体显示 的error解决办法
    Webrtc createoffer以后没有 onsuccess的回调
    VS error LNK2019: 无法解析的外部符号 _AcquireCredentialsHandleA
    VS LNK2019 无法解析的外部符号_GetAdaptersAddresses@20 错误解决办法
    duilib xml布局文件的属性设置
    Doris安装
    Oozie初探
    Notepad++ 常规骚操作
  • 原文地址:https://www.cnblogs.com/longhuihu/p/10423424.html
Copyright © 2011-2022 走看看