青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

上一次關注Qt Lighthouse是在6月初,可是現在都8月底了。時間真快...

Lighthouse 是 QPA(Qt Platform Abstraction) 項目的名字,它使得將Qt移植到新的平臺變得比較簡單。盡管現在它已經完全融入到了Qt主干代碼中,lighthouse作為獨立項目已經不復存在了,但本文中,我們繼續使用這個名字(雖然已不太恰當)。

QPA 抽象了什么?

不妨看看QPA前后,有何不同:

之前

考慮一下,傳統的Qt是如何實現圖形界面的夸平臺:

  • 針對不同的窗口系統(WS)定義相應的宏: Q_WS_*

Q_WS_X11
Q_WS_MAC
Q_WS_QWS
Q_WS_WIN
Q_WS_S60
  • 代碼中夾雜大量的編譯預處理指令 (處理小段)

#if defined(Q_WS_X11)
...
#elif defined(Q_WS_MAC)
...
#elif defined(Q_WS_WIN)
...
#endif
  • 各個窗口系統相關的代碼文件 (處理大段)

qapplication_x11.cpp
qapplication_win.cpp
qapplication_s60.cpp
qapplication_mac.mm
qapplication_qws.cpp
...
qwidget_win.cpp
qwidget_qws.cpp
qwidget_mac.cpp
qwidget_x11.cpp
...
  • src/gui/kernel.pri 等工程文件內,控制哪些文件參與編譯

win32 {
...
}
symbian {
...
}
unix:x11 {
...
}

這一切這意味這什么??

如果我們想在這個基礎上支持一個新的窗口系統,比如wayland,需要

  • 添加平臺相關的宏,代碼中針對該窗口再擴充 #if #elif #endif

  • 添加平臺相關的文件,擴充 **.pri 文件使其融入Qt
  • ...

總之,需要對Qt的代碼進行大量的修改。這一切使得將Qt移植到新的窗口系統中,變得不是那么容易。

之后

