一種實(shí)時視頻gui的技術(shù)方法
【技術(shù)領(lǐng)域】
[0001 ] 一種實(shí)時視頻GUI的技術(shù)方法是關(guān)于計算機(jī)視頻方面的技術(shù)領(lǐng)域。
【背景技術(shù)】
[0002]以往的⑶I,例如Mini⑶I,⑶I部件對象和消息是相互獨(dú)立的,即對象不能擁有消息,這樣就需要一個縱向貫穿于整個GUI部件結(jié)構(gòu)的消息驅(qū)動機(jī)制,在外層事先定義好一定的數(shù)據(jù)結(jié)構(gòu)及可能的值表示消息,接著在窗口回調(diào)過程函數(shù)。中處理對應(yīng)的消息。在對象子系統(tǒng)中,每個對象可以擁有特定的信號,信號的設(shè)定根據(jù)對象的屬性和在運(yùn)行過程中可能對外界產(chǎn)生的交互行為而定,這個信號可以被連接到屬于其他對象的槽函數(shù)上。在這個對象的某個邏輯過程當(dāng)中會激發(fā)信號,此時連接的槽函數(shù)將被執(zhí)行。信號與槽之間的連接可以顯式取消,當(dāng)對象消亡時也會自動解除。
【發(fā)明內(nèi)容】
[0003]視頻GUI中的所有控件和擁有一類屬性的模塊被抽象為對象,對象擁有信號向外界表明在它的邏輯過程中將要產(chǎn)生何種對外界有影響或外界可能感興趣的事件;同時對象擁有槽,當(dāng)外界產(chǎn)生了要影響這個對象的信號時,槽功能被激活,做出對信號的響應(yīng)。
[0004]一.基于信號-槽的對象通信機(jī)制:信號-槽機(jī)制可以取代回調(diào)函數(shù),并且使應(yīng)用程序?qū)ο⒌奶幚碜優(yōu)閷σ粋€信號的連接。
[0005]1.信號定義:信號包含兩個層面的意思,其一,信號是觸發(fā)一個事件或行動在時間上的約定;其二,信號傳達(dá)了關(guān)于將要發(fā)生的事件或行動的信息。在GUI中,界面控件的功能,其一是為應(yīng)用程序提供輸入數(shù)據(jù)或顯示輸出數(shù)據(jù);其二是流程的決策邏輯。例如,編輯框的作用是輸入數(shù)據(jù)給應(yīng)用程序或顯示程序處理的結(jié)果;按鈕的作用是使程序進(jìn)入一個相關(guān)的處理流程。因此,信號約定的行為就是一個對象或是一個控件對外界表現(xiàn)出來的行為。例如,按鈕的信號可以包括被按下(pressed),被釋放(released),—次按下松開(clicked)等三種。另外,為了描述信號約定的行為的屬性,信號可以帶有參數(shù)。對于選擇按鈕,一次按下松開信號的參數(shù)表示選擇還是取消選擇?;谛盘栆陨系膬蓚€含義,可作如下定義:
信號名〈參數(shù)類型I,參數(shù)類型2,...,參數(shù)類型n>;
通過約定的信號,對象相互之間就可以產(chǎn)生聯(lián)系,這種聯(lián)系表現(xiàn)為一個對象對另外一個對象信號的連接和響應(yīng)。對于界面控件,根據(jù)行為和屬性可以擁有一些特定的信號,當(dāng)屬性被表現(xiàn)時信號就被激發(fā),外界可以對這個信號做出響應(yīng)。此時,信號產(chǎn)生實(shí)例,結(jié)構(gòu)如下:
信號實(shí)例〈激發(fā)者,響應(yīng)者,參數(shù)值I,參數(shù)值2,…,參數(shù)值n> ;
在對象上對信號上定義五種操作,增加(addSignal),連接(connect),激發(fā)(emit),刪除(deleteSignal),取消連接(disconnect),通過這五個操作就可以取代基于消息和回調(diào)函數(shù)的GUI與之上的應(yīng)用程序的交互模式,因?yàn)樾盘栂喈?dāng)于消息號和通知碼及參數(shù),激發(fā)就相當(dāng)于回調(diào)。此外,信號方式具有的優(yōu)點(diǎn):靈活性,描述信號的參數(shù)是可變長的,并且是針對控件屬性的描述數(shù)值;簡潔性,無需宏定義和判斷消息,可以直接把響應(yīng)過程連接到信號上。
[0006]針對信號,⑶I系統(tǒng)的重點(diǎn)就是實(shí)現(xiàn)以上的五個操作,并用這些操作完成構(gòu)建組件化的控件庫。首先,每個控件應(yīng)該擁有哪些些信號,并用怎樣的參數(shù)描述屬性,這需要根據(jù)具體控件而定,庫中應(yīng)該包含通用的一些控件。其次,何時激發(fā)信號,這需要和事件結(jié)合,大多控件是在輸入輸出事件中激發(fā)信號,與之上的應(yīng)用程序交互。
[0007]2.槽定義:為了響應(yīng)一個信號必須使用槽,它不僅要響應(yīng)信號激發(fā)后的響應(yīng)過程,還必須可以得到信號實(shí)例的屬性值,因此,槽是一個帶有數(shù)據(jù)的函數(shù)。定義如下:
槽名 < 信號實(shí)體指針,參數(shù)個數(shù)>
在槽上定義三個操作,但僅限制在槽函數(shù)中使用,用于訪問信號實(shí)例:得到激發(fā)信號的對象(getSender),得到信號的響應(yīng)者對象(getReceiver),得到參數(shù)(getParam)。
[0008]信號激發(fā)者和響應(yīng)者對槽是可見的,這樣設(shè)計的好處是界面控件行為的結(jié)果可以在槽中直接更改,同時無需給槽傳遞訪問控件的參數(shù)。這個可見性同樣使得信號響應(yīng)者對槽來說是多樣化的,槽函數(shù)中對信號的處理可以針對某一類,對某個信號感興趣的,對象,但這種多樣性在使用connect連接信號和槽時變成特殊化,即一組信號激發(fā)者_(dá)信號響應(yīng)者實(shí)例生成。
[0009]針對槽,GUI系統(tǒng)的重點(diǎn)是維護(hù)槽相關(guān)的數(shù)據(jù),即信號實(shí)例。這些數(shù)據(jù)的存儲空間不需要動態(tài)生成,但信號激發(fā)時實(shí)例中的每一項值必須根據(jù)當(dāng)時的情況確定。對象在擁有了信號和槽之后,在GUI系統(tǒng)中的結(jié)構(gòu)和相互之間的關(guān)系。
[0010]3.信號和槽在對象中的實(shí)現(xiàn):
I).addSignal:信號定義的結(jié)果實(shí)質(zhì)上是定義了一個字符串,其中的信號名用于標(biāo)識一個對象的一條信號,信號參數(shù)類型用于描述信號的每個屬性的類型。雖然信號就是字符串,但是定義時并不需要顯示的定義字符串,而是通過編譯器預(yù)處理的功能,將信號明及參數(shù)轉(zhuǎn)換為字符串。因此,addSignal先對定義信號的字符串進(jìn)行解析,得到信號和參數(shù)表。之后將儲存信號實(shí)例的空間保存到以信號名為關(guān)鍵字的哈希表或鏈表中,此時對象增加了一條信號。
[0011]2).connect:在哈希表的信號節(jié)點(diǎn)中設(shè)置一個鏈表用于記錄連接到這個信號的槽的信息和槽所屬對象的信息。connect主要過程是在鏈表中增加一個節(jié)點(diǎn),插入鏈表是在鏈表投插入,這就保證同一個信號上后連接的槽將被先調(diào)用。整過程示意代碼如下:
bool connect ( Object氺 sender, char* signal, Object 氺receiver, SL0TCALL*slot )
{
Signal 氺hs;
Method *md;
SenderObj 氺sobj;
if ( !sender || !receiver ) {
return false;
}if (( hs = findSignal ( sender, signal ) ) == NULL) {return false;
}
md = getMethodNode(); //new and insert method nodemd->receiver = receiver; md->slot = slot;md->next = hs_>method;hs->method = md;
sobj = getSenderObjNode(); //new and insert SenderObj node
sobj->sender = sender; sobj->siglist = hs;
sobj->next = receiver->senders;
receiver-)senders = sobj;
return true;
}
3).emit:由于信號在增加的時候已經(jīng)為信號實(shí)例分配的存儲空間,emit的過程就是根據(jù)當(dāng)時的情景,設(shè)置信號實(shí)例的值并調(diào)用槽函數(shù)。信號節(jié)點(diǎn)只要保存一份參數(shù)空間,盡管一個信號上可能連接了多個槽。因?yàn)槊看涡盘柋患ぐl(fā)時場景是確定的,所有連接的槽共享著一份場景數(shù)據(jù)即可。在實(shí)現(xiàn)上,emit是一個參數(shù)可變的函數(shù),但是第一個參數(shù)是確定的,就是將要被激活的信號,接下去的實(shí)參對應(yīng)于信號定義的參數(shù)表。在槽函數(shù)中通過getSender、getReceiver和getParam等函數(shù)可以訪問到此時信號活動的對象和參數(shù)表,實(shí)現(xiàn)了對象通信相關(guān)數(shù)據(jù)的傳遞。
[0012]4).樣本對象:在對象創(chuàng)建后就可以根據(jù)需要給它設(shè)置一定的信號,這意味這需要調(diào)用addSignal操作,如果創(chuàng)建的是同一類對象,那么addSignal就會被重復(fù)的調(diào)用。為了減少這些冗余操作,可以建立樣本對象,這些對象在這一類對象第一次創(chuàng)建時把信號用addSignal操作設(shè)置好,此后再創(chuàng)建這類對象,就可以直接從樣本中拷貝信號(copySignal)。樣本對象使一類對象的信號僅需設(shè)置一次,節(jié)省了創(chuàng)建對象的時間,因?yàn)閍ddSignal比copySignal所花的時間要多得多。
[0013]例如button在創(chuàng)建時有如下示意代碼用于增加信號: if (objectEmpty(&_btn)) {
initSample(&_btn, "jDutton");addSignal(&_btn, clicked());addSignal(&_btn, pressed ());addSignal(&_btn, release ());addSignal(&_btn, checked(bool));
}
initObject(objbtn, parent, name, true);copyObject(objbtn, &_btn);
二.消息驅(qū)動模型:
圖形程序不同于解決某種算術(shù)問題的程序,它的執(zhí)行不是過程性的,圖形界面的一個主要功能是與用戶交互,響應(yīng)外部可能發(fā)生的隨機(jī)事件。由于事件的隨機(jī)性,在程序運(yùn)行過程中,下一步會發(fā)生什么事件是不可預(yù)知的,完全取決于當(dāng)時的人機(jī)交互場景。不同的場景產(chǎn)生不同的消息。系統(tǒng)根據(jù)發(fā)生消息的種類和系統(tǒng)當(dāng)時所處的場景產(chǎn)生不同的任務(wù)序列,這些任務(wù)序列通過消息的傳遞得到執(zhí)行,這就是消息驅(qū)動機(jī)制。
[0014]根據(jù)上述消息驅(qū)動的定義,其實(shí)質(zhì)就是要解決人機(jī)交互過程的隨機(jī)性問題,隨機(jī)性使得應(yīng)用程序的功能離散化,而不是面向過程的連續(xù)性。為了選擇離散化后的任務(wù),需要在交互行為和任務(wù)執(zhí)行之間建立映射關(guān)系,而且這映射關(guān)系必須是可變的。信號-槽機(jī)制恰好可以用來建立消息和功能的映射,視頻GUI的消息驅(qū)動模型就是建立的信號-槽機(jī)制之上的??紤]到信號和槽式對象級別層次才有的屬性,而消息的來源是與底層驅(qū)動相連的適配層,所以將消息分為外部消息和對象間消息,其中外部消息稱為事件,對象間消息就是信號。
[0015]信號設(shè)計一節(jié)已經(jīng)提到⑶I系統(tǒng)的一個重要任務(wù)就是在適當(dāng)?shù)臅r候激活控件的信號,對象收到事件時就是激活信號的時候。例如,一個按鈕收到的觸摸屏點(diǎn)擊事件是就應(yīng)該激發(fā)pressed信號,用于通知外界。GUI系統(tǒng)的事件需要表現(xiàn)出多態(tài)性,不同的應(yīng)用程序?qū)ο嗤囊粋€事件作出的反應(yīng)是不同的。例如觸摸屏事件,根控件實(shí)現(xiàn)的是默認(rèn)的行為,接收或轉(zhuǎn)發(fā)事件。如果是接收事件,就激發(fā)事件到達(dá)信號。應(yīng)用程序只需連接這個信號,執(zhí)行不同的槽。連接的方式有兩種,第一,覆蓋原有連接,這將執(zhí)行新的功能;第二,在原來的基礎(chǔ)上增加一條連接,這將執(zhí)行額外的功能。
[0016]事件到信號的轉(zhuǎn)換通過內(nèi)外兩級消息處理機(jī)制實(shí)現(xiàn),事件主要關(guān)注其路由,即將事件投遞到適當(dāng)?shù)膶ο笊?