EditLog类的使用

原创 2007年09月30日 21:28:00

下载:

http://www.vrixpzone.com/zone2/codeRepo/vc/EditLog_src.zip

要解决的问题:

我曾经想使用EDIT控件来快速的处理异步文本输出。我需要在很多线程里记录大量的信息。有时候每秒1000个Log信息。自从我创建了一些函数把我要的对象信息输出到 std::cout ,我也想吧edit控件作为std::ostream.

特点:

  • 异步, 快速的输出信息到任何的edit 控件
  • 你可以在打印信息的时候查看记录,选择和复制文本等等。
  • 可以支持MFC和飞MFC程序
  • 使用了子类化,你可以把任何CEdit派生出的类和一同使用
  • 支持多线程
  • basic_streambuf 用来创建和 重定向 std::ostream (such as std::cout) 的输出到 edit控件

使用 CEditLog

创建CEditLog 的一个实例并通过SetEditControl() 方法把它和EDIT控件绑定,然后你就可以用AddText() 成员函数来添加一些文本到EDIT控件了。

class CEditLog : protected CSubclassWnd
{
public:
    typedef CSubclassWnd root_type;

    // Constructs the CEditLog. You can pass the edit controls handle
    // here or set it later using the SetEditCtrl() function.
    // To increase performance CEditLog repaints the edit-control
    // only if the caret resides in the last line. Otherwise the
    // control will be refreshed only every nMaxRefreshDelay msec.
    CEditLog( HWND hEdit = NULL, UINT nMaxRefreshDelay = 500 );
   
    // Adds some text to the end of the edit control. Works asynchronously
    // (using PostMessage()) and is save to be called by multiple threads.
    // If you pass true for bLFtoCRLF every LF (ASCII 10) (as it is used in
    // most cases for end-of-line) will be converted to a CR/LF (ASCII 10/13)
    // sequence as it is needed by the windows edit control.
    virtual void AddText( LPCWSTR pwszAdd, bool bLFtoCRLF = false );
   
    // Converts pszAdd to UNICODE and calls the above
    void AddText( LPCSTR pszAdd, bool bLFtoCRLF = false );

    // Sets the edit-control to be used for logging.
    // Pass NULL to stop text logging.
    virtual void SetEditCtrl( HWND hEdit );

    HWND GetEditCtrl() const

    ...
};

实例代码说明

实例代码中演示了CEditLog 的用法以及basic_editstrbuf 如何重定向 std::cout 到EDIT控件.

CEditLog 用到了William E. Kempf 写的CSubclassWnd 类,实例代码中也包含了CSubclassWnd

-------------以上翻译由vrix.yan完成于2007.09.30 21:18

在使用此类的过程当中,我总结了一下的步骤:

1>将实例工程中的code子目录,复制到你的工程目录中

2>在你的对话框xxDlg.h 里引入头文件,并定义一些变量

#include "EditLog.h"
#include "editlog_stream.h"

 // The logger object
 CEditLog   m_EditLogger;
 // ANSI and UNICODE stream buffers for the EditLogger
 std::editstreambuf m_EditStrBuf;
 std::weditstreambuf m_EditStrBufW;

 // Used to save the previos values for cout and wcout
 std::basic_streambuf<char>*  m_pOldBuf;
 std::basic_streambuf<wchar_t>* m_pOldBufW;

3>在你的stdafx.h中加入

// Include core STL header
#include <string>
#include <streambuf>
#include <iostream>

4>在你的xxDlg.cpp 中记得添加一下的代码

CEditLogDlg::CEditLogDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CEditLogDlg::IDD, pParent), m_EditStrBuf( m_EditLogger ), m_EditStrBufW( m_EditLogger )

5>在你的xxDlg.cpp里面OnInitDialog初始化

 // 设置EDIT控件为LOG的目标
 m_EditLogger.SetEditCtrl( m_ctrlEdit.m_hWnd );  //记得要先定义Edit 控件


 // 重定向cout 的输出到 Edit控件
 m_pOldBuf = cout.rdbuf( &m_EditStrBuf );
 // unicode 版本
 m_pOldBufW = wcout.rdbuf( &m_EditStrBufW );

 // 用法
 cout << "cout (ANSI) works :-)" << endl;
 wcout << L"wcout (UNICODE) works also ;-)" << endl;
 cout << "/n/n";

