找回密码
 注册
搜索
查看: 2012|回复: 19

[讨论] 小虾浅谈mtk下history buffer的响应过程,还请高手指正^-^

[复制链接]
发表于 2007-4-19 16:49:20 | 显示全部楼层 |阅读模式
首先我们须知道histoty buffer是在栈操作的,故其响应的是LIFO规则的。
当我们点亮一窗口的时候,mtk会关闭当前窗口所有的中断事件和按键功能,并把新窗口的scrid和entryfunc写入history buffer,当此窗口退出GoBackHistory时,则history出站,并删除当前窗口的scrid和entryfunc,进入前一个窗口的的入口函数。由于小虾刚做mtk还不到10天的时间,可能有些错误的地方还请高手指出,并请多多指教。
发表于 2007-4-20 12:20:01 | 显示全部楼层
点亮的时候不入栈,进入一个新的scr时将当前scr入栈,退出时执行栈顶scr对应的entryfuc并出栈
点评回复

使用道具 举报

发表于 2007-4-20 14:35:04 | 显示全部楼层
当进入一个新窗口后,会运行当前窗口的exit函数,将当前窗口入栈,而不是将新窗口入栈,gobackhistory时在执行栈顶scrid的entryfunc的执行过程中出栈。

我也刚刚开始做mtk,有错误的地方还请高手指正
[em14]
点评回复

使用道具 举报

发表于 2007-4-21 13:10:00 | 显示全部楼层
对于我们上层用户而言,经常接触到的History管理是这样的:
    void EntryFunc()
{
U8 *guiBuffer;
            EntryNewScreen( Screen_ID , Exit_Func , Entry_Func , NULL );
    guiBuffer = GetCurrGuiBuffer( SCR_ID_WORDMAIN_LIST );
              ShowCategroyXXScreen( Title_ID , … , guiBuffer);
    }
       但是,无论是EntryNewScreen的调用,还是guiBuffer的传入,我们都很少考虑过对这些指针和函数在GUI的管理起到了什么样的作用。下面我们就要了解,以上的代码与History管理之间存在的关系。
   
    在MTK环境中,每当我们进入一个窗口,系统将先提取前一个窗口需保留的数据。这些数据包括:
1.    窗口ID ;
2.    进入窗口时调用的函数和退出调用的函数 -- Exit_Func 和 Entry_Func ;
3.    组成窗体的控件的属性(如,列表控件当前高亮显示的条目、当前屏的首末条目等)。

举例说明这些数据在实际中是如何被使用的。
假设存在AB两个窗口,A窗口需要保留的数据为data_A。我们先从A窗口进入到B窗口。data_A将在B窗口调用EntryNewScreen()的时候,被压入一个结构类似于栈的数据存储区域;当从B调用GoBackHistory()返回A时,data_A从栈顶被弹出,然后A利用data_A将自身还原到其进入B之前的状态。
这就是History管理的作用。简言之,就是要保持窗口的外观状态。


二、History管理的机制

    现在,我们来了解一下前面所说的data_A的数据结构是什么样的。
typedef struct _history
{
    U16 scrnID;                        //(1)Screen ID (窗口号)
    FuncPtr entryFuncPtr;         //(2)EntryNewScreen时要进入的 Entry_Func
    U8 inputBuffer[MAX_INPUT_BUFFER];
                                                        //(3)文字输入界面用来保存已输入的文字。
    U8 guiBuffer[MAX_GUI_BUFFER];
                                                        //(4)窗体中控件的一些需保存的信息的Buffer,通常//在使用时被转化成各控件自定义的结构体如: list_menu_category_history。
} history;            
                  
而存放data_A的类似于堆栈的数据区则以全局变量的形式定义在系统中:
historyNode  historyData[MAX_HISTORY]; (MAX_HISTORY = 50):

设当前窗口A所对应的数据是historyData[ EntryScreenNum – 1 ] ,那么它是何时、是如何被赋值的?又是何时、如何被使用的?
经过跟踪调试,我们已经知道,在由窗口A进入到窗口B(调用EntryNewScreen)的时候,我们将data_A记录到了historyNode 的结构体变量中。但是,在EntryNewScreen的时候传入的,却是data_B,data_A是如何被记录和使用的呢?

