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

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

實現了一個寫LOG類

Posted on 2009-01-16 09:42 S.l.e!ep.¢% 閱讀(3755) 評論(9)  編輯 收藏 引用 所屬分類: C++
// ?tracelog.h:?interface?for?the?CTraceLog?class.
//
///////////////////////////////////////////////////////////////////// /

#if ?!defined(TRACELOG_H__B46BAA60_61F0_4CEC_8DEE_E8CC9EF26BA8__INCLUDED_)
#define ?TRACELOG_H__B46BAA60_61F0_4CEC_8DEE_E8CC9EF26BA8__INCLUDED_

#if ?_MSC_VER?>?1000
#pragma?once
#endif ? // ?_MSC_VER?>?1000
#pragma?warning(disable:
4786 )
#include?
< windows.h >
#include?
< process.h >
#include?
< vector >
#include?
< string >

#pragma?warning(disable:
4786 )

#include?
< stdio.h >

class ?CTraceLog??
{
public :
????CTraceLog()
????
{
????????m_hSemaphore?
= ?NULL;
????????m_hThread????
= ?NULL;
????????m_bEndThread?
= ? false ;
????}


????
virtual ? ~ CTraceLog()
????
{

????}


????
bool ?init()
????
{
????????
if (?m_hSemaphore? != ?NULL?)
????????????
return ? false ;

????????m_hSemaphore?
= ?::CreateSemaphore(NULL,? 0 ,? 0xFFFF ,?NULL);

????????
// ?If?the?function?fails,?the?return?value?is?NULL.
???????? if (?m_hSemaphore? == ?NULL?)
????????????
return ? false ;
????????
????????
// ?the?function?returns?a?handle?to?the?existing?object?and?GetLastError?returns?ERROR_ALREADY_EXISTS.
???????? if ?(?::GetLastError()? == ?ERROR_ALREADY_EXISTS?)
????????????
return ? false ;

????????::InitializeCriticalSection(
& m_CriticalSection);

????????
if ?(?m_hThread? != ?NULL?)
????????????
return ? false ;

????????unsigned?
int ?nThreadId? = ? 0 ;
????????m_hThread?
= ?(HANDLE)_beginthreadex(NULL,? 0 ,?_ThreadProc,?( void * ) this ,? 0 ,? & nThreadId);

????????
if (?m_hThread? == ? 0 ?)
????????????
return ? false ;

????????
return ? true ;
????}


????
bool ?uninit()
????
{
????????m_bEndThread?
= ? true ;
????????::ReleaseSemaphore(m_hSemaphore,?
1 ,?NULL);

????????DWORD?dwRet?
= ?::WaitForSingleObject(m_hThread,?INFINITE);

????????
if ?(?dwRet? == ?WAIT_FAILED?)
????????????
return ? false ;

????????::CloseHandle(m_hSemaphore);
????????m_hSemaphore?
= ?NULL;

????????::DeleteCriticalSection(
& m_CriticalSection);

????????
return ? true ;
????}


????
void ?log( const ? char * ?pszBuf)
????
{
????????::EnterCriticalSection(
& m_CriticalSection);
????????
????????m_Log.push_back(pszBuf);
????????::ReleaseSemaphore(m_hSemaphore,?
1 ,?NULL);

????????::LeaveCriticalSection(
& m_CriticalSection);????????????
????}



protected :

????
virtual ? void ?_logFile( const ? char * ?pszBuf)? = ? 0 ;

????
static ?unsigned?__stdcall?_ThreadProc( void * ?pVoid)
????
{
????????CTraceLog
* ?pThis? = ?(CTraceLog * )pVoid;

????????
while ( true )
????????
{
????????????DWORD?dwRet?
= ?::WaitForSingleObject(pThis -> m_hSemaphore,?INFINITE);

????????????
if ?(?dwRet? == ?WAIT_FAILED?)
????????????????
break ;

????????????std::vector
< std:: string > ?m_LogCopy;
????????????
????????????::EnterCriticalSection(
& pThis -> m_CriticalSection);
????????????m_LogCopy.resize(pThis
-> m_Log.size());
????????????std::copy(pThis
-> m_Log.begin(),?pThis -> m_Log.end(),?m_LogCopy.begin());
????????????pThis
-> m_Log.clear();
????????????::LeaveCriticalSection(
& pThis -> m_CriticalSection);

????????????std::vector
< std:: string > ::iterator?iter_t;

????????????
for ?(?iter_t? = ?m_LogCopy.begin();?iter_t? != ?m_LogCopy.end();?iter_t ++ ?)
????????????????pThis
-> _logFile(iter_t -> c_str());
????????????????????????
????????????
if ?(?pThis -> m_bEndThread?)
????????????????
break ;

????????}
// ?while(true)

????????
return ? 0 ;
????}

????????
private :
????std::vector
< std:: string > ?m_Log;?????????? // ?Log?信息隊列
????HANDLE???????????????????m_hSemaphore;?????? // ?信號量
????CRITICAL_SECTION?????????m_CriticalSection;? // ?隊列訪問互斥量
????HANDLE???????????????????m_hThread;????????? // ?線程?Handle
???? bool ?????????????????????m_bEndThread;?????? // ?結束線程標志
}
;



