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 阅读(344) | 评论 (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 阅读(225) | 评论 (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 阅读(139) | 评论 (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 阅读(8223) | 评论 (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 阅读(170) | 评论 (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 阅读(218) | 评论 (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 阅读(435) | 评论 (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 阅读(1098) | 评论 (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 阅读(371) | 评论 (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 阅读(2859) | 评论 (0)编辑 收藏

仅列出标题
共22页: First 12 13 14 15 16 17 18 19 20 Last