我们摘选EntryNewScreen的子函数中所包含的较核心的代码来说明这个问题。这三段代码是按照现在的排放顺序来执行的。
第一段(history h 可理解为data_A):
    h.scrnID = scrnID;                            // scrnID  =  currExitScrnID
    h.entryFuncPtr = entryFuncPtr; // entryFuncPtr =  currEntryFuncPtr
    pfnUnicodeStrcpy((S8*) h.inputBuffer, (S8*) & nHistory);
                                       // nHistory = NULL ;
        GetCategoryHistory(h.guiBuffer);
//GetCategoryHistory是指向获取//guiBuffer的函数的指针
    AddHistory(h);                                   //数据入栈
第二段:
if(currExitFuncPtr)
    {
        //…
        (*currExitFuncPtr) ();         //执行Exit_Func
    }
第三段(记录Screen_ID,Exit_Func和EntryFunc):
currExitScrnID = scrnID;
    currExitFuncPtr = exitFuncPtr;
    currEntryFuncPtr = entryFuncPtr;
这样,我们就可以看出,EntryNewScreen函数先将上次执行EntryNewScreen时所记录的currExitScrnID, currEntryFuncPtr以history结构为载体记录入栈;然后执行了记录中的currExitFuncPtr;最后将本窗口的scrnID、exitFuncPtr、entryFuncPtr分别记录入全局变量currExitScrnID、currExitFuncPtr和currEntryFuncPtr,留待下次调用EntryNewScreen时使用。
点评回复

使用道具 举报

 楼主| 发表于 2007-4-23 09:52:51 | 显示全部楼层
感谢各位的指点,尤其要感谢pixtel精辟阐述。谢谢2楼3楼的指正!
点评回复

使用道具 举报

发表于 2007-5-8 11:01:16 | 显示全部楼层
谢谢各位高手的指点!
点评回复

使用道具 举报

发表于 2007-5-11 03:59:20 | 显示全部楼层
真不错啊,懂了不少。真希望能多点这样的讨论
点评回复

使用道具 举报

发表于 2007-5-23 09:51:32 | 显示全部楼层
8错,谢谢!
点评回复

使用道具 举报

发表于 2007-6-7 13:28:03 | 显示全部楼层
mark一下
点评回复

使用道具 举报

发表于 2007-7-23 15:05:35 | 显示全部楼层
我是新人,学到不少哈,rd网应该多一些这样热心的讨论者和解答者
点评回复

使用道具 举报

发表于 2007-7-31 13:11:46 | 显示全部楼层
pixtel 讲的有点深,但是我想可能有些新手不是看的很懂。

我想,知道怎么用就可以了,我是这么理解的:
首先,要知道这些什么screen函数只是将一些抽象的代码形象化了而已,EntryNewScreen不一定就是进入一个新的界面。使用方法很简单,用了一次EntryNewScreen( Screen_ID , Exit_Func , Entry_Func , NULL )后,你再用一次EntryNewScreen就会执行之前设置的回调函数
Exit_Func ,然后你这时候gobackhistory就会执行Entry_Func,就这么简单。
如有不对,请高手指正![em01]
点评回复

使用道具 举报

发表于 2007-8-7 17:43:30 | 显示全部楼层
好啊,  pixtel 讲得好
点评回复

使用道具 举报

发表于 2007-11-1 13:58:16 | 显示全部楼层
学到不少,多谢了
点评回复

使用道具 举报

 楼主| 发表于 2007-11-2 13:28:59 | 显示全部楼层
哈哈,过了这长时间,想想这个问题其实对新手还是很有好处的,无论是从理解代码还是去解决些问题,都有好处的。再次感谢pixtel和其他几位的指教。
点评回复

使用道具 举报

发表于 2007-11-16 15:24:46 | 显示全部楼层
学到不少,多谢了
点评回复

使用道具 举报

发表于 2007-11-18 22:57:08 | 显示全部楼层
学习!@
点评回复

使用道具 举报

发表于 2007-11-19 09:13:44 | 显示全部楼层
挺好的,定一个了
点评回复

使用道具 举报

发表于 2007-11-22 15:17:32 | 显示全部楼层
我察看了EntryNewScreen( Screen_ID , Exit_Func , Entry_Func , NULL );
发现好多Exit_Func 和Entry_Func的函数都为空,那么在这种情况下,调用
GoBackHistory时,怎么会到上一个屏呢?
请高手指教
点评回复

使用道具 举报

发表于 2007-11-22 17:01:04 | 显示全部楼层
多谢阿!
点评回复

使用道具 举报

发表于 2007-11-26 20:22:16 | 显示全部楼层
受教,多谢
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-12-25 12:31 , Processed in 0.066641 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表