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

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 閱讀(918) | 評論 (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 閱讀(795) | 評論 (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 閱讀(306) | 評論 (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 閱讀(661) | 評論 (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 閱讀(501) | 評論 (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 閱讀(1447) | 評論 (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 閱讀(1504) | 評論 (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 閱讀(379) | 評論 (0)編輯 收藏

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

posted @ 2011-09-15 06:30 RTY 閱讀(492) | 評論 (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 閱讀(368) | 評論 (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>
            欧美成人在线免费视频| 欧美自拍偷拍| 亚洲一二三区在线| 女女同性精品视频| 久久se精品一区精品二区| 欧美黑人多人双交| 亚洲国产福利在线| 午夜亚洲性色视频| 国产精品二区在线| 日韩视频精品在线观看| 久久资源在线| 欧美影院午夜播放| 国产欧美精品在线观看| 亚洲一区久久久| 夜夜嗨一区二区| 亚洲国产1区| 日韩网站在线| 亚洲欧美视频| 国产色综合网| 欧美一区成人| 亚洲自拍另类| 国产一区二区欧美日韩| 亚洲欧美日韩精品久久亚洲区 | 91久久国产综合久久蜜月精品 | 韩国三级电影一区二区| 午夜伦欧美伦电影理论片| 一本一本久久a久久精品牛牛影视| 欧美激情国产日韩| 一本色道久久88综合日韩精品| 亚洲第一页在线| 欧美理论在线| 亚洲欧美在线一区二区| 亚洲午夜久久久久久久久电影网| 国产精品不卡在线| 久久精品国产99精品国产亚洲性色 | 亚洲欧美日韩专区| 亚洲欧美文学| 亚洲日本乱码在线观看| 亚洲三级影院| 国产精自产拍久久久久久| 午夜精品视频在线观看一区二区| 亚洲制服av| 伊人成年综合电影网| 欧美成人午夜激情在线| 欧美高清视频一区二区| 亚洲综合欧美日韩| 久久精品国产亚洲精品 | 亚洲欧美日韩精品综合在线观看| 一区二区日韩欧美| 国内久久精品| av成人免费在线观看| 国产精品v日韩精品| 久久不见久久见免费视频1| 欧美在线3区| 日韩一区二区久久| 欧美一区二区高清| 亚洲美女av电影| 午夜精品一区二区三区四区| 国产日韩在线播放| 亚洲三级观看| 在线观看欧美日韩国产| 一区二区三区视频在线观看| 国产精品亚洲成人| 亚洲国产综合视频在线观看 | 亚洲欧美一区二区激情| 久久另类ts人妖一区二区| 99精品99久久久久久宅男| 午夜激情亚洲| 国产精品久久久久毛片大屁完整版| 国产视频欧美| 久久精品91久久久久久再现| 麻豆成人91精品二区三区| 91久久在线播放| 国产日韩欧美在线看| 亚洲国产成人午夜在线一区| 欧美三级电影大全| 欧美国产日本高清在线| 国产精品一区久久| 亚洲精品免费网站| 91久久综合| 麻豆精品精品国产自在97香蕉| 欧美在线视频观看免费网站| 欧美成人精品在线| 亚洲电影自拍| 亚洲黄色小视频| 久久亚洲国产成人| 麻豆国产精品777777在线| 国产女主播视频一区二区| 日韩一级黄色大片| 一区电影在线观看| 欧美日韩一二三区| 亚洲日本中文| 日韩一二三区视频| 欧美黄色aaaa| 99精品黄色片免费大全| 亚洲精品久久久蜜桃| 久久er精品视频| 久久一区激情| 亚洲国产精品成人精品| 久久午夜视频| 欧美激情2020午夜免费观看| 国产视频一区在线| 久久久福利视频| 免费在线观看一区二区| 精品999成人| 久久亚洲二区| 亚洲日本免费电影| 亚洲永久免费| 国产日本欧美一区二区| 亚洲欧美成人精品| 久久天天躁夜夜躁狠狠躁2022 | 欧美88av| 亚洲精品久久久久久下一站| 亚洲国产天堂久久国产91| 久久综合色88| 亚洲激情一区二区| 亚洲网站视频| 国产一区二区三区精品欧美日韩一区二区三区| 亚洲欧美在线一区二区| 久久国产精品久久精品国产 | 亚洲一区二区精品视频| 欧美午夜片欧美片在线观看| 亚洲精品综合在线| 新狼窝色av性久久久久久| 国产美女精品一区二区三区 | 欧美成年人网站| 亚洲最新色图| 久久久av毛片精品| 久久久欧美一区二区| 国产亚洲欧美激情| 久久综合中文| 91久久精品美女| 国产精品久久久久av| 亚洲欧美日韩视频二区| 久久国内精品视频| 日韩视频―中文字幕| 欧美性猛交xxxx乱大交退制版| 亚洲在线中文字幕| 亚洲第一综合天堂另类专| 中文一区在线| 欲香欲色天天天综合和网| 欧美日韩黄色大片| 久久精品一二三区| 在线视频日韩| 亚洲国产成人精品久久久国产成人一区| 亚洲午夜一区| 亚洲日本欧美在线| 国产性天天综合网| 欧美日韩国产系列| 久久只精品国产| 翔田千里一区二区| 一区二区三区日韩欧美精品| 久久久国际精品| 亚洲欧美日韩综合一区| 91久久久久久久久久久久久| 欧美三级精品| 欧美福利专区| 狂野欧美激情性xxxx| 亚洲一级黄色| 一本色道久久综合亚洲精品不| 免费国产一区二区| 久久精品综合一区| 午夜影视日本亚洲欧洲精品| 在线欧美日韩精品| 国产日韩欧美不卡| 国产精品亚洲精品| 欧美日韩一区自拍| 欧美精品久久久久久久免费观看| 欧美尤物一区| 欧美在线视频不卡| 午夜宅男久久久| 午夜精品视频在线| 午夜精品久久久| 欧美一二区视频| 欧美亚洲一区二区三区| 一区二区三区欧美成人| 亚洲国产高潮在线观看| 欧美11—12娇小xxxx| 久久一区二区三区四区五区| 亚洲免费在线观看| 亚洲一区图片| 亚洲一区二区免费看| 亚洲一区二区视频| 午夜精品一区二区三区四区| 亚洲精品永久免费| 99re热这里只有精品免费视频| 在线观看国产成人av片| 狠狠色丁香久久婷婷综合_中| 国产欧美一区二区精品婷婷 | 国产精品嫩草影院一区二区 | 中日韩在线视频| 亚洲视频在线观看网站| 99精品欧美一区| 中文无字幕一区二区三区| 亚洲亚洲精品三区日韩精品在线视频 | 欧美成人首页| 亚洲精品一区二区三区婷婷月 | 欧美亚洲视频在线观看| 久久99在线观看| 久久亚洲欧美|