• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Beginning to 編程

            VC++ 方面編程文章

             

            結(jié)構(gòu)化設(shè)計(jì)的救命稻草-回調(diào)機(jī)制 / 轉(zhuǎn) Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=253623

            摘要:開(kāi)發(fā)模式的確立是軟件開(kāi)發(fā)過(guò)程中不可缺少的一部分,就目前來(lái)說(shuō),面向過(guò)程和面向?qū)ο笫莾煞N主要的設(shè)計(jì)方法,雖然面向?qū)ο驩OP是比較流行的字眼,但不表示面向過(guò)程就一定好無(wú)作為,畢竟面向過(guò)程設(shè)計(jì)方法也有適合其應(yīng)用的軟件系統(tǒng):以功能操作為主,擴(kuò)展性要求不高,無(wú)需過(guò)多考慮復(fù)用以及軟件的通用性能。那是不是面向過(guò)程的設(shè)計(jì)方法對(duì)于諸如系統(tǒng)框架擴(kuò)展問(wèn)題就絲毫沒(méi)有辦法了呢?

            按照面向過(guò)程的基本原則,劃分系統(tǒng)功能模塊、模塊細(xì)分到函數(shù)、生成系統(tǒng)整體的結(jié)構(gòu)模型,似乎在整個(gè)過(guò)程中沒(méi)有任何東西可以用來(lái)提供系統(tǒng)擴(kuò)展,其實(shí)解決的方法還是有的,這根救命稻草就是回調(diào)機(jī)制。

            一談到回調(diào)機(jī)制,當(dāng)然就少不了我們的主角:系統(tǒng)API(通常都是)和回調(diào)函數(shù),這兩者缺一不可。其實(shí)回調(diào)的基本思想就是由系統(tǒng)給我們提供一些接口,也就是常使用的API,這種函數(shù)可以將某個(gè)其他函數(shù)的地址作為其參數(shù)之一,而且可以利用該地址對(duì)這個(gè)函數(shù)進(jìn)行調(diào)用,而被調(diào)用的函數(shù)就是我們通常所說(shuō)的回調(diào)函數(shù)了。
            下面給個(gè)回調(diào)函數(shù)使用的小例子:
            ------------------------------------------
            //相當(dāng)于我們提到的系統(tǒng)API
            mainFunc( void*  userFunc )//當(dāng)然參數(shù)不會(huì)這么簡(jiǎn)單,只是模擬
            {
             while (...)
             {
              printf("ok!");
                            //調(diào)用回調(diào)函數(shù)了
              if (userFunc!=NULL) 
               userFunc();
             }
            }
            可以看出MainFunc可以根據(jù)函數(shù)userFunc的地址調(diào)用它。
            ------------------------------------------
            這樣使用者只需要定義一個(gè)函數(shù):void myFunc(),然后按照mainFunc(&myFunc)(&只表示傳遞的是函數(shù)的地址,無(wú)具體含義),就可以讓我們的mainFunc來(lái)調(diào)用myFunc從而實(shí)現(xiàn)相應(yīng)的功能,這樣當(dāng)然可以完成我們預(yù)期的目的-擴(kuò)展現(xiàn)有系統(tǒng)。

            在windows系統(tǒng)中,支持這種回調(diào)機(jī)制的系統(tǒng)API不占少數(shù),像實(shí)現(xiàn)ListControl排序的SortItem()函數(shù),還有操作Font使用的函數(shù)EnumFontFamilies()都有提供這種回調(diào)機(jī)制,使得我們的用戶有機(jī)會(huì)添加自己期望的功能實(shí)現(xiàn)。當(dāng)然,使用回調(diào)函數(shù)并不是一個(gè)輕松的事情,如果我們的系統(tǒng)中存在了大量的回調(diào)函數(shù)是很難管理的,這個(gè)就與系統(tǒng)中存在大量全局變量一樣,出現(xiàn)多個(gè)函數(shù)爭(zhēng)相訪問(wèn)同一個(gè)變量我們就很難使用簡(jiǎn)單的邏輯來(lái)處理,容易陷入混亂,因此,盡管回調(diào)機(jī)制可以在某種程度上達(dá)到我們的目的,但切不可亂加使用,不然后果很難預(yù)料。

            當(dāng)然至于詳細(xì)的回調(diào)函數(shù)實(shí)現(xiàn),還需要大家潛心研究,這里我只是總結(jié)一下:
            1 回調(diào)函數(shù)是由開(kāi)發(fā)者按照一定的原型進(jìn)行定義的函數(shù)(每個(gè)回調(diào)函數(shù)都必須遵循這個(gè)原型來(lái)設(shè)計(jì))

            例如:
            ------------------------------------------
            BOOL CALLBACK DialogProc(
                
                 HWND hwndDlg, // handle of dialog box
                 UINT uMsg, // message
                 WPARAM wParam, // first message parameter
                 LPARAM lParam // second message parameter
                 );
            ------------------------------------------
            說(shuō)明:
            回調(diào)函數(shù)必須有關(guān)鍵詞 CALLBACK
            回調(diào)函數(shù)本身必須是全局函數(shù)或者靜態(tài)函數(shù),不可定義為某個(gè)特定的類的成員函數(shù)

            2 回調(diào)函數(shù)并不由開(kāi)發(fā)者直接調(diào)用執(zhí)行(只是使用系統(tǒng)接口API函數(shù)作為起點(diǎn))
            3 回調(diào)函數(shù)通常作為參數(shù)傳遞給系統(tǒng)API,由該API來(lái)調(diào)用
            4 回調(diào)函數(shù)可能被系統(tǒng)API調(diào)用一次,也可能被循環(huán)調(diào)用多次(SortItem就是自調(diào)用)

            最后說(shuō)句題外話,其實(shí)windows系統(tǒng)中還有另一種機(jī)制-消息機(jī)制,也是一個(gè)比較不錯(cuò)的工具,能夠?yàn)楹芏鄬?shí)際的問(wèn)題提供解決方法,這個(gè)以后再總結(jié)了。

            posted on 2006-03-09 11:27 Beginning to 編程 閱讀(478) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 程序摘錄

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(4)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊(cè)

            BlogDev

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            91超碰碰碰碰久久久久久综合| 亚洲欧洲日产国码无码久久99| 狠狠色综合网站久久久久久久高清| 国产精品久久久久乳精品爆| 97r久久精品国产99国产精| 热re99久久精品国99热| 无码人妻精品一区二区三区久久| 99久久国产精品免费一区二区| 久久精品国产AV一区二区三区| 亚洲人成网亚洲欧洲无码久久| 亚洲成色www久久网站夜月| 国内精品伊人久久久久777| 7777久久久国产精品消防器材| 亚洲午夜久久久久久噜噜噜| 欧洲人妻丰满av无码久久不卡| 国产精品免费福利久久| 中文字幕一区二区三区久久网站| 青青草原综合久久| 狠狠色丁香婷婷综合久久来来去 | 午夜精品久久久久9999高清| 久久se这里只有精品| 深夜久久AAAAA级毛片免费看| 蜜臀av性久久久久蜜臀aⅴ麻豆| 亚洲精品无码久久久久去q| 伊人久久大香线蕉av不卡| 久久久久无码精品国产app| 久久精品国产亚洲av麻豆小说| 久久精品国产亚洲AV忘忧草18 | 97精品国产97久久久久久免费| 日韩va亚洲va欧美va久久| 国产日韩欧美久久| 国产精品久久久天天影视香蕉| 91精品国产91久久| 欧美精品一区二区精品久久| 久久久久四虎国产精品| 欧美一区二区精品久久| 久久国产美女免费观看精品| 久久精品国产亚洲Aⅴ蜜臀色欲| 久久精品国产精品亜洲毛片| 久久久久九国产精品| 精品乱码久久久久久夜夜嗨|