#endif ? // ?!defined(TRACELOG_H__B46BAA60_61F0_4CEC_8DEE_E8CC9EF26BA8__INCLUDED_)

Feedback

# re: 實現了一個寫LOG類  回復  更多評論   

2009-01-16 11:06 by true
一個線程在調用uninit,另一個線程可能在調用log,這樣就有問題,假若 m_bEndThread = true,ThreadProc退出了,這時log對信號量遞增計數,有泄露。當然,日志結束一般也是進程結束的時候,無所謂了

# re: 實現了一個寫LOG類  回復  更多評論   

2009-01-16 13:02 by abettor
為嘛不用log4c呢?

# re: 實現了一個寫LOG類  回復  更多評論   

2009-01-16 13:44 by sleepwom
@true
感謝, uninit 修改為這樣
bool uninit()
{
m_bEndThread = true ;
DWORD dwRet = ::WaitForSingleObject(m_hThread, INFINITE);

if ( dwRet == WAIT_FAILED )
return false ;

::ReleaseSemaphore(m_hSemaphore, 1 , NULL);
::CloseHandle(m_hSemaphore);
m_hSemaphore = NULL;

::DeleteCriticalSection( & m_CriticalSection);

return true ;
}

# re: 實現了一個寫LOG類  回復  更多評論   

2009-01-16 13:44 by sleepwom
@abettor
log4c 感覺太龐大了,我只需要實現單條線程去寫LOG信息,如此而已!

# re: 實現了一個寫LOG類  回復  更多評論   

2009-01-16 16:00 by Matrixcoding
@sleepwom
修改后的還是不對的:if ( dwRet == WAIT_FAILED )
return false ; 中途返回的話,m_CriticalSection就泄漏了。

# re: 實現了一個寫LOG類  回復  更多評論   

2009-01-16 22:18 by Sleepwom
@Matrixcoding
樓上的,我還真的不知道怎么改

# re: 實現了一個寫LOG類  回復  更多評論   

2009-01-16 22:19 by 陳梓瀚(vczh)
critical section在構造函數申請,析構函數釋放。
創建log的線程負責釋放log
其他線程負責使用log
log自己操作critical section

永不泄漏

# re: 實現了一個寫LOG類  回復  更多評論   

2009-01-18 13:41 by tangxinfa
寫一個完善的LOG類是很困難的,我覺得有可以使用和一些日志庫同樣的接口,可能實現時只是輸出到cout,而后如有必要可方便地引入龐大的日志庫(如:log4cxx),用日志庫其實一點都不麻煩,只是多了一點初始化的工作,真正記日志的接口是很簡單的,發行時帶上1MB的運行時庫通常不是大問題,重要的是你不必擔心日志相關的代碼會有問題。

# re: 實現了一個寫LOG類  回復  更多評論   

