• <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++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
              217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

            #

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

             

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

            image

            咋看一下似乎也沒(méi)多少東西,是庫(kù)的作者拿了一堆基礎(chǔ)概念在那玩文字游戲好像。

            抽象起來(lái)應(yīng)該是這樣幾個(gè)東東:IIOStream IIStream IOStream IInSeek IOutSeek  IIOSeek IStreamInFilter IStreamOutFilter  IStreamIOFilter

            image

            看起來(lái)確實(shí)有點(diǎn)惡心,理論和現(xiàn)實(shí)是有差距的,,,唉,,,

            接下來(lái)讓他更惡心一點(diǎn),應(yīng)為還缺少一個(gè)Filterable的概念

            image

            很快出來(lái)一張蜘蛛網(wǎng),,,這也不能說(shuō)過(guò)度設(shè)計(jì)吧,也許有些系統(tǒng)需要這么細(xì)化呢?

            不過(guò)看到這張蜘蛛網(wǎng)之后果斷決定我后面練手絕對(duì)不要這么負(fù)責(zé),可以考慮v神的做法,接口都是全的,但是功能不一定,使用的不支持的接口就弄個(gè)提示啥的。。。

            image

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

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

                    node.js從誕生之初就是充分考慮了在實(shí)時(shí)響應(yīng)、超大規(guī)模數(shù)據(jù)要求下的可擴(kuò)展性。這使得他擯棄了傳統(tǒng)平臺(tái)依靠多線程來(lái)實(shí)現(xiàn)高并發(fā)的設(shè)計(jì)思路,而是采用了單線程、異步式I/O,事件驅(qū)動(dòng)的程序設(shè)計(jì)模式。這些特性不僅帶來(lái)了巨大的性能提升,還減少了多線程程序設(shè)計(jì)的復(fù)雜性,進(jìn)而提高了開(kāi)發(fā)效率。

            Q1:單線程怎么可能榨干多核系統(tǒng)性能?

             

                    node.js最大的特點(diǎn)就是采用異步I/O與事件驅(qū)動(dòng)的架構(gòu)設(shè)計(jì)。對(duì)于高并發(fā)方案,傳統(tǒng)的架構(gòu)是多線程模型,也就是為每個(gè)業(yè)務(wù)邏輯提供一個(gè)系統(tǒng)線程,通過(guò)系統(tǒng)線程切換來(lái)彌補(bǔ)同步式I/O調(diào)度的時(shí)間開(kāi)銷(xiāo)。node.js是單線程模型,對(duì)于所有的I/O操作都采用異步請(qǐng)求方式,避免了頻繁的上下文切換。node.js在支持的過(guò)程中會(huì)維護(hù)一個(gè)時(shí)間隊(duì)列,程序在執(zhí)行時(shí)進(jìn)入時(shí)間循環(huán)等待下一個(gè)事件到來(lái),每個(gè)異步I/O請(qǐng)求完成之后會(huì)被推送到事件隊(duì)列,等待程序進(jìn)行處理。

            C1:每業(yè)務(wù)邏輯每線程應(yīng)該是上個(gè)世紀(jì)的方案了。本世紀(jì)至少有任務(wù)池和線程池方案,牛逼的還有根據(jù)系統(tǒng)個(gè)邏輯任務(wù)的負(fù)載情況動(dòng)態(tài)調(diào)度。

             

            image

            想起來(lái)網(wǎng)狐的AttempterEnging已經(jīng)有這個(gè)味道了,只是沒(méi)有提升到理論高度。

             

             

                    node.js最大的特點(diǎn)就是異步I/O與事件緊密結(jié)合的編程模式。這種模式與傳統(tǒng)的同步模式I/O線型編程的思路有很大不同,應(yīng)為控制流很大程序上要靠事件和回調(diào)來(lái)組織,一個(gè)邏輯要拆分成若干個(gè)單元。

            異步I/O擴(kuò)展一下就是把能“并發(fā)的邏輯抽取出來(lái),讓有空余負(fù)載的‘cpu’去執(zhí)行,原負(fù)載‘cpu’可以去執(zhí)行其他需要實(shí)時(shí)響應(yīng)的邏輯”

             

            node.js核心模塊

            process: processs是一個(gè)全局變量,即global對(duì)象的屬性。他用于描述node.js進(jìn)程的狀態(tài),提供一個(gè)與操作系統(tǒng)的簡(jiǎn)單接口。

            console: console用于提供控制臺(tái)標(biāo)準(zhǔn)輸出,用于向標(biāo)準(zhǔn)輸出流或標(biāo)準(zhǔn)輸入流輸出字符

             

            事件發(fā)射器:

            events模塊只提供一個(gè)對(duì)象:events.EventEmitter,他的核心就是時(shí)間發(fā)射與事件監(jiān)聽(tīng)功能的封裝。EventEmitter的每個(gè)事件由一個(gè)事件名和若干個(gè)時(shí)間參數(shù)組成,事件名是一個(gè)字符串,通常表達(dá)一定的語(yǔ)義。對(duì)于每個(gè)事件EventEmitter支持若干個(gè)事件監(jiān)聽(tīng)器。當(dāng)時(shí)間發(fā)射時(shí),注冊(cè)到這個(gè)事件的監(jiān)聽(tīng)器被依次調(diào)用,事件參數(shù)作為回調(diào)函數(shù)參數(shù)傳遞。

            EventEmitter.on(event, listener)  為指定事件注冊(cè)一個(gè)監(jiān)聽(tīng)器,接收一個(gè)字符串event和一個(gè)回調(diào)函數(shù)listener

            EventEmitter.emic(event, args)  發(fā)射event事件,傳遞若干個(gè)可選參數(shù)到事件監(jiān)聽(tīng)器參數(shù)列表

            EventEmitter.once(event, listener)  為指定事件注冊(cè)一個(gè)單次監(jiān)聽(tīng)器,即觸發(fā)一次后自動(dòng)解除注冊(cè)

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

            EventEmitter.removeAllListeners(event) 移出所有時(shí)間的所有監(jiān)聽(tīng)器

             

            error事件:EventEmitter定義了一個(gè)特殊的事件Error,他包含了錯(cuò)誤的語(yǔ)義,在遇到異常的時(shí)候通常會(huì)發(fā)射error事件,當(dāng)error被發(fā)射時(shí),EventEmitter規(guī)定如果沒(méi)有相應(yīng)的監(jiān)聽(tīng)器,node.js會(huì)把它當(dāng)作一場(chǎng),退出程序并打印調(diào)用棧。

             

            大多數(shù)時(shí)候不會(huì)直接用EventEmitter而是在對(duì)象中繼承他,只要是支持事件響應(yīng)的核心模塊都是EventEmitter的子類。

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

            Microsoft Windows [版本 6.1.7601]
            版權(quán)所有 (c) 2009 Microsoft Corporation。保留所有權(quán)利
            C:\Users\Error>powercfg -h off
            C:\Users\Error>hiberfil.sys
            posted @ 2013-07-14 01:00 Enic 閱讀(146) | 評(píng)論 (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 閱讀(8282) | 評(píng)論 (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 閱讀(174) | 評(píng)論 (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 閱讀(232) | 評(píng)論 (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 閱讀(441) | 評(píng)論 (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()

             

             

            看來(lái)和編譯器編譯出來(lái)的格式相關(guān)了

            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

             

            仔細(xì)一看,不是,,,泥馬,原來(lái)是qtmain搞的鬼,,,

            繼續(xù)找,,,

            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()

             

            這里還藏著在,,,

            繼續(xù)報(bào)錯(cuò):

            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

             

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

            繼續(xù)分析

            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 閱讀(1114) | 評(píng)論 (0)編輯 收藏

            傳說(shuō)中QT內(nèi)存管理很牛逼,只管new不管delete。

            很理智的一點(diǎn)的分析是,如果把控件的層次關(guān)系看成一顆樹(shù),那么父節(jié)點(diǎn)負(fù)責(zé)delete子節(jié)點(diǎn)。

            再牛逼一點(diǎn)的分析是:

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

            Qt 內(nèi)存管理是本文將要介紹的內(nèi)容,在QT的程序中經(jīng)常會(huì)看到只有new而不delete的情況,其實(shí)是因?yàn)?strong>QT有一套回收內(nèi)存的機(jī)制,主要的規(guī)則如下:

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

            2、程序通常最上層會(huì)有一個(gè)根的QOBJECT,就是放在setCentralWidget()中的那個(gè)QOBJECT,這個(gè)QOBJECT在 new的時(shí)候不必指定它的父親,因?yàn)檫@個(gè)語(yǔ)句將設(shè)定它的父親為總的QAPPLICATION,當(dāng)整個(gè)QAPPLICATION沒(méi)有時(shí)它就自動(dòng)清理,所以也無(wú)需清理。9這里QT4和QT3有不同,QT3中用的是setmainwidget函數(shù),但是這個(gè)函數(shù)不作為里面QOBJECT的父親,所以QT3中這個(gè)頂層的QOBJECT要自行銷(xiāo)毀)。

            3、這是有人可能會(huì)問(wèn)那如果我自行delete掉這些QT接管負(fù)責(zé)銷(xiāo)毀的指針了會(huì)出現(xiàn)什么情況呢,如果時(shí)這樣的話,正常情況下QT的擁有這個(gè)對(duì)象的那個(gè)父親會(huì)知道這件事情,它會(huì)直到它的兒子被你直接DELETE了,這樣它會(huì)將這個(gè)兒子移出它的列表,并且重新構(gòu)建顯示內(nèi)容,但是直接這樣做時(shí)有風(fēng)險(xiǎn)的!也就是要說(shuō)的下一條

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

            5、QT不建議在一個(gè)QOBJECT 的父親的范圍之外持有對(duì)這個(gè)QOBJECT的指針,因?yàn)槿绻@樣外面的指針很可能不會(huì)察覺(jué)這個(gè)QOBJECT被釋放,會(huì)出現(xiàn)錯(cuò)誤,如果一定要這樣,就要記住你在哪這樣做了,然后抓住那個(gè)被你違規(guī)使用的QOBJECT的destroyed()信號(hào),當(dāng)它沒(méi)有時(shí)趕快置零你的外部指針。當(dāng)然我認(rèn)為這樣做是及其麻煩也不符合高效率編程規(guī)范的,所以如果要這樣在外部持有QOBJECT的指針,建議使用引用或者用智能指針,如QT就提供了智能指針針對(duì)這些情況,見(jiàn)最后一條。

            6、QT中的智能指針?lè)庋b為QPointer類,所有QOBJECT的子類都可以用這個(gè)智能指針來(lái)包裝,很多用法與普通指針一樣,可以詳見(jiàn)QT assistant

            通過(guò)調(diào)查這個(gè)QT內(nèi)存管理功能,發(fā)現(xiàn)了很多東西,現(xiàn)在覺(jué)得雖然這個(gè)QT弄的有點(diǎn)小復(fù)雜,但是使用起來(lái)還是很方便的,最后要說(shuō)的是某些內(nèi)存泄露的檢測(cè)工具會(huì)認(rèn)為QT的程序因?yàn)檫@種方式存在內(nèi)存泄露,發(fā)現(xiàn)時(shí)大可不必理會(huì)。

             

             

             

             

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

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

            // 給設(shè)置一個(gè)我理解的,離開(kāi)函數(shù)作用域會(huì)失效的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的內(nèi)存管理估計(jì)也逃不開(kāi)普通的智能指針的局限。就是必須要new出來(lái),,,

            囧,我一直想寫(xiě)一個(gè)智能指針(入侵)在使用棧上變量的時(shí)候,能識(shí)別出來(lái),然后析構(gòu)不調(diào)用delete this,,,

             

            沒(méi)得抄啊,,,

            posted @ 2013-04-13 21:57 Enic 閱讀(381) | 評(píng)論 (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上有的一個(gè)特性:

            ADD_EXECUTABLE(**  WIN32 **)

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

            僅列出標(biāo)題
            共22頁(yè): First 12 13 14 15 16 17 18 19 20 Last 
            久久露脸国产精品| 国产精品美女久久久久网| AAA级久久久精品无码片| 久久午夜免费视频| 久久电影网| 久久久精品日本一区二区三区| 国产精品久久国产精品99盘| 日韩精品久久久久久久电影蜜臀| 中文精品99久久国产 | 青青国产成人久久91网| 国产精品99久久免费观看| 久久久久久国产精品无码超碰| 久久婷婷五月综合97色一本一本| 中文国产成人精品久久不卡| 亚洲AV无码久久精品成人| 久久99精品久久久久婷婷| 久久久久国产精品| 久久久久国产视频电影| 久久久久久亚洲精品影院| 久久精品国产99国产精品导航| 欧美亚洲色综久久精品国产| 韩国三级大全久久网站| 久久av高潮av无码av喷吹| 日本欧美国产精品第一页久久| 伊人久久综合成人网| 99久久精品费精品国产一区二区| 国产2021久久精品| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久久久久亚洲AV无码专区| 88久久精品无码一区二区毛片| 久久久久18| 1000部精品久久久久久久久| 久久久久国产一区二区| 久久久久免费看成人影片| 久久精品成人免费观看97| 久久精品毛片免费观看| 久久精品亚洲乱码伦伦中文| 亚洲伊人久久大香线蕉综合图片| 中文字幕亚洲综合久久2| 久久婷婷五月综合97色一本一本| 久久精品无码一区二区三区免费|