6>在你的WM_DESTROY消息里加入

void CEditLogDlg::OnDestroy()
{
 // Restore the previous stream state for cout and wcout
 cout.rdbuf( m_pOldBuf );
 wcout.rdbuf( m_pOldBufW );

 CDialog::OnDestroy();
}

我通过以上的步骤,成功的在我的程序里使用了EDITLOG类,希望对大家有所帮助。

vrix.yan  2007年09月30日晚 21点30分 写于 东莞

(3)hadoop学习——namenode的fsimage与editlog详解

Namenode主要维护两个文件,一个是fsimage,一个是editlog。 fsimage保存了最新的元数据检查点,包含了整个HDFS文件系统的所有目录和文件的信息。对于文件来说包括了数据块描述信...
  • chenKFKevin
  • chenKFKevin
  • 2017年03月10日 14:15
  • 2282

HDFS源码分析EditLog之获取编辑日志输入流

在《HDFS源码分析之EditLogTailer》一文中,我们详细了解了编辑日志跟踪器EditLogTailer的实现,介绍了其内部编辑日志追踪线程EditLogTailerThread的实现,及其线...
  • lipeng_bigdata
  • lipeng_bigdata
  • 2016年04月12日 11:01
  • 4171

C++语法基础--ostream,cout及其格式控制,缓冲区

1.C++程序把输入和输出看作字节流:输入时,程序从输入流中抽取字节;输出是,程序将字节插入到输出流中。流充当了程序和流源或流目标之间的桥梁。 2.缓冲区是用作中介的内存块,它将信息从设备传输到...
  • piniheaven
  • piniheaven
  • 2013年08月08日 22:44
  • 1481

HDFS源码分析EditLog之读取操作符

在《HDFS源码分析EditLog之获取编辑日志输入流》一文中,我们详细了解了如何获取编辑日志输入流EditLogInputStream。在我们得到编辑日志输入流后,是不是就该从输入流中获取数据来处理...
  • lipeng_bigdata
  • lipeng_bigdata
  • 2016年04月12日 15:44
  • 4353

新版EditLog,重定向cout内容到CEdit窗口

  • 2013年05月15日 06:47
  • 44KB
  • 下载

Hadoop NameNode的元数据持久化存储FSImage和日志存储EditLog源代码分析

HDFS NameNode High Availability中一个关键的问题就是Editlog如何保存,怎么才能保证在Active和Standby的NameNode切换时Editlog不丢失记录,也...
  • lskyne
  • lskyne
  • 2013年04月24日 10:25
  • 5342

Editlog的接口规范设计文档(HDFS-1580:Add interface for generic Write Ahead Logging mechanism)

转帖请注明本空间地址:http://blog.csdn.net/chenpingbupt  原文请参: https://issues.apache.org/jira/browse/HDFS-1...
  • chenpingbupt
  • chenpingbupt
  • 2012年08月29日 22:22
  • 1255

【框架解析】Hadoop系统分析(八)--editlog管理

Editlog文件记录了日常针对数据文件的操作,在Hdfs启动时,会合并fsimage文件与editlog文件,构成整个hdfs整个文件系统。对editlog进行操作主要的类有如下: ...
  • shorn
  • shorn
  • 2013年02月22日 17:07
  • 1005

NameNode的FSImage以及EditLog的简化模型设计文档(HDFS-1073:Simpler model for Namenode's FsImage and EditLogs)

转帖请注明本空间地址: http://blog.csdn.net/chenpingbupt chenpingbutp@gmail.com 原文请参: https://issues.apache...
  • chenpingbupt
  • chenpingbupt
  • 2012年08月30日 22:53
  • 4134

使用注解导入导出各类多表头及各种导入数据验证的i简单工具类

  • 2018年01月10日 21:24
  • 31KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:EditLog类的使用
举报原因:
原因补充:

(最多只允许输入30个字)