2009-01-19 10:16 by matrixcoding@gmail.com
@sleepwom
簡單點,return false之前把m_CriticalSection也釋放了。復雜點的就包裝一個良好界面的鎖機制。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲一区在线观看免费观看电影高清| 欧美日韩精品是欧美日韩精品| 亚洲欧美日韩精品| 午夜影院日韩| 午夜精品久久久久久久99热浪潮| 免费成人你懂的| 老牛嫩草一区二区三区日本| 亚洲一区二区三区色| 欧美一二三区在线观看| 欧美日韩一区视频| 欧美激情精品久久久久| 好看的av在线不卡观看| 亚洲一区二区毛片| 亚洲欧美精品在线| 欧美性片在线观看| 国产一区二区在线免费观看 | 亚洲国产精品成人va在线观看| 欧美午夜久久| 一本久久青青| 亚洲小说区图片区| 国产精品久久久久aaaa九色| av成人动漫| 欧美一区2区三区4区公司二百| 国产精品久久| 亚洲麻豆视频| 国外精品视频| 一本久道综合久久精品| 一区二区精品在线| 亚洲一区二区三区涩| 日韩亚洲在线观看| 免费中文日韩| 久久国产一二区| 亚洲经典自拍| 国产区亚洲区欧美区| 国产精品外国| 在线视频日本亚洲性| 亚洲人体一区| 欧美日韩午夜在线视频| 亚洲私人影吧| 性做久久久久久免费观看欧美| 黄色国产精品| 亚洲激情在线观看| 国产精品国产三级国产专区53| 久久精品99无色码中文字幕| 久久九九免费| 亚洲线精品一区二区三区八戒| 亚洲欧美日韩系列| 国产一区二区三区久久久久久久久| 亚洲香蕉网站| 久久精品日韩欧美| 国产精品yjizz| 欧美国产一区二区在线观看| 精品av久久707| 久久精品国产亚洲一区二区| 欧美国产精品日韩| 久久精品国产一区二区三区| 国产一区二区无遮挡| 亚洲人成毛片在线播放| 国产精品qvod| 狂野欧美性猛交xxxx巴西| 欧美巨乳波霸| 美女任你摸久久| 国产精品久久网站| 亚洲日本一区二区三区| 欧美午夜在线| 国产欧美二区| 欧美一区二区免费视频| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲高清不卡一区| 国产精品扒开腿做爽爽爽软件| 久久综合色8888| 欧美三区不卡| 亚洲精品久久久久久久久久久久 | 欧美一区在线直播| 欧美激情一区二区三区在线| 久久久久久久综合| 国产精品xxxav免费视频| 亚洲大片av| 一区三区视频| 午夜国产精品视频| 亚洲影院在线观看| 欧美激情成人在线视频| 女人香蕉久久**毛片精品| 国产亚洲欧美激情| 亚洲宅男天堂在线观看无病毒| 日韩视频专区| 久久亚洲一区二区三区四区| 欧美人在线观看| 亚洲一区精彩视频| 91久久久精品| 美日韩精品视频免费看| 亚洲一区免费视频| 一区二区三区精品视频在线观看| 国产欧美一区二区视频| 欧美精品在线免费观看| 免费观看成人网| 蜜桃av噜噜一区| 亚洲免费在线电影| 欧美成人蜜桃| 亚洲激情专区| 一本色道久久综合亚洲91| 欧美日本免费| 亚洲午夜久久久| 久久大综合网| 午夜精品偷拍| 久久天天躁狠狠躁夜夜av| 国产综合色在线| 久久久噜噜噜久噜久久| 欧美aaa级| 日韩午夜av| 欧美午夜精品久久久久久超碰| 99精品免费视频| 西瓜成人精品人成网站| 国产欧美日韩激情| 久久精品国产精品亚洲| 欧美激情视频在线播放| 一本久久精品一区二区| 国产精品欧美一区二区三区奶水| 午夜精品久久久久久久99水蜜桃| 久久久久欧美精品| 亚洲国内欧美| 欧美日韩在线精品| 欧美在线观看一二区| 亚洲电影欧美电影有声小说| 亚洲午夜日本在线观看| 国产亚洲精品久久久久久| 老司机aⅴ在线精品导航| 99精品欧美一区| 久久人91精品久久久久久不卡| 亚洲国产日韩在线| 国产精品久久久一区二区| 久久婷婷国产综合尤物精品 | 99精品99久久久久久宅男| 欧美在线视频免费播放| 樱花yy私人影院亚洲| 欧美日韩精品免费观看视频| 欧美一区二区三区视频在线| 亚洲国产精品久久91精品| 久久久久久久97| 欧美日韩视频在线观看一区二区三区| 亚洲欧洲综合另类在线| 亚洲欧美日韩国产综合在线 | 黄色成人av网| 99re6这里只有精品视频在线观看| 香蕉亚洲视频| 亚洲免费综合| 国产日韩欧美一区二区三区在线观看 | 激情综合五月天| 欧美日韩精品二区| 久久精品日韩欧美| 亚洲一本视频| 亚洲破处大片| 美女被久久久| 久久精品国产视频| 亚洲一区三区电影在线观看| 亚洲国产高清在线| 国产一区二区中文| 国产乱码精品一区二区三| 欧美日韩国产不卡在线看| 欧美大片免费观看| 性视频1819p久久| 亚洲一区二区三区777| 亚洲精品日韩精品| 国产最新精品精品你懂的| 国产精品一区二区久久久| 欧美天堂亚洲电影院在线观看 | 国产欧美日本一区视频| 欧美视频导航| 欧美日韩亚洲网| 欧美精品日韩www.p站| 牛人盗摄一区二区三区视频| 欧美在线观看视频一区二区| 亚洲男人的天堂在线| 亚洲视频在线一区| 亚洲午夜一区二区| 亚洲在线视频免费观看| 亚洲一区不卡| 午夜久久影院| 久久xxxx精品视频| 久久国产精品免费一区| 久久精品网址| 免费久久99精品国产自在现线| 久久婷婷蜜乳一本欲蜜臀| 久久一综合视频| 国产亚洲成av人在线观看导航| 亚洲国产福利在线| 亚洲自拍另类| 欧美伦理一区二区| 亚洲激情在线观看| 亚洲电影在线| 亚洲欧美成人一区二区在线电影| 亚洲国产精品一区二区第四页av| 校园激情久久| 久久综合色婷婷| 在线观看国产精品淫| 亚洲免费精彩视频| 亚洲欧美美女| 篠田优中文在线播放第一区| 久久精品国产一区二区三区| 久久久久久亚洲精品杨幂换脸|