VJGUI訊息設計 兼談MFC QT和訊號 槽機制

2021-04-25 14:15:43 字數 1509 閱讀 8879

星期六下午4點,還在公司加班。終於寫完了下週要交工的乙個程式。

鬱悶,今天這幾個小時寫了有上千行**吧?雖然大部分都是ctrl-c+ctrl-v,但還是鬱悶。

作為乙個有10年經驗的mfc程式設計師,鬱悶啊......

當初上大學的時候,就是衝著mfc這3個字去學的。

microsoft foundation classes

多麼的nb。彷彿這些c打頭的類就是構建微軟大廈的一根根螺釘。

記不清有多少個日日夜夜守在電腦旁,用vc6的classwizard不知疲倦的新增乙個又乙個的類。

也記不清翻看了多少本vc與mfc的書,並一次又一次的迷失在mfc中幾個小時解不了乙個bug...

正如某個外國的程式設計師所說的「the microsoft foundation classes (mfc) are a nightmarish mess. i'll say it again - the mfc is a programmer's nightmare.」

mfc確實成了很多程式設計師的噩夢。當我堅持把這個噩夢做醒時,大學已經上完了。。。

這種滿足感一直持續到我接觸了qt,看到了它最經典的訊息設計(signal & slot)。

賣糕的,這是蒸的饃?

原來訊息響應可以如此的優雅,如此的直接,如此的簡單。回過頭來看看mfc中的message map,那感覺,就像剛吃完乙份多汁的牛扒後被強迫吃了一塊臭豆腐。

我想,作為吃了10年的臭豆腐的人,突然吃到了多汁的牛扒,是有理由狂喜的,同時他又不得不繼續吃臭豆腐,是有理由鬱悶的。

言歸正傳,vjgui是我為開源2d引擎

indielib

寫的乙個gui類庫。在設計階段時,我就一直在想各個widget的訊息應該怎樣響應。第乙個想法自然是callback function,會不會too ******?作為乙個吃了10年臭豆腐的人,有理由多想一下。其實我一直在避免使用callback function,它的耦合性太強了,使得**很難復用。同時,callback function is not type safe,難道我們喜歡在**中埋雷?還有乙個問題,這些函式使得**很難看......。下乙個想法,實現乙個簡單的類windows訊息機制,細節還沒太想清楚。但要為每種widget加上message pump會不會顯得太蠢苯了?另外,使用起來估計可用性不高。最後,利用了乙個週末的休息時間,我決定了,為什麼不實現qt的訊號/槽機制呢?

qt的實現是需要moc的,有沒有更清爽的解決方案?回答是肯定的,我找到了sigslot和slotsig這哥倆。

內部它們使用n多的模板(template)來實現訊號/槽(本質還是callback function,只不過耦合度降低了,編譯時會做有效性檢查,更加安全)。c++中那麼不起眼的模板,原來還可以這樣用。看來學習c++真是永無止境啊。

這樣的實現比qt會快一些。slotsig甚至還做了各種訊號/槽實現的benchmark。

有興趣的人可以去

這裡看看。

看來這篇blog就這麼結束了,因為我要下班了。好像有點虎頭蛇尾,各位看官,請聽下回分解。

自引用結構兼談Malloc和Free函式

一 自引用結構 1 什麼事自引用結構?自引用結構 self referential structure 是一種特殊的結構。主要特徵 乙個或多個自身的變數是指向自身的指標。2.判斷幾個自引用結構是否合法?這個結構是非法的,為什麼呢?結構裡面有包含b,b裡面有包含自己的成員b,這樣就會無休止的迴圈下去。...

Post和Get的區別 兼談頁面間傳值的方式

從乙個頁面轉向另乙個頁面的請求方式有兩種,post和get.如果從原理上來 他們的區別,涉及到http傳輸協議的細節,本文不加 只討論一下表象。所有的人都知道如下區別 1.post傳輸資料時,不需要在url中顯示出來,而get方法要在url中顯示。2.post傳輸的資料量大,可以達到2m,而get方...

分布式訊息佇列的設計和使用

在系統架構設計中,我們有時會用到訊息佇列,但對對應為什麼需要用到訊息佇列,訊息佇列的引入是否對架構設計有更多的好處方面,我們是否有足夠的認識?是否存在為了用訊息佇列而引入呢?所以這裡我們需要非常明確我們的架構目標,一般來說,訊息佇列能夠提供以下幾個方面的幫助 1,保證訊息的傳遞 如果傳送訊息時接收者...