QPA 定義了一套接口,而后,將窗口系統相關的代碼放到插件中:

  • src/plugins/platforms/xlib/*
  • src/plugins/platforms/wayland/*
  • src/plugins/platforms/cocoa/*

這時,如果我們想支持一個新的窗口系統,怎么辦?只需要編寫一個新的插件,而Qt自身的代碼則不需要任何改變。

(當然,編寫插件本身還是很有難度的,哈...)

QPA源碼結構

為了使插件能供工作,Qt中需要提供有相應的加載接口,在Qt源碼中搜索*_qpa.h*_qpa.cpp *_qpa_p.h 即可找到所有(fixme)和 qpa有關的代碼:

  • QTDIR/src/opengl
    • qgl_qpa.cpp
  • QTDIR/src/gui
    • painting
      • qcolormap_qpa.cpp
      • qpaintdevice_qpa.cpp
    • image
      • qpixmap_qpa.cpp
    • egl
      • qegl_qpa.cpp
    • kernel
      • qplatformintegrationplugin_qpa.cpp
      • qplatformcursor_qpa.cpp
      • qwidget_qpa.cpp
      • ...
    • text
      • qfontengine_qpa.cpp
      • qfontengine_qpa_p.h
      • ...

可以看到代碼集中在 gui/kernel 部分;除此外,和字體相關gui/text,和繪圖相關gui/painting、gui/image、gui/egl,和opengl相關

QPA結構

QPlatformIntegration

這個應該算是 QPA 的核心了,

  • 它是QApplication(準確地說是QApplicationPrivate)的成員

class Q_GUI_EXPORT QApplicationPrivate : public QCoreApplicationPrivate
{
...
    static QPlatformIntegration *platform_integration;
...
  • 在初始化QAppliction時它會被創建

QApplication::QApplication()
  QApplicationPrivate::construct()
   qt_init()
     init_platform()
       QPlatfromIntegrationFactory::create()
  • 它是所有窗口系統相關函數的入口點

class Q_GUI_EXPORT QPlatformIntegration
{
public:

GraphicsSystem functions

virtual QPixmapData *createPixmapData()

virtual QPlatformWindow *createPlatformWindow()

virtual QWindowSurface *createWindowSurface()

Window System functions

virtual QList<QPlatformScreen *> screens()

virtual void moveToScreen()

virtual bool isVirtualDesktop()

virtual QPixmap grabWindow()

Deeper window system integrations

virtual QPlatformFontDatabase *fontDatabase()

virtual QPlatformClipboard *clipboard()

...

這樣一來:

當你在程序中

它會向QPlatformIntegration請求

使用QWidget時

給我一個窗口(QPlatformWindow)及繪圖區域(QWindowSurface)

使用QPixmap時

給我一個位圖的后端(QPixmapData)

使用QFont時

給我字體數據信息(QPlatformFontDatabase)

使用QGLWidget時

給我一個窗口

...

...

QPlatformWindow 與 QWindowSurface

QPlatformWindow

窗口
負責窗口的幾何尺寸
可以是另一個窗口的子窗口

QWindowSurface

窗口繪圖區域(drawing area of a window)
它來決定使用哪一個paintEngine
將像素Push到屏幕上

相對而言,QPlatformWindow 出現的比較晚一點(見Say hello to QPlatformWindow一文)之所以。之所以分離開來,原因見Remodelling the Lighthouse

QPlatformScreen

  • 代表屏幕(顯示器)
  • 它提供的api對應用程序來說是只讀的
  • 用來計算分辨率 dpi

class Q_GUI_EXPORT QPlatformScreen : public QObject
{
...
    virtual QRect geometry() const = 0;
    virtual QRect availableGeometry() const {return geometry();}
    virtual int depth() const = 0;
    virtual QImage::Format format() const = 0;
    virtual QSize physicalSize() const;

QPixmapData

為什么要有這個東西?

通常我們似乎都不怎么區分QImage和QPixmap,盡管在Manual中很大的篇幅在描述這二者的區別。

設計目的和用途(一個是IO和像素操作,一個是屏幕顯示):

  • QImage is designed and optimized for I/O, and for direct pixel access and manipulation
  • while QPixmap is designed and optimized for showing images on screen.

典型的用途:

  • Typically, the QImage class is used to load an image file, optionally manipulating the image data, before the QImage object is converted into a QPixmap to be shown on screen.
  • Alternatively, if no manipulation is desired, the image file can be loaded directly into a QPixmap.

與QImage不同,QPixmap 是平臺相關的

  • Note that the pixel data in a pixmap is internal and is managed by the underlying window system.

于是它的后端需要由各個窗口系統來提供也就不足為奇了。

QPlatformFontDatabase

提供字體信息

詳見Fonts in Lighthouse一文。

其他

  • QPlatformClipboard
  • QPlatformCursor
  • ...

同前面幾個一樣,從名字上容易看出是做什么的。

參考

posted @ 2011-09-15 21:24 RTY 閱讀(919) | 評論 (0)編輯 收藏

http://blog.csdn.net/dbzhang800/article/details/6686859


  • 作為一個Qt的粉絲,對將于明年發布的Qt5充滿了期待。可是想想Qt5將發生的巨大變化,心底又有點不安。Qt5到底會變成什么樣呢?

看看近期Qt5的一些大動作:

  • 從 QtCore中移除 QSettings以及對QSettings的依賴(創建獨立的模塊?)

  • 從 QtCore中移除 QtConcurrent(創建獨立模塊?)

  • 將 QJSEngine 和 QDeclarativeEngine 放入 QtCore

  • 從 QtGui 中分離出 QtPrintSupport,保留pdf生成功能

  • QtCore 添加 zip 文件的讀寫功能

  • ...

Qt5 結構

Qt Essentials

在所有平臺可用

Qt Tools

Qt的不可分割的組成部分,在所有桌面平臺可用

Qt Add-Ons

可跨平臺,也可不跨

其他模塊和工具

第三方?

Qt5 的基礎模塊(Qt Essentials)

Qt Core

 

Qt Network

可能會集成到 Core

Qt Gui

除去所有QWidget相關的類以后的部分

Qt OpenGL

可能會被合并到其他模塊

Qt Quick2

 

Qt Test

 

Qt Sql

 

V8 JavaScript engine

 

Qt DBus

由于依賴問題,必須被包含進來

Qt WebKit

提供新的底層C++和QML的接口

Qt MultimediaKit

 

來自Qt mobility的一些模塊

初期可能還不會包含進來

Qt5 的核心將是 Qt Quick,qml和javascript將成為一等公民。這些模塊中變化最大的當屬 Gui 模塊了,GUI結構進行了徹底的更新:

  • SceneGraph, 什么東東呢?不太了解。似乎:“Scene Graph”是一種組織場景數據的方法,它把數據放進一個層次結構里。

  • OpenGL, Qt5將依賴OpenGL 2

  • lighthouse(QPA),各個平臺下圖形系統的移植靠它實現,不過現在好像還沒看到Win32插件的影子。

同時 QWidget 相關內容將獨立成為QtWidget 模塊,與打印相關內容,獨立出來成為QtPrintSupport,...

但是,這并不是說這部分被廢棄了。之所以不在Qt Essentials內,是因為并不是所有平臺都需要它。對于桌面平臺來說,QtWidget 和其他模塊一樣,是一等公民!!

  • We want to send the correct message to the users of QWidget classes: they are 1st class citizens in the desktop environment, but not necessarily available in the embedded or mobile environments

Qt附加組件(Qt Add-Ons)

在Qt5中,盡管 Qt Quick 是Qt的中心,但是Qt5仍將一如既往支持原生C++ Qt,而且不想與現在Qt4開發的代碼分裂。Qt4中的一些模塊在Qt5中被放入Qt Add-Ons中。

  • Qt 5 continues to offer all of the power of native Qt C++, and we don’t want Qt 5 to be disruptive for existing code developed for Qt 4.

QWidget 模塊

模塊成熟級別:完成(Done)
不再添加新特性或進行性能優化

Xml

XmlPatterns

Script 和 Scripts Tools

ActiveQt

Svg

模塊成熟級別:廢棄
QtWebKit提供Svg Full支持

Mobility中的一些模塊

 

Qt Quick components模塊

 

3D

 

graphics effects

 

還有些東西沒看到哈,比如:

phonon

phonon由KDE社區繼續維護,Qt建議使用 QtMultimediaKit

Qt Multimedia

從Qt4.8開始,廢棄,建議 QtMultimediaKit

Qt3 Support

廢棄

參考


posted @ 2011-09-15 21:23 RTY 閱讀(796) | 評論 (0)編輯 收藏

最近讀了《卓有成效的程序員》,感覺收獲頗大。這是一本寫給程序員的難得的好書。書中大都是一些淺顯的道理,但作者將這些東西加以收集、歸納、總結,并最終成書。作者為了收集各種提高效率的工具和方法,東奔西走,可謂費了一番苦心。

我覺得此書第一部分總結的一些法則非常好,我提取了一下:

法則: 

1.加速法則

    關注本質,而非形式

    一個應用程序列表的有用程度與它的長度成反比 

    程序員的很多時間都浪費在找東西上 

    華而不實的東西中看不中用

    鍵盤輸入總比導航快

    首選鍵盤而非鼠標

    地址欄是Windows資源管理器界面中最高效的部分

    花點時間來學習你手邊的所有隱藏的快捷鍵

    環境切換會消耗時間

    成批復制粘貼要比反復多次復制粘貼快

    忘記歷史就意味著你得再輸入一遍

    嵌入圖形化工具的命令提示符讓你魚與熊掌兼得

    在上下文中學習IDE快捷鍵,而不要去背長長的列表

    當你第二次輸入一個復雜結構時,將它做成模板

    如果要對多行文本做同樣的操作,就應該找出其中的模式,并把它記錄為一個宏

    不要總是重復輸入相同的命令

    每天花一點點時間來使每一天都更高效 

2.專注法則

    精力越集中,思維越縝密

    排除干擾:隔離策略,關掉不需要的提示,創造安靜時間  

    草堆越大,從中找到一根針就越難

    不要問文件樹,要搜索

    使用多顯示器

    虛擬桌面可以讓原本雜亂無章的一大堆窗口變得整潔 

3.自動化法則

    不要重新發明輪子

    用Selenium瀏覽網頁

    不要浪費時間動手去做可以被自動化的事情

    用Windows Power Shell替代批處理文件

    馴服Subversion命令行

    以創造性的方式解決問題,有助于在將來解決類似的問題

    是否應該自動化的關鍵在于投資回報率和緩解風險

    研究性的工作應該放在時間盒里做

    別給牦牛剪毛 

4.規范性法則

    對于任何你不自己去構建的東西,只在版本控制中保存一份副本

    使用標準的構建服務器

    通過復制粘貼來復用是邪惡的,不論你復制粘貼的是什么

    利用虛擬平臺使項目依賴標準化

    不要讓對象 - 關系映射工具(O/R映射器)違反規范原則 

    通過擴展。開放類(open class),或者部分類(partial class) 來為生成的代碼增加行為

    始終保持代碼和數據結構的同步

    過時的文檔比沒有文檔更糟,因為它會主動誤導你

    任何需要費勁創造的東西,都讓它的創造者欲罷不能

    白板 + 數碼相機強過任何CASE工具

    盡量生成所有技術文檔

    重復是軟件開發中最大的阻力 

工具:

書中,還提到了大量的提高效率的工具,都是非常不錯的。相信很多人都有自己的一個列表,下面是我電腦中必不可少的幾款軟件:

    1. FireFox 及其各類插件

    2. Launchy啟動加速器

    3. Total Commander

    4. ClipX多重剪切板

    5. EmEditor文本編輯器 

    6. Vistual Studio的VA插件

    7. Search And Replace

    8. Everything

    9. Miranda IM

    10. .... 

感觸: 

1. 憤怒的猴子 

在書中的第二部分,提到了很多實踐相關的內容。讓我感觸最深的是“憤怒的猴子”的故事:

早在20世紀60年代(那時候科學家們可以做任何瘋狂的事情),行為科學家們進行了一項實驗。他們把五只猴子和一架活梯放在一間屋子里,并在天花板上掛了一串香蕉。這些猴子很快就想到它們可以爬上梯子去吃香蕉,但每當它們靠近活梯的時候,科學家們就用冰水浸滿整個屋子。我想你能猜到會發生什么:一群憤怒的猴子。很快,再沒有一只猴子會去靠近那個梯子了。

之后,科學家們將其中一只猴子替換成另一只沒有忍受過冰水折磨的新猴子。這只新猴子所做的第一件事就是直奔那架梯子,但當它這么做時其他所有猴子都痛打它。它不明白為什么,但很快就學乖了:不要去靠近那架梯子。科學家們逐漸將最初的那些猴子都替換成新猴子,直到這群猴子中誰都沒有被水浸泡過,然而它們還是會去攻擊任何靠近梯子的猴子。

這說明了什么?軟件項目中許多慣例之所以存在,就因為”我們一直是那樣做的“。換句話說,是因為憤怒的猴子。

我們小組在制定C++相關的代碼規范時就遇到過無數類似的問題。比如,在制定變量的命名規范時,我們針對是否采用匈牙利命名法爭論了很久。有的人認為, 幾乎以前看到的所有C++代碼都采用了匈牙利命名法,甚至,微軟定義的所有API都使用了此類命名法。剛開始,我也是有同樣的疑惑。

后來,我們經過仔細分析C++匈牙利命名法由來,漸漸感覺我們就是那些憤怒的猴子,盲目跟從前人的方式,缺乏打破傳統的勇氣。C++有著其特殊的歷史原因,很多標準一直沉淀下來并很少改變。我們再看看后來新生的那些編程語言,C#, Python…… 都拋棄了匈牙利命名法,同時再看看現在C++前沿的C++ 0x以及現在出版的一些書中,也漸漸放棄了對匈牙利命名法的使用。因為類型的意義在對象模型中越來越弱化。因此,最后我們放棄了匈牙利命名法這個老古董。 

2. 敏捷開發

這本書帶有強烈的ThoughtWorks色彩,敏捷的思想貫穿全書,包括測試驅動設計,白板,結對編程。這也讓我對敏捷產生了更加強烈的興趣。 其中有一段測試驅動開發TDD的一段故事:

記得第一次和一些已經習慣于單元測試的開發人員一起動手開始修改代碼時,我也是非常緊張,因為大量的修改往往會破壞很多東西,但他們看起來絲毫沒有猶豫。逐漸地,我也放下心來,因為我慢慢地認識到:有了測試的保證,完全可以放心大膽地去修改代碼。” 

3. 有趣的故事 

書中還有一些有趣的故事,比如作者的一個朋友在和別人結對編程時,為了養成同伴使用快捷鍵的習慣,每當同伴未使用快捷鍵時,他都會要求將操作撤銷,然后要求使用快捷鍵再重復操作3次。然后,在其兇狠的眼神中,同伴很快掌握了快捷鍵。 

總結:

這本書很薄,蘊藏的道理卻不少,相信每個讀過它的人都會從中收獲。讀過之后,我們不應該局限于書中提到的某些小技巧, 或是書中某一個細節,畢竟,提供效率的方法有很多很多,法則也有很多很多,一本書很難將其窮舉完。我們應該從書中吸取其思想,并在實際工作和學習中不斷總結,做一個真正的“卓有成效的程序員”!

posted @ 2011-09-15 07:36 RTY 閱讀(307) | 評論 (0)編輯 收藏

     摘要: http://www.codeproject.com/KB/Parallel_Programming/Threading_Blocks.aspxIntroductionThe Intel TBB was released by Intel during their movement to enhance system performance by cores, rather t...  閱讀全文

posted @ 2011-09-15 07:05 RTY 閱讀(662) | 評論 (0)編輯 收藏

http://www.cnblogs.com/coderzh/archive/2010/09/16/Pyjamas-python-write-javascirpt.html

Pyjamas - 用python代替javascript編寫基于瀏覽器的應用

如果能用python代替Javascript編寫基于瀏覽器的應用,該有多好啊。但是,Javascript是唯一一種能在瀏覽器里執行的語言(Flash或Silverlight除外)。換個思路,先用Python編寫代碼,然后在通過編譯器轉為為Javascript腳本,這樣確實是可行的。嗯,已經有人這么干了,就是這個:Pyjamas

Pyjamas的介紹:

Google 的 Web Toolkit (GWT) 讓我們能夠完全用 Java™ 代碼開發具有 Ajax 功能的 Rich Internet Application (RIA)。可以使用豐富的 Java 工具集(IDE、重構、代碼補全、調試器等等)開發出可以部署在所有主流 Web 瀏覽器中的應用程序。在 GWT 的幫助下,可以編寫出在瀏覽器中運行但是表現與桌面應用程序相似的應用程序。

和GWT類似,Pyjamas是一個跨瀏覽器API,有了它,你可以使用Python編寫客戶端功能。 使用Pyjamas的優點是你可以用 Python代替HTML和JavaScript編寫網絡程序,你可以重復使用和導入類和模塊。 此外AJAX庫還可以解決互用性問題,不用擔心程序在IE6, IE7, Firefox, Safari, Opera等瀏覽器上的兼容問題。

 

 

是不是覺得很酷呢?pyjamas有一個演示頁面,里面有多個的效果。 

比如:

火星登陸游戲:http://pyjs.org/examples/asteroids/output/Space.html

郵件客戶端:http://pyjs.org/examples/mail/output/Mail.html 

GWTCanvas:http://pyjs.org/examples/gwtcanvas/output/GWTCanvasDemo.html 

(HTML5 Canvas?? 有人討論這個問題在這里


posted @ 2011-09-15 06:55 RTY 閱讀(502) | 評論 (0)編輯 收藏

     摘要: http://www.cnblogs.com/coderzh/archive/2010/11/29/lupa.htmlLupa - Python中調用LuaLupa將LuaJIT集成到了Python模塊中,可以在Python中執行Lua代碼。 比較有意思,也許以后用的著,記錄一下。基本用法:>>> import lupa>>> fr...  閱讀全文

posted @ 2011-09-15 06:52 RTY 閱讀(1448) | 評論 (0)編輯 收藏

網址:http://code.google.com/p/googletest/

引文
http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html

玩轉Google開源C++單元測試框架Google Test系列(gtest)(總)

前段時間學習和了解了下Google的開源C++單元測試框架Google Test,簡稱gtest,非常的不錯。 我們原來使用的是自己實現的一套單元測試框架,在使用過程中,發現越來越多使用不便之處,而這樣不便之處,gtest恰恰很好的解決了。

其實gtest本身的實現并不復雜,我們完全可以模仿gtest,不斷的完善我們的測試框架, 但最后我們還是決定使用gtest取代掉原來的自己的測試框架,原因是:

1.不斷完善我們的測試框架之后就會發覺相當于把gtest重新做了一遍,雖然輪子造的很爽,但是不是必要的。

2.使用gtest可以免去維護測試框架的麻煩,讓我們有更多精力投入到案例設計上。

3.gtest提高了非常完善的功能,并且簡單易用,極大的提高了編寫測試案例的效率。

gtest的官方網站是:

http://code.google.com/p/googletest/

從官方的使用文檔里,你幾乎可以獲得你想要的所有東西 

http://code.google.com/p/googletest/wiki/GoogleTestPrimer

http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide 

如果還想對gtest內部探個究竟,就把它的代碼下載下來研究吧,這就是開源的好處,哈! 

官方已經有如此完備的文檔了,為什么我還要寫呢?一方面是自己記記筆記,好記性不如爛筆頭,以后自己想查查一些用法也可以直接在這里查到,一方面是對于不想去看一大堆英文文檔的朋友,在我這里可以快速的找到gtest相關的內容。

下面是該系列的目錄:

1.玩轉Google開源C++單元測試框架Google Test系列(gtest)之一 - 初識gtest

2.玩轉Google開源C++單元測試框架Google Test系列(gtest)之二 - 斷言

3.玩轉Google開源C++單元測試框架Google Test系列(gtest)之三 - 事件機制

4.玩轉Google開源C++單元測試框架Google Test系列(gtest)之四 - 參數化

5.玩轉Google開源C++單元測試框架Google Test系列(gtest)之五 - 死亡測試 

6.玩轉Google開源C++單元測試框架Google Test系列(gtest)之六 - 運行參數

7.玩轉Google開源C++單元測試框架Google Test系列(gtest)之七 - 深入解析gtest

8.玩轉Google開源C++單元測試框架Google Test系列(gtest)之八 - 打造自己的單元測試框架


額外篇:

1.gtest中如何跳出當前測試案例

2.編寫優美的GTest測試案例

3.gtest 參數化測試代碼示例 (內含完整工程示例)

作者:CoderZhCoderZh的技術博客 - 博客園
微博:http://t.sina.com.cn/coderzh 
出處:http://coderzh.cnblogs.com
文章版權歸本人所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


posted @ 2011-09-15 06:40 RTY 閱讀(1505) | 評論 (0)編輯 收藏

剛接觸單元測試時,我實在是搞不懂這種測試到底有多大的意義,無非都是一些簡單的ASSERT,但近年積累一些經驗教訓之后我才發現,單元測試這玩意兒真的是一種保證程序質量的強有力手段。

為什么這樣說?舉個最典型的例子,無論是開發新功能還是維護老程序,都不可避免的要反復修改某些代碼,那該怎么保證修改的代碼不會引入新的問題?如果你說你用人品擔保,那我服了。我們應該需要一種可靠的手段來保證修改一個BUG不會引入兩個三個BUG,或者不會讓之前正確的功能出錯,甚至是不會引入之前已經修改過的其它BUG。測試無疑是一種很好的手段,在沒掌握其它更好的方法之前,很多人喜歡用人工測試,即編譯 – 運行 – 輸入典型值 – 看程序運行結果 – 如果出錯 – 修改后再編譯……從長遠來看,這種測試方法的缺點很明顯:1、耗時耗力,每次修改代碼后都需要人工重復測試所有的典型情況;2、容易出錯、漏測,人腦太復雜,你很難記得幾個月前的那個BUG到底是什么情況,因此沒法測試,久而久之,N久前的那個BUG可能又神不知鬼不覺的重現了。相比之下,單元測試的優點就凸顯出來了,把需要測試的典型情況編寫為測試代碼,然后編譯運行即可完成自動化的測試,當發現BUG后,把它添加到測試用例,不僅可以提高測試覆蓋率,還能保證以后不會再次引入同樣的BUG,有了足夠的單元測試(覆蓋率),你就可以理直氣壯的說代碼沒問題!當然引入單元測試會在前期花費不少的時間來編寫測試代碼,但相應的也會大大減少后期的維護工作,最主要的是能可靠的提高程序的質量,所以是值得的,甚至是必要的。(如果你編譯過開源的Google Chromium瀏覽器,你會發現測試代碼就占了不少,光是編譯測試代碼就得花很長的時間)

除了上面說的優點外,單元測試還有一些其它的好處,比如幫你理清設計。一些人反對單元測試就是因為說我們的應用太復雜了,沒法做單元測試。其實不一定是應用復雜,而有可能是設計得有問題,導致了沒有可測試性。比如有些人喜歡在CXXXDialog里編寫所有的功能實現,要測試這樣的代碼,必須得創建出Dialog,可能還需要點擊,這顯然沒法做單元測試,但如果把Dialog和業務邏輯分開設計,那至少業務邏輯是可測試的(暫不討論UI的測試)。因此要做單元測試,就得設計好各個接口,保證某個接口只完成單一的功能,沒有過多的耦合依賴。

前面只是泛泛而談了一些單元測試的皮毛,鼓吹了一些優點,有興趣的自己找更詳細的資料看吧。另推薦一個Google的開源C++測試框架googletest

posted @ 2011-09-15 06:37 RTY 閱讀(380) | 評論 (0)編輯 收藏

     摘要: http://threadingbuildingblocks.org/事情十這樣的,有同事想要統計某些廣告的點擊,在多線程下運行,可能會同時操作同一個數據項,最早使用一個全局鎖,效果不好,現在改成了細粒度鎖,每一個數據項一個鎖,但還是希望性能更好些。我的想法是,使用Intel TBB的Atomic,這就避免了使用鎖,同時性能也會提升,不過,到底能提升多少還要用數據說話。1. 不使用鎖的情況#inc...  閱讀全文

posted @ 2011-09-15 06:30 RTY 閱讀(493) | 評論 (0)編輯 收藏

1. 讀取ini、修改ini   使用ConfigParser
示例代碼:
比如有一個文件Userinfo.ini,里面有這些內容:

[userinfo]
EngineVersion=0
DATVersion=5127
FileName=dat-5127.zip
FilePath=/pub/antivirus/datfiles/4.x/
FileSize=13481555
Checksum=6037,021E
MD5=aaeb519d3f276b810d46642d782d8921
那就可以通過下面這些代碼得到MD5的值,簡單吧
#!/usr/bin/env python
#
 -*- coding: utf-8 -*-

import ConfigParser

config 
= ConfigParser.ConfigParser()
config.readfp(open(
'update.ini'))

= config.get("ZIP","MD5")
print a

××××××××××××××××××××××××××××××××××××××××××××××××
寫也很簡單:
import ConfigParser

config 
= ConfigParser.ConfigParser()

# set a number of parameters
config.add_section("book")
config.set(
"book""title""the python standard library")
config.set(
"book""author""fredrik lundh")

config.add_section(
"ematter")
config.set(
"ematter""pages"250)

# write to file
config.write(open('1.ini'"w"))

×××××××××××××××××××××××××××××××××××××××××
修改也不難(添加內容):
#!/usr/bin/env python
#
 -*- coding: utf-8 -*-

import ConfigParser

config 
= ConfigParser.ConfigParser()

config.read(
'1.ini')

= config.add_section("md5")

config.set(
"md5""value""1234")

config.write(open(
'1.ini'"r+"))     #可以把r+改成其他方式,看看結果:)

修改內容:
#!/usr/bin/env python
#
 -*- coding: utf-8 -*-

import ConfigParser

config 
= ConfigParser.ConfigParser()

config.read(
'1.ini')

config.set(
"md5""value""kingsoft")    #這樣md5就從1234變成kingsoft了

config.write(open(
'1.ini'"r+"))

posted @ 2011-09-02 21:57 RTY 閱讀(369) | 評論 (0)編輯 收藏

僅列出標題
共31頁: First 6 7 8 9 10 11 12 13 14 Last 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久久久婷| 99国产精品久久久久老师| 久久香蕉精品| 免费影视亚洲| 欧美jizzhd精品欧美巨大免费| 鲁大师成人一区二区三区| 欧美mv日韩mv亚洲| 国产精品大片| 国内精品国产成人| 亚洲精品在线观看免费| 一个色综合导航| 欧美亚洲网站| 欧美激情视频免费观看| 一区二区日韩欧美| 午夜久久电影网| 欧美高清影院| 国产一区二区在线观看免费| 99国内精品| 久久深夜福利免费观看| 亚洲精品老司机| 日韩视频免费观看| 久久国产精品免费一区| 欧美日韩国产999| 黑人一区二区三区四区五区| 亚洲午夜激情网站| 欧美国产一区二区三区激情无套| 亚洲亚洲精品在线观看| 欧美国产免费| 在线观看成人网| 久久精品国产成人| 在线亚洲欧美专区二区| 老鸭窝毛片一区二区三区| 国产精品五月天| 日韩一区二区电影网| 久久久久久久成人| 一二三四社区欧美黄| 麻豆精品网站| 激情久久综合| 久久久久看片| 欧美在线视频网站| 国产视频综合在线| 午夜亚洲福利| 亚洲最黄网站| 欧美日韩中文在线| 一本在线高清不卡dvd| 亚洲国产精品久久91精品| 久久久精品午夜少妇| 国产一区二区高清不卡| 欧美在线视频观看免费网站| 中文亚洲欧美| 国产精品成人一区| 亚洲自拍偷拍色片视频| 一本久道久久综合中文字幕| 欧美日韩午夜剧场| 亚洲一区二区三区免费观看| 日韩一级在线观看| 欧美日一区二区在线观看| 99精品国产热久久91蜜凸| 亚洲欧洲精品一区二区精品久久久 | 欧美日本一区| 亚洲伦理在线| 亚洲国产成人一区| 久久精选视频| 好吊色欧美一区二区三区四区 | 久久国产精品久久w女人spa| 亚洲欧美国产高清| 国产真实乱偷精品视频免| 久久亚洲图片| 欧美不卡激情三级在线观看| 亚洲最黄网站| 午夜精品久久久| 1024成人| 夜夜狂射影院欧美极品| 国产欧美日韩亚洲一区二区三区| 欧美一区=区| 在线欧美福利| 日韩视频一区二区在线观看 | 国产日韩亚洲欧美综合| 久久夜精品va视频免费观看| 麻豆精品精品国产自在97香蕉| 妖精成人www高清在线观看| 一区二区三区日韩| 黄色亚洲免费| 亚洲伦理自拍| 国产综合香蕉五月婷在线| 亚洲成人资源| 国产欧美日韩免费看aⅴ视频| 免播放器亚洲一区| 欧美三级午夜理伦三级中文幕 | 夜夜嗨av一区二区三区网页| 亚洲亚洲精品在线观看| 亚洲高清资源| 亚洲永久在线| 亚洲精品一区二区三区在线观看| 亚洲男女自偷自拍图片另类| 最新日韩中文字幕| 亚洲欧美日韩国产综合| 亚洲精品久久久蜜桃| 亚洲综合社区| 一区二区毛片| 另类天堂av| 久久久噜噜噜久久狠狠50岁| 欧美日韩综合视频| 亚洲丰满在线| 黄色国产精品一区二区三区| 日韩视频一区二区在线观看| 亚洲成人资源网| 性做久久久久久久久| 亚洲一区二区三区在线视频| 欧美电影在线| 欧美成人首页| 狠狠色狠狠色综合| 亚洲一区二区三区视频播放| 久久综合伊人| 国产婷婷一区二区| 亚洲欧洲三级电影| 在线观看一区欧美| 欧美在线影院| 午夜伦理片一区| 亚洲精品视频免费| 久久人人精品| 久久久99免费视频| 国产精品色网| 亚洲一级电影| 亚洲综合色网站| 欧美丝袜一区二区三区| 亚洲精品久久久久久久久| 亚洲精品美女在线观看播放| 久久影视三级福利片| 久久免费视频观看| 国产亚洲精品bt天堂精选| 亚洲欧美日韩专区| 久久精品国产77777蜜臀| 国产女主播一区二区三区| 亚洲自拍偷拍色片视频| 欧美一级大片在线免费观看| 国产精品久久久亚洲一区| 99国产成+人+综合+亚洲欧美| 一级成人国产| 国产精品久久久久一区二区三区| 亚洲一区二区三区久久| 欧美在线视频在线播放完整版免费观看| 国产精品久久999| 亚洲一区二区三区精品在线| 欧美中文在线视频| 狠狠入ady亚洲精品| 久久亚洲一区二区| 亚洲经典三级| 亚洲欧美区自拍先锋| 国产女主播一区二区三区| 久久久精品国产免大香伊| 亚洲国产aⅴ天堂久久| 中日韩高清电影网| 国产女人精品视频| 久久先锋影音av| 99国产精品视频免费观看一公开 | 欧美激情第1页| 一本色道婷婷久久欧美| 欧美在线播放高清精品| 伊人狠狠色j香婷婷综合| 欧美高清影院| 亚洲欧美网站| 亚洲第一综合天堂另类专| 在线视频日本亚洲性| 国产色视频一区| 欧美成人在线影院| 中文国产成人精品久久一| 久久精视频免费在线久久完整在线看| 亚洲第一久久影院| 国产精品对白刺激久久久| 久久久久这里只有精品| 99精品国产在热久久下载| 老司机精品视频一区二区三区| 日韩视频在线观看免费| 国产亚洲精品v| 欧美午夜在线一二页| 久久婷婷国产综合国色天香| 一级成人国产| 91久久黄色| 久久亚洲一区二区三区四区| 亚洲深夜福利视频| 亚洲风情亚aⅴ在线发布| 国产精品扒开腿爽爽爽视频| 牛牛国产精品| 久久精品国产99国产精品澳门| 亚洲精选国产| 欧美激情亚洲另类| 久久久无码精品亚洲日韩按摩| 一区二区三区免费观看| 在线电影国产精品| 国产亚洲精久久久久久| 国产精品红桃| 欧美日韩在线电影| 欧美精品午夜视频| 欧美xxxx在线观看| 久久婷婷影院| 久久久五月天| 久久人人97超碰人人澡爱香蕉 | 国产精品你懂的在线| 欧美日韩精品免费|