<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    統計

    留言簿(1)

    DB

    Others

    QA

    Tech Website

    閱讀排行榜

    評論排行榜

    回調機制

    一、基本概念
    軟件模塊之間總是存在著一定的接口,從調用方式上,可以把他們分為三類:同步調用、回調和異步調用。
    同步調用是一種阻塞式調用,調用方要等待對方執行完畢才返回,它是一種單向調用,如HTTP;
    回調是一種雙向調用模式,也就是說,被調用方在接口被調用時也會調用對方的接口;
    異步調用是一種類似消息或事件的機制,不過它的調用方向剛好相反,接口的服務在收到某種訊息或發生某種事件時,會主動通知客戶方(即調用客戶方的接口),如JMS;
    回調和異步調用的關系非常緊密,通常我們使用回調來實現異步消息的注冊,通過異步調用來實現消息的通知。同步調用是三者當中最簡單的,而回調又常常是異步調用的基礎。



    二、基本實現
    在C語言中,如果參數是一個函數指針,調用者可以傳遞一個函數的地址給實現者,讓實現者去調用它,這稱為回調函數。

    #include <stdio.h>
    #include 
    <stdlib.h>

    typedef 
    void (*callback_t) (void *);
    void repeat_three_times(callback_t, void *);
    void say_hello(void *str);
    void count_numbers(void * num);
    main()
    {
          repeat_three_times(say_hello,
    "guys");
          repeat_three_times(count_numbers, (
    void*4);
          system(
    "pause");
    }


    void repeat_three_times(callback_t f, void *para){
         f(para);
         f(para);
         f(para);
         }

    void say_hello(void *str){
         printf(
    "hello %s\n", (const char*)str);
         }

    void count_numbers(void * num){
         
    int i ;
         
    for(i = 1; i <= (int)num; i++)
               printf(
    "%d ", i);
         putchar(
    '\n');
         }


    在面向對象的語言中(以Java為例),主要利用多態來實現回調,其原理和觀察者模式相似,被調函數首先要在調用者身上注冊,當某一事件觸發時,回調函數被觸發;有個很形象的說法:我去找你解決一個問題,但你目前也不知道如何解決,要研究一會,我就把我的聯系方式告訴你,你解決問題后主動告訴我吧。這就是一個異步的回調,我省去了一直等待這個過程,我可以利用這些時間去處理別的事情。

    一個詳細的代碼例子:
    2011年4月29日
    package callback;

    public interface ICallback {
        
    public void execute();
    }



    package callback;

    public class CallWithCallback implements ICallback{

        
    public CallWithCallback(){}
        
        
    public void execute() {
            System.out.println(
    "execute callback function..");
        }


    }


    package callback;

    public class Caller {
        
        
    private ICallback callback;
        
    public void setCallback(ICallback callback) {
            
    this.callback = callback;
        }

        
        
    public Caller(){}
        
        
    public void doCallback(){
            
    this.callback.execute();
        }

        
    }


    package callback;

    public class CallerDriveMain {

        
    public static void main(String[] args) {
            Caller caller 
    = new Caller();
            caller.setCallback(
    new CallWithCallback());  //注冊
            caller.doCallback();  //調用

        }


    }


    三、參考資料
    1)異步消息的傳遞-回調機制
    2)C語言回調函數

    posted on 2011-04-29 22:36 XXXXXX 閱讀(371) 評論(0)  編輯  收藏 所屬分類: Programing

    主站蜘蛛池模板: 久久亚洲精品中文字幕无码| 亚洲国产精品专区在线观看| 亚洲AV乱码久久精品蜜桃| A国产一区二区免费入口| 久久精品国产精品亚洲| 九九全国免费视频| 国产日产亚洲系列最新| 9久热这里只有精品免费| 亚洲A∨无码无在线观看| 久久久久高潮毛片免费全部播放| 中文字幕亚洲综合精品一区| 国产高清免费视频| 亚洲日韩AV一区二区三区中文| 四虎永久在线精品免费网址| 亚洲色在线无码国产精品不卡| 国产成人无码区免费A∨视频网站| 久久亚洲精品高潮综合色a片| 亚洲高清国产拍精品青青草原| 成人自慰女黄网站免费大全| 亚洲精品福利视频| 在线观看视频免费完整版| 亚洲精品无码一区二区| 亚洲五月午夜免费在线视频| 成人免费区一区二区三区| 亚洲性69影院在线观看| 成人永久免费福利视频网站| 国产精品高清免费网站 | 四虎影永久在线高清免费| 一个人免费观看视频在线中文 | 亚洲日本天堂在线| 亚洲精品tv久久久久| 久久久久久一品道精品免费看| 亚洲日本人成中文字幕| 亚洲欧洲自拍拍偷精品 美利坚| 无码A级毛片免费视频内谢| 亚洲欧美日韩综合久久久| 中文字幕亚洲日本岛国片| 免费国产成人高清在线观看网站| 特级毛片全部免费播放| 久久夜色精品国产噜噜噜亚洲AV| 好爽好紧好大的免费视频国产|