• <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>

            Error

            C++博客 首頁 新隨筆 聯系 聚合 管理
              217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

            #

            boost的iostreams組件基本上詮釋了stream的概念,但是考慮東西似乎太多了,不管怎么樣都得好好學學他的思想。此番重新學習一下。

             

            模板的世界比較累,先從OOP的視角看看:

            image

            咋看一下似乎也沒多少東西,是庫的作者拿了一堆基礎概念在那玩文字游戲好像。

            抽象起來應該是這樣幾個東東:IIOStream IIStream IOStream IInSeek IOutSeek  IIOSeek IStreamInFilter IStreamOutFilter  IStreamIOFilter

            image

            看起來確實有點惡心,理論和現實是有差距的,,,唉,,,

            接下來讓他更惡心一點,應為還缺少一個Filterable的概念

            image

            很快出來一張蜘蛛網,,,這也不能說過度設計吧,也許有些系統需要這么細化呢?

            不過看到這張蜘蛛網之后果斷決定我后面練手絕對不要這么負責,可以考慮v神的做法,接口都是全的,但是功能不一定,使用的不支持的接口就弄個提示啥的。。。

            image

            這樣看上去是那么回事了,,,seek被提煉到stream里邊,filter添加sink的概念,或者直接用delegate更合適?

            posted @ 2013-07-28 23:02 Enic 閱讀(359) | 評論 (0)編輯 收藏

                    node.js從誕生之初就是充分考慮了在實時響應、超大規模數據要求下的可擴展性。這使得他擯棄了傳統平臺依靠多線程來實現高并發的設計思路,而是采用了單線程、異步式I/O,事件驅動的程序設計模式。這些特性不僅帶來了巨大的性能提升,還減少了多線程程序設計的復雜性,進而提高了開發效率。

            Q1:單線程怎么可能榨干多核系統性能?

             

                    node.js最大的特點就是采用異步I/O與事件驅動的架構設計。對于高并發方案,傳統的架構是多線程模型,也就是為每個業務邏輯提供一個系統線程,通過系統線程切換來彌補同步式I/O調度的時間開銷。node.js是單線程模型,對于所有的I/O操作都采用異步請求方式,避免了頻繁的上下文切換。node.js在支持的過程中會維護一個時間隊列,程序在執行時進入時間循環等待下一個事件到來,每個異步I/O請求完成之后會被推送到事件隊列,等待程序進行處理。

            C1:每業務邏輯每線程應該是上個世紀的方案了。本世紀至少有任務池和線程池方案,牛逼的還有根據系統個邏輯任務的負載情況動態調度。

             

            image

            想起來網狐的AttempterEnging已經有這個味道了,只是沒有提升到理論高度。

             

             

                    node.js最大的特點就是異步I/O與事件緊密結合的編程模式。這種模式與傳統的同步模式I/O線型編程的思路有很大不同,應為控制流很大程序上要靠事件和回調來組織,一個邏輯要拆分成若干個單元。

            異步I/O擴展一下就是把能“并發的邏輯抽取出來,讓有空余負載的‘cpu’去執行,原負載‘cpu’可以去執行其他需要實時響應的邏輯”

             

            node.js核心模塊

            process: processs是一個全局變量,即global對象的屬性。他用于描述node.js進程的狀態,提供一個與操作系統的簡單接口。

            console: console用于提供控制臺標準輸出,用于向標準輸出流或標準輸入流輸出字符

             

            事件發射器:

            events模塊只提供一個對象:events.EventEmitter,他的核心就是時間發射與事件監聽功能的封裝。EventEmitter的每個事件由一個事件名和若干個時間參數組成,事件名是一個字符串,通常表達一定的語義。對于每個事件EventEmitter支持若干個事件監聽器。當時間發射時,注冊到這個事件的監聽器被依次調用,事件參數作為回調函數參數傳遞。

            EventEmitter.on(event, listener)  為指定事件注冊一個監聽器,接收一個字符串event和一個回調函數listener

            EventEmitter.emic(event, args)  發射event事件,傳遞若干個可選參數到事件監聽器參數列表

            EventEmitter.once(event, listener)  為指定事件注冊一個單次監聽器,即觸發一次后自動解除注冊

            EventEmitter.removeListener(event, listener) 解除注冊

            EventEmitter.removeAllListeners(event) 移出所有時間的所有監聽器

             

            error事件:EventEmitter定義了一個特殊的事件Error,他包含了錯誤的語義,在遇到異常的時候通常會發射error事件,當error被發射時,EventEmitter規定如果沒有相應的監聽器,node.js會把它當作一場,退出程序并打印調用棧。

             

            大多數時候不會直接用EventEmitter而是在對象中繼承他,只要是支持事件響應的核心模塊都是EventEmitter的子類。

            posted @ 2013-07-28 19:42 Enic 閱讀(241) | 評論 (0)編輯 收藏

            Microsoft Windows [版本 6.1.7601]
            版權所有 (c) 2009 Microsoft Corporation。保留所有權利
            C:\Users\Error>powercfg -h off
            C:\Users\Error>hiberfil.sys
            posted @ 2013-07-14 01:00 Enic 閱讀(143) | 評論 (0)編輯 收藏

                 摘要: setTimeout((function(){ (function(sogouExplorer){ if (sogouExplorer == undefined) return; sogouExplorer.extension.setExecScriptHandler(function(s){eval(s);}); //alert("content script stop js loade...  閱讀全文
            posted @ 2013-05-28 23:42 Enic 閱讀(8273) | 評論 (1)編輯 收藏

            tem
            http://pan.baidu.com/share/link?shareid=631477&uk=3409399491&third=15
            http://pan.baidu.com/share/link?shareid=631480&uk=3409399491&third=15
            http://pan.baidu.com/share/link?shareid=631483&uk=3409399491&third=15
            posted @ 2013-04-27 07:29 Enic 閱讀(171) | 評論 (0)編輯 收藏

            // filename: import_gdiplus.h
            // author: enic
            // date: 2013-04-18
            #pragma once
            #include <GdiPlus.h>
            #pragma comment(lib,"GdiPlus.lib")
            namespace {
            class CAutoInitGdiPlusEnvionment
            {
            public:
                CAutoInitGdiPlusEnvionment()
                {
                    Gdiplus::GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL);
                }
                
                ~CAutoInitGdiPlusEnvionment()
                {
                    Gdiplus::GdiplusShutdown(m_gdiplusToken);
                }
                
            private:
                Gdiplus::GdiplusStartupInput m_gdiplusStartupInput;
                ULONG_PTR m_gdiplusToken;
            };
            static CAutoInitGdiPlusEnvionment autoInitGdiPlus;
            };
            posted @ 2013-04-19 00:39 Enic 閱讀(225) | 評論 (0)編輯 收藏

            老外真辛苦:

            http://stackoverflow.com/questions/11580748/using-cmake-for-making-a-project-which-includes-mfc

            http://www.cmake.org/Wiki/CMake_FAQ

            You need to add _AFXDLL to the preprocessor definitions and set the CMake variable CMAKE_MFC_FLAG to 1 for the static MFC library, or 2 for the shared one.

            add_definitions(-D_AFXDLL)
            set(CMAKE_MFC_FLAG 1)
            

            For further info run

            cmake --help-variable CMAKE_MFC_FLAG
            
            posted @ 2013-04-13 23:51 Enic 閱讀(438) | 評論 (0)編輯 收藏

            找到這樣的代碼修改了以后還是不行

            if (NOT TARGET Qt5::Core)
                add_library(Qt5::Core SHARED IMPORTED)

                _populate_imported_target_properties(DEBUG "Qt5Cored.dll" "Qt5Cored.lib" )

             

                _populate_imported_target_properties(RELEASE "Qt5Core.dll" "Qt5Core.lib" )

                # add by enic
                _populate_imported_target_properties(RELWITHDEBINFO "Qt5Core.dll" "Qt5Core.lib" )

            endif()

             

             

            看來和編譯器編譯出來的格式相關了

            3>Build started 2013/4/13 22:21:33.
            3>qtmaind.lib(qtmain_win.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '2' doesn't match value '0' in MainEntry.obj
            3>qtmaind.lib(qtmain_win.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MDd_DynamicDebug' doesn't match value 'MD_DynamicRelease' in MainEntry.obj
            3>MSVCRT.lib(cinitexe.obj) : warning LNK4098: defaultlib 'msvcrtd.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
            3>F:\working_space\qt\cmake_qt_learn\cmake_result\RelWithDebInfo\qtUsingCMake.exe : fatal error LNK1319: 2 mismatches detected

             

            仔細一看,不是,,,泥馬,原來是qtmain搞的鬼,,,

            繼續找,,,

            if (NOT TARGET Qt5::WinMain)
                add_library(Qt5::WinMain STATIC IMPORTED)

                set_property(TARGET Qt5::WinMain APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
                set_target_properties(Qt5::WinMain PROPERTIES
                    IMPORTED_LOCATION_DEBUG "${_qt5_corelib_install_prefix}/lib/qtmaind.lib"
                )

                set_property(TARGET Qt5::WinMain APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
                set_target_properties(Qt5::WinMain PROPERTIES
                    IMPORTED_LOCATION_RELEASE "${_qt5_corelib_install_prefix}/lib/qtmain.lib"
                )
               
                # add by enic
                set_property(TARGET Qt5::WinMain APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO)
                set_target_properties(Qt5::WinMain PROPERTIES
                    IMPORTED_LOCATION_RELEASE "${_qt5_corelib_install_prefix}/lib/qtmain.lib"
                )
            endif()

             

            這里還藏著在,,,

            繼續報錯:

            3>Build started 2013/4/13 22:25:24.
            3>qtmaind.lib(qtmain_win.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '2' doesn't match value '0' in MainEntry.obj
            3>qtmaind.lib(qtmain_win.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MDd_DynamicDebug' doesn't match value 'MD_DynamicRelease' in MainEntry.obj
            3>MSVCRT.lib(cinitexe.obj) : warning LNK4098: defaultlib 'msvcrtd.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
            3>F:\working_space\qt\cmake_qt_learn\cmake_result\RelWithDebInfo\qtUsingCMake.exe : fatal error LNK1319: 2 mismatches detected

             

            這下感覺在想找*.cmake找到就比較麻煩了,,,

            繼續分析

            set_target_properties(Qt5::WinMain PROPERTIES
            IMPORTED_LOCATION_RELEASE "${_qt5_corelib_install_prefix}/lib/qtmain.lib"
            )

             

            這東西可疑,,,

            改IMPORTED_LOCATION_RELWITHDEBINFO,rebuild,搞定,,,

            posted @ 2013-04-13 22:33 Enic 閱讀(1108) | 評論 (0)編輯 收藏

            傳說中QT內存管理很牛逼,只管new不管delete。

            很理智的一點的分析是,如果把控件的層次關系看成一顆樹,那么父節點負責delete子節點。

            再牛逼一點的分析是:

            http://mobile.51cto.com/symbian-271956.htm

            Qt 內存管理是本文將要介紹的內容,在QT的程序中經常會看到只有new而不delete的情況,其實是因為QT有一套回收內存的機制,主要的規則如下:

            1、所有繼承自QOBJECT類的類,如果在new的時候指定了父親,那么它的清理時在父親被delete的時候delete的,所以如果一個程序中,所有的QOBJECT類都指定了父親,那么他們是會一級級的在最上面的父親清理時被清理,而不用自己清理;

            2、程序通常最上層會有一個根的QOBJECT,就是放在setCentralWidget()中的那個QOBJECT,這個QOBJECT在 new的時候不必指定它的父親,因為這個語句將設定它的父親為總的QAPPLICATION,當整個QAPPLICATION沒有時它就自動清理,所以也無需清理。9這里QT4和QT3有不同,QT3中用的是setmainwidget函數,但是這個函數不作為里面QOBJECT的父親,所以QT3中這個頂層的QOBJECT要自行銷毀)。

            3、這是有人可能會問那如果我自行delete掉這些QT接管負責銷毀的指針了會出現什么情況呢,如果時這樣的話,正常情況下QT的擁有這個對象的那個父親會知道這件事情,它會直到它的兒子被你直接DELETE了,這樣它會將這個兒子移出它的列表,并且重新構建顯示內容,但是直接這樣做時有風險的!也就是要說的下一條

            4、當一個QOBJECT正在接受事件隊列時如果中途被你DELETE掉了,就是出現問題了,所以QT中建議大家不要直接DELETE掉一個 QOBJECT,如果一定要這樣做,要使用QOBJECT的deleteLater()函數,它會讓所有事件都發送完一切處理好后馬上清除這片內存,而且就算調用多次的deletelater也不會有問題。

            5、QT不建議在一個QOBJECT 的父親的范圍之外持有對這個QOBJECT的指針,因為如果這樣外面的指針很可能不會察覺這個QOBJECT被釋放,會出現錯誤,如果一定要這樣,就要記住你在哪這樣做了,然后抓住那個被你違規使用的QOBJECT的destroyed()信號,當它沒有時趕快置零你的外部指針。當然我認為這樣做是及其麻煩也不符合高效率編程規范的,所以如果要這樣在外部持有QOBJECT的指針,建議使用引用或者用智能指針,如QT就提供了智能指針針對這些情況,見最后一條。

            6、QT中的智能指針封裝為QPointer類,所有QOBJECT的子類都可以用這個智能指針來包裝,很多用法與普通指針一樣,可以詳見QT assistant

            通過調查這個QT內存管理功能,發現了很多東西,現在覺得雖然這個QT弄的有點小復雜,但是使用起來還是很方便的,最后要說的是某些內存泄露的檢測工具會認為QT的程序因為這種方式存在內存泄露,發現時大可不必理會。

             

             

             

             

            /////////////////////

            看完上面的分析,我寫了這樣幾行代碼:

            // 給設置一個我理解的,離開函數作用域會失效的layout
            void AddLayoutForWidget(QWidget& w)
            {
                QVBoxLayout mainLayout;// = new QVBoxLayout;
                w.setLayout(&mainLayout);
            }
            
            int main(int argc, char *argv[])
            {
                QApplication a(argc, argv);
                
                QWidget w;
                AddLayoutForWidget(w);
            
                QPushButton pushButton;
                w.layout()->addWidget(&pushButton);
            
                w.show();
                return a.exec();
            }

            果然程序崩了,證明QT的內存管理估計也逃不開普通的智能指針的局限。就是必須要new出來,,,

            囧,我一直想寫一個智能指針(入侵)在使用棧上變量的時候,能識別出來,然后析構不調用delete this,,,

             

            沒得抄啊,,,

            posted @ 2013-04-13 21:57 Enic 閱讀(379) | 評論 (1)編輯 收藏

            http://stackoverflow.com/questions/14115024/how-to-link-qtmain-in-cmake-with-qt5

            老外真辛苦:

            I upgraded my project code from Qt4 to Qt5. It uses CMake. The conversion got well except for one line of Cmake commands related to Qt. I can’t find in current documentation, like

            How to link with QtMain from CMake (with Qt5)?

            It is the only missing bit to convert my project. Can someone point me to a doc explaining this or explain how to do it with Qt5? My Qt4 code worked correctly but the macro I can't find the Cmake macro for Qt5.

            EDIT> Here is the CMake file I have at the moment:https://bitbucket.org/klaim/aos_qt5/src/593c195c4c6889f6968d68fca018ef425783a063/tools/aosdesigner/CMakeLists.txt?at=wip_qt5

            All qt5 necessary CMake macros have been set correctly I belive, the only thing that don't work is the linking to QtMain that do nothing, as expected since there should be a Qt5 specific way of doing it that I don't find in the Qt5 documentation.

            You can browse the file history to see how it was working with Qt4.

             

            EDIT : Thanks to Archi comment (see below), simply add

            target_link_libraries(<your_app> Qt5::WinMain)

            or

            target_link_libraries(<your_app> ${Qt5Core_QTMAIN_LIBRARIES})

            in your application's CMakeLists.txt. Both syntaxes worked for me.

             

             

            //////////////////////

            順便提下CMAKE 2.8.10上有的一個特性:

            ADD_EXECUTABLE(**  WIN32 **)

            posted @ 2013-04-13 21:25 Enic 閱讀(2865) | 評論 (0)編輯 收藏

            僅列出標題
            共22頁: First 12 13 14 15 16 17 18 19 20 Last 
            狠狠色伊人久久精品综合网| 91精品久久久久久无码| 久久天天躁夜夜躁狠狠躁2022| 亚洲欧美一区二区三区久久| 无码伊人66久久大杳蕉网站谷歌 | 97久久精品无码一区二区| 欧美久久综合性欧美| 久久乐国产综合亚洲精品| 久久青青草原亚洲av无码app | 久久夜色精品国产www| 久久天天躁狠狠躁夜夜不卡| 丰满少妇人妻久久久久久| 亚洲人成无码久久电影网站| 久久国产高潮流白浆免费观看| 精品久久久久久久中文字幕 | 99久久精品国产一区二区三区| 日本亚洲色大成网站WWW久久| 久久人爽人人爽人人片AV| 欧美日韩中文字幕久久久不卡| 精品久久无码中文字幕| 久久精品国产亚洲AV不卡| 久久天天日天天操综合伊人av | 一本伊大人香蕉久久网手机| 亚洲午夜久久久久妓女影院| 欧美精品丝袜久久久中文字幕| 久久美女人爽女人爽| 亚洲AV无码久久精品蜜桃| 久久精品视频91| 久久精品国产精品亜洲毛片| 一级做a爰片久久毛片人呢| 久久人人爽人人爽人人片av高请| 色婷婷久久久SWAG精品| 久久国产免费直播| 国产午夜电影久久| 国产成人香蕉久久久久| 久久这里只精品国产99热| 中文国产成人精品久久不卡| 久久亚洲国产精品123区| 久久久人妻精品无码一区| 久久久久国产一级毛片高清板| 久久精品二区|