<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>代码库</title><link>http://blog.vckbase.com/longest/category/966.html</link><description>封装了一些类（其中借鉴了其他人的思想）希望大家也能提供些有用的类加到这个库中。
这阵子看了些代码，加上以前自己写的代码总结了一下，封装一下，文字比较少，见者见谅，我会不断增加库存的，希望后来者能站在我的肩膀上爬的更高些，谢谢支持，另：对于指出文中代码错误的人我心怀感激，对于只会骂人的人我只有唾弃！</description><managingEditor>龙仪</managingEditor><dc:language>zh-CHS</dc:language><generator>.Text Version 0.958.2004.214</generator><item><dc:creator>longest</dc:creator><title>代码库之七－异常类</title><link>http://blog.vckbase.com/longest/articles/19855.html</link><pubDate>Sat, 29 Apr 2006 15:19:00 GMT</pubDate><guid>http://blog.vckbase.com/longest/articles/19855.html</guid><wfw:comment>http://blog.vckbase.com/longest/comments/19855.html</wfw:comment><comments>http://blog.vckbase.com/longest/articles/19855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/longest/comments/commentRss/19855.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/longest/services/trackbacks/19855.html</trackback:ping><description>&lt;P&gt;&lt;FONT color=#ff0000&gt;写程序免不了有异常，没碰到过异常的请举手（哦，新来的啊，好，坐下），好闲话少说，看说明。&lt;BR&gt;这个异常类，在程序出错的时候会输出一些信息，比如发生错误的函数（自填），错误描述（自填如果是标准错误可以自动生成)，错误代码（自填，或者标准错误填入GetLastError，或者WSAGetLastError),这样在出现错误的时候你就知道是哪个函数发生什么样的错误，便于调试。&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#008000&gt;/////////////////////////////////////////H////////////////////////////////////////////////////&lt;/FONT&gt;&lt;BR&gt;#ifndef LG_EXCEPTION_H&lt;BR&gt;#define LG_EXCEPTION_H&lt;BR&gt;&lt;BR&gt;#if _MSC_VER &amp;gt; 1000&lt;BR&gt;#pragma once&lt;BR&gt;#endif // _MSC_VER &amp;gt; 1000&lt;BR&gt;//#include &amp;lt;exception&amp;gt;&lt;BR&gt;#include &amp;lt;string&amp;gt;&lt;/P&gt;
&lt;P&gt;using namespace std;&lt;/P&gt;
&lt;P&gt;namespace lglib&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp; *异常处理的主要成员，是所有其他异常处理器的基类&lt;BR&gt;&amp;nbsp; *的异常处理类，确保了整体的标准兼容。&lt;BR&gt;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&lt;FONT color=#0000ff&gt;class&lt;/FONT&gt; &lt;FONT color=#a52a2a&gt;__LGLIB__&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;lg_Exception&lt;/FONT&gt;// : public exception&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;public:// 构造/析构&lt;BR&gt;&amp;nbsp;&amp;nbsp;lg_Exception(const string&amp;amp; Method, const string&amp;amp; Message, int ErrCode) throw();&lt;BR&gt;&amp;nbsp;&amp;nbsp;lg_Exception( const string&amp;amp; Method,DWORD ErrCode ) throw();&lt;BR&gt;&amp;nbsp;&amp;nbsp;virtual ~lg_Exception();&lt;BR&gt;&amp;nbsp;public:&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*****************************说明*************************************/&lt;BR&gt;&amp;nbsp;&amp;nbsp;//void foo() throw (int);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 只能抛出int型异常&lt;BR&gt;&amp;nbsp;&amp;nbsp;//void bar() throw ();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 不抛出任何异常&lt;BR&gt;&amp;nbsp;&amp;nbsp;//void baz();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 可以抛出任意类型的异常或者不抛出异常&lt;BR&gt;&amp;nbsp;&amp;nbsp;/**********************************************************************/&lt;BR&gt;&amp;nbsp;&amp;nbsp;const string getMethod( void ) const throw()&amp;nbsp;{ return m_szMethod; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;const string getMessage( void ) const throw()&amp;nbsp;{ return m_szMessage; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;const DWORD getErrCode( void ) const throw()&amp;nbsp;{ return m_nErrCode; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;virtual const char* What( void ) const throw()&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return getMessage().c_str();&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;protected:&amp;nbsp;// 保护数据&lt;BR&gt;&amp;nbsp;&amp;nbsp;string&amp;nbsp;m_szMethod;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// tell u witch function send this exception&lt;BR&gt;&amp;nbsp;&amp;nbsp;string&amp;nbsp;m_szMessage;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// describe this exception&lt;BR&gt;&amp;nbsp;&amp;nbsp;uint32&amp;nbsp;m_nErrCode;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// code of exception&lt;BR&gt;&amp;nbsp;private:&amp;nbsp;// 私有方法&lt;BR&gt;&amp;nbsp;&amp;nbsp;void processErrCode( void );&amp;nbsp;// 处理错误代码&amp;nbsp;&lt;BR&gt;&amp;nbsp;};&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;#endif&lt;BR&gt;/////////////////////////////////////////CPP////////////////////////////////////////////////////&lt;BR&gt;&lt;BR&gt;#include "stdafx.h"&lt;BR&gt;#include "lg_Exception.h"&lt;/P&gt;
&lt;P&gt;//////////////////////////////////////////////////////////////////////&lt;BR&gt;// Construction/Destruction&lt;BR&gt;//////////////////////////////////////////////////////////////////////&lt;/P&gt;
&lt;P&gt;using namespace std;&lt;/P&gt;
&lt;P&gt;namespace lglib&lt;BR&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;lg_Exception::lg_Exception( const string&amp;amp; Method, const string&amp;amp; Message, int ErrCode ) throw()&lt;BR&gt;&amp;nbsp;&amp;nbsp;: m_szMethod( Method ), m_szMessage( Message ), m_nErrCode( ErrCode )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;lg_Exception::lg_Exception( const string&amp;amp; Method,DWORD ErrCode ) throw()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;: m_szMethod( Method ), m_nErrCode( ErrCode )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;processErrCode();&amp;nbsp;&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;lg_Exception::~lg_Exception(void)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;void lg_Exception::processErrCode( void )&amp;nbsp;// 处理错误代码&amp;nbsp;&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;const uint32 nTempSize = 2048;&lt;BR&gt;&amp;nbsp;&amp;nbsp;char* szTemp = new char[ nTempSize ];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;// 格式化错误信息&lt;BR&gt;&amp;nbsp;&amp;nbsp;FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, m_nErrCode,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;szTemp,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;nTempSize,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL);&lt;BR&gt;&amp;nbsp;&amp;nbsp;m_szMessage = szTemp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;delete [] szTemp;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/longest/aggbug/19855.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>longest</dc:creator><title>代码库之六－信号量</title><link>http://blog.vckbase.com/longest/articles/19852.html</link><pubDate>Sat, 29 Apr 2006 14:35:00 GMT</pubDate><guid>http://blog.vckbase.com/longest/articles/19852.html</guid><wfw:comment>http://blog.vckbase.com/longest/comments/19852.html</wfw:comment><comments>http://blog.vckbase.com/longest/articles/19852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/longest/comments/commentRss/19852.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/longest/services/trackbacks/19852.html</trackback:ping><description>&lt;P&gt;&lt;FONT color=#ff0000&gt;&amp;nbsp;&lt;FONT face=宋体&gt;信号量的用法和互斥的用法很相似，不同的是它可以同一时刻允许多个线程访问同一个资源&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008000&gt;/////////////////////////////////////////////////////H/////////////////////////////////////////////////////////////&lt;/FONT&gt;&lt;BR&gt;#ifndef LGLIB_SEMAPHORE_H&lt;BR&gt;#define LGLIB_SEMAPHORE_H&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;class&lt;/FONT&gt; &lt;FONT color=#800080&gt;__LGLIB__&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;lg_Semaphore&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;private:&amp;nbsp;&lt;FONT color=#008000&gt;// 数据&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;HANDLE&amp;nbsp;m_semHandle;&lt;BR&gt;&amp;nbsp;&amp;nbsp;lg_AtomicCounter m_nCount;&lt;BR&gt;&amp;nbsp;public:&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// 构造&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp;&amp;nbsp; * 可以指定信号量的初始值。这个初始值通常用于指定锁定有限个资源或者指定&lt;BR&gt;&amp;nbsp;&amp;nbsp; * 线程实例可以访问的指定资源的最大值。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;lg_Semaphore( uint32 resource = 0 );&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp;&amp;nbsp; * 析够函数&lt;BR&gt;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;~lg_Semaphore();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;public:&amp;nbsp;&amp;nbsp;// 方法&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp;&amp;nbsp; * 等待资源可用。&lt;BR&gt;&amp;nbsp;&amp;nbsp; *&lt;BR&gt;&amp;nbsp;&amp;nbsp; * @param&amp;nbsp;timeout&amp;nbsp;等待超时值。默认为0，表示永远不超时。&lt;BR&gt;&amp;nbsp;&amp;nbsp; * @return&amp;nbsp;当指定超时值是，TRUE资源可用，FALSE资源不可用，超时；&lt;BR&gt;&amp;nbsp;&amp;nbsp; *&amp;nbsp;&amp;nbsp;当没有指定超时值时，TRUE资源可用，FALSE发生错误。&lt;BR&gt;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp;bool wait( timeout_t timeout = 0 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp;&amp;nbsp; * 增加可用资源，获释放可用资源给其他线程。&lt;BR&gt;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp;void release( void );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp;&amp;nbsp; * 获得当前可用资源数量。&lt;BR&gt;&amp;nbsp;&amp;nbsp; *&lt;BR&gt;&amp;nbsp;&amp;nbsp; * @return&amp;nbsp;可用资源数量&lt;BR&gt;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp;int32 getValue( void );&lt;/P&gt;
&lt;P&gt;&amp;nbsp;};&lt;BR&gt;&lt;FONT color=#ff0000&gt;#endif&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#008000&gt;//////////////////////////////////////////////CPP/////////////////////////////////////////////////////////&lt;BR&gt;&lt;/FONT&gt;//---------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;// 构造函数&lt;BR&gt;&amp;nbsp;lg_Semaphore::lg_Semaphore( uint32 resource )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;m_semHandle = ::&lt;FONT color=#a52a2a&gt;CreateSemaphore&lt;/FONT&gt;( ( LPSECURITY_ATTRIBUTES )NULL, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( uint32 )resource, MAX_SEM_VALUE, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( LPCTSTR )NULL );&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;//---------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;// 析够函数&lt;BR&gt;&amp;nbsp;lg_Semaphore::~lg_Semaphore()&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;::&lt;FONT color=#a52a2a&gt;CloseHandle&lt;/FONT&gt;( m_semHandle );&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;//---------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;// 等待信号&lt;BR&gt;&amp;nbsp;bool lg_Semaphore::wait( timeout_t timeout )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ( m_nCount )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;--m_nCount;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;if( !timeout )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;timeout = INFINITE;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;return &lt;FONT color=#a52a2a&gt;WaitForSingleObject&lt;/FONT&gt;( m_semHandle, timeout) == WAIT_OBJECT_0;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;//---------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;// 递增可用资源数量&lt;BR&gt;&amp;nbsp;void lg_Semaphore::release( void )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;++m_nCount;&lt;BR&gt;&amp;nbsp;&amp;nbsp;::&lt;FONT color=#a52a2a&gt;ReleaseSemaphore&lt;/FONT&gt;( m_semHandle, 1, ( LPLONG )NULL );&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;//---------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;// 获得当前可用资源数量&lt;BR&gt;&amp;nbsp;int32 lg_Semaphore::getValue( void )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;return m_nCount;&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/longest/aggbug/19852.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>longest</dc:creator><title>代码库之五－互斥</title><link>http://blog.vckbase.com/longest/articles/19844.html</link><pubDate>Sat, 29 Apr 2006 02:23:00 GMT</pubDate><guid>http://blog.vckbase.com/longest/articles/19844.html</guid><wfw:comment>http://blog.vckbase.com/longest/comments/19844.html</wfw:comment><comments>http://blog.vckbase.com/longest/articles/19844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/longest/comments/commentRss/19844.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/longest/services/trackbacks/19844.html</trackback:ping><description>&lt;P&gt;&amp;nbsp;// &lt;FONT color=#ff0000&gt;互斥对象能够确保线程拥有对单个资源的互斥访问权。&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#006400&gt;//////////////////////////////////////////////H////////////////////////////////////////////&lt;BR&gt;#ifndef LGLIB_MUTEX_H&lt;BR&gt;#define LGLIB_MUTEX_H&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;namespace lglib&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;class __LGLIB__ lg_Mutex&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;private:&amp;nbsp;// 私有成员&lt;BR&gt;&amp;nbsp;&amp;nbsp;HANDLE m_hMutex;&lt;BR&gt;&amp;nbsp;public:&amp;nbsp;&amp;nbsp;// 构造/析构&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;lg_Mutex();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;virtual ~lg_Mutex();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;public:&amp;nbsp;&amp;nbsp;// 方法&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp;&amp;nbsp; * 互斥锁，对互斥体进行上锁操作。&lt;BR&gt;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp;void lock( void );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp;&amp;nbsp; * 互斥解锁，对上锁的互斥体解锁。&lt;BR&gt;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp;void unlock( void );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp;&amp;nbsp; * 检测互斥体，用于判断当前互斥体的状态。&lt;BR&gt;&amp;nbsp;&amp;nbsp; *&lt;BR&gt;&amp;nbsp;&amp;nbsp; * @return true表明互斥体已经上锁，false互斥体没有上锁。&lt;BR&gt;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp;bool tryLock( void );&lt;BR&gt;&amp;nbsp;};&lt;BR&gt;}&lt;BR&gt;#endif&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#006400&gt;///////////////////////////////////////CPP/////////////////////////////////////////////&lt;/FONT&gt;&lt;BR&gt;namespace lglib&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;// 构造&lt;BR&gt;&amp;nbsp;lg_Mutex::lg_Mutex()&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;m_hMutex = CreateMutex( NULL, FALSE, NULL );&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ( m_hMutex == NULL )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw( this );&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;// 析构&lt;BR&gt;&amp;nbsp;lg_Mutex::~lg_Mutex()&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;::CloseHandle( m_hMutex );&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&amp;nbsp;// 互斥锁&lt;BR&gt;&amp;nbsp;void lg_Mutex::lock( void )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;WaitForSingleObject( m_hMutex, INFINITE );&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;// 互斥解锁&lt;BR&gt;&amp;nbsp;void lg_Mutex::unlock( void )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;ReleaseMutex( m_hMutex );&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;// 检测互斥体&lt;BR&gt;&amp;nbsp;bool lg_Mutex::tryLock( void )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;return ( WaitForSingleObject( m_hMutex, 0 ) == WAIT_OBJECT_0 );&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/longest/aggbug/19844.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>longest</dc:creator><title>代码库之四－多事件</title><link>http://blog.vckbase.com/longest/articles/19843.html</link><pubDate>Sat, 29 Apr 2006 02:03:00 GMT</pubDate><guid>http://blog.vckbase.com/longest/articles/19843.html</guid><wfw:comment>http://blog.vckbase.com/longest/comments/19843.html</wfw:comment><comments>http://blog.vckbase.com/longest/articles/19843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/longest/comments/commentRss/19843.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/longest/services/trackbacks/19843.html</trackback:ping><description>&lt;P&gt;&lt;FONT color=#ff0000&gt;多事件类&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;在线程中经常要等待多个事件，每次创建很多事件很繁琐，所以写了这个类&lt;BR&gt;你可以为按照事件序号为每个事件定义枚举，这样使用的时候很方便。这个代码能帮到你我很高兴，有什么问题请告诉我。&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#ffff00&gt;&lt;FONT color=#006400&gt;//////////////////////////////////H////////////////////////////////////////////////////////////&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#ff1493&gt;#ifndef LGLIB_MULTIEVENT_H&lt;BR&gt;#define LGLIB_MULTIEVENT_H&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;namespace lglib&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;class __LGLIB__ lg_MultiEvent&amp;nbsp; &lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;public:&lt;BR&gt;&amp;nbsp;&amp;nbsp;lg_MultiEvent(uint16 count);&lt;BR&gt;&amp;nbsp;&amp;nbsp;virtual ~lg_MultiEvent();&lt;BR&gt;&amp;nbsp;public:&lt;BR&gt;&amp;nbsp;&amp;nbsp;void resetall();&lt;BR&gt;&amp;nbsp;&amp;nbsp;BOOL reset( uint16 npos);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;void setall();&lt;BR&gt;&amp;nbsp;&amp;nbsp;BOOL set( uint16 npos);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;int32 wait( BOOL bWaitAll = FALSE );&lt;BR&gt;&amp;nbsp;&amp;nbsp;int32 wait( uint32 timeout , BOOL bWaitAll = FALSE );&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;uint16 GetEventCount() const;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;private:&lt;BR&gt;&amp;nbsp;&amp;nbsp;uint16 m_EventCount;&lt;BR&gt;&amp;nbsp;&amp;nbsp;HANDLE&amp;nbsp;*m_hCond;&lt;BR&gt;&amp;nbsp;};&lt;BR&gt;}&lt;BR&gt;&lt;FONT color=#ff1493&gt;#endif&lt;/FONT&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#006400&gt;///////////////////////////////////CPP//////////////////////////////////////////////////////////&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;namespace lglib&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;lg_MultiEvent::lg_MultiEvent(uint16 count)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#ff0000&gt;//////////////////////////////////////////////////////////////////////////&lt;BR&gt;&amp;nbsp;&amp;nbsp;//MAXIMUM_WAIT_OBJECTS = 64 &lt;BR&gt;&amp;nbsp;&amp;nbsp;//WaitForMultipleObjects 最多能等待 64个事件，所以事件的定义不能超过64&lt;BR&gt;&amp;nbsp;&amp;nbsp;//////////////////////////////////////////////////////////////////////////&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;m_EventCount = (count &amp;gt; 64 ) ? 64 : count;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;m_hCond = new HANDLE[count];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;for( uint16 i = 0; i &amp;lt; m_EventCount ; i++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_hCond[i] = CreateEvent(NULL,TRUE,FALSE,NULL);&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;lg_MultiEvent::~lg_MultiEvent()&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;for(uint16 i = 0;i &amp;lt; m_EventCount;i++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;CloseHandle(m_hCond[i]);&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;delete [] m_hCond;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;void lg_MultiEvent::resetall()&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;for(int16 i = 0; i &amp;lt; m_EventCount; i++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;reset(i);&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;BOOL lg_MultiEvent::reset( uint16 npos )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;if(npos &amp;gt;= m_EventCount)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return FALSE;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;::ResetEvent( m_hCond[npos] );&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;return TRUE;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;void lg_MultiEvent::setall()&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;for(uint16 i = 0;i &amp;lt; m_EventCount; i++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;set(i);&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;BOOL lg_MultiEvent::set( uint16 npos)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;if(npos &amp;gt;= m_EventCount)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return FALSE;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;::SetEvent( m_hCond[npos] );&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;return TRUE;&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;int32 lg_MultiEvent::wait( BOOL bWaitAll )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;uint32 Ret = ::WaitForMultipleObjects(m_EventCount, m_hCond, bWaitAll,INFINITE );&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;if(Ret &amp;lt; (WAIT_OBJECT_0 + m_EventCount))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (Ret - WAIT_OBJECT_0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;return -1;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;int32 lg_MultiEvent::wait( uint32 timeout , BOOL bWaitAll)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;uint32 Ret = WaitForMultipleObjects(m_EventCount, m_hCond, bWaitAll, timeout );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;if(Ret &amp;lt; (WAIT_OBJECT_0 + m_EventCount))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (Ret - WAIT_OBJECT_0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;return -1;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;uint16 lg_MultiEvent::GetEventCount() const&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;return m_EventCount;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/longest/aggbug/19843.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>longest</dc:creator><title>代码库之三 －事件</title><link>http://blog.vckbase.com/longest/articles/19812.html</link><pubDate>Fri, 28 Apr 2006 05:00:00 GMT</pubDate><guid>http://blog.vckbase.com/longest/articles/19812.html</guid><wfw:comment>http://blog.vckbase.com/longest/comments/19812.html</wfw:comment><comments>http://blog.vckbase.com/longest/articles/19812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/longest/comments/commentRss/19812.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/longest/services/trackbacks/19812.html</trackback:ping><description>&lt;P&gt;没有废话直接看代码&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#006400&gt;///////////////////////////////////////H/////////////////////////////////////////////////&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#ff1493&gt;&lt;FONT color=#0000ff&gt;#ifndef&lt;/FONT&gt; &lt;FONT color=#800080&gt;LGLIB_EVENT_H&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;#define&lt;/FONT&gt; &lt;/FONT&gt;&lt;FONT color=#800080&gt;LGLIB_EVENT_H&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;namespace&amp;nbsp;lglib&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&lt;FONT color=#0000ff&gt;class&lt;/FONT&gt; &lt;FONT color=#800080&gt;__LGLIB__&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;lg_Event&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&lt;FONT color=#0000ff&gt;private:&lt;/FONT&gt;&amp;nbsp;&lt;FONT color=#008000&gt;// 私有数据&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;HANDLE&lt;/FONT&gt;&amp;nbsp;&lt;FONT color=#808080&gt;m_hCond&lt;/FONT&gt;;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;FONT color=#0000ff&gt;public:&lt;/FONT&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&amp;nbsp;&lt;FONT color=#008000&gt;// 公用数据&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;enum&lt;/FONT&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#800080&gt;EVENT&lt;/FONT&gt; = 0,&amp;nbsp;&lt;FONT color=#008000&gt;// 事件发生&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#800080&gt;TIME_OUT&lt;/FONT&gt;,&amp;nbsp;&lt;FONT color=#008000&gt;// 超时&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#800080&gt;EVENT_ERR&lt;/FONT&gt;&amp;nbsp;&lt;FONT color=#008000&gt;// 发生错误&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;};&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;FONT color=#0000ff&gt;public:&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// 构造&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;lg_Event&lt;/FONT&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;virtual&lt;/FONT&gt; ~&lt;FONT color=#0000ff&gt;lg_Event&lt;/FONT&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;FONT color=#0000ff&gt;public:&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// 方法&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;/*!&lt;BR&gt;&amp;nbsp;&amp;nbsp; * 重置事件状态，在一个事件发生后必须重置才能继续使用。&lt;BR&gt;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;void &lt;FONT color=#a52a2a&gt;reset&lt;/FONT&gt;( void );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;/*!&lt;BR&gt;&amp;nbsp;&amp;nbsp; * 事件通知，像等待事件的线程发送这个事件。&lt;BR&gt;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;void&lt;/FONT&gt; &lt;FONT color=#a52a2a&gt;set&lt;/FONT&gt;( &lt;FONT color=#0000ff&gt;void&lt;/FONT&gt; );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;/*!&lt;BR&gt;&amp;nbsp;&amp;nbsp; * 等待事件通知&lt;BR&gt;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; &lt;FONT color=#a52a2a&gt;wait&lt;/FONT&gt;( &lt;FONT color=#0000ff&gt;void&lt;/FONT&gt; );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;/*!&lt;BR&gt;&amp;nbsp;&amp;nbsp; * 等待事件一段时间&lt;BR&gt;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; &lt;FONT color=#a52a2a&gt;wait&lt;/FONT&gt;( &lt;FONT color=#0000ff&gt;uint32&lt;/FONT&gt; &lt;FONT color=#808080&gt;timeout&lt;/FONT&gt; );&lt;/P&gt;
&lt;P&gt;&amp;nbsp;};&lt;BR&gt;}&lt;BR&gt;&lt;FONT color=#0000ff&gt;#endif&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#006400&gt;///////////////////////////////////////CPP/////////////////////////////////////////////////////////&lt;/FONT&gt;&lt;BR&gt;namespace lglib&lt;BR&gt;{&lt;BR&gt;//---------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;// 构造&lt;BR&gt;&amp;nbsp;lg_Event::lg_Event()&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;m_hCond = CreateEvent( NULL, TRUE, FALSE, NULL );&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ( m_hCond == NULL )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw( this );&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;//---------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;// 析构&lt;BR&gt;&amp;nbsp;lg_Event::~lg_Event()&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;::CloseHandle( m_hCond );&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;//---------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;// 设置事件通知&lt;BR&gt;&amp;nbsp;void lg_Event::set( void )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;::SetEvent( m_hCond );&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;//---------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;// 重置事件通知&lt;BR&gt;&amp;nbsp;void lg_Event::reset( void )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;::ResetEvent( m_hCond );&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;//---------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;// 等待事件通知&lt;BR&gt;&amp;nbsp;int lg_Event::wait( void )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ( ::WaitForSingleObject( m_hCond, INFINITE ) == WAIT_OBJECT_0 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return EVENT;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;else&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return EVENT_ERR;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;//---------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;// 等待事件通知&lt;BR&gt;&amp;nbsp;int lg_Event::wait( uint32 timeout )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;int ret = WaitForSingleObject( m_hCond, timeout );&lt;BR&gt;&amp;nbsp;&amp;nbsp;switch( ret )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;case WAIT_OBJECT_0:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return EVENT;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;case WAIT_TIMEOUT:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return TIME_OUT;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;case WAIT_FAILED:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return EVENT_ERR;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;return ret;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/longest/aggbug/19812.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>longest</dc:creator><title>代码库之一 －全局定义</title><link>http://blog.vckbase.com/longest/articles/19807.html</link><pubDate>Fri, 28 Apr 2006 04:42:00 GMT</pubDate><guid>http://blog.vckbase.com/longest/articles/19807.html</guid><wfw:comment>http://blog.vckbase.com/longest/comments/19807.html</wfw:comment><comments>http://blog.vckbase.com/longest/articles/19807.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/longest/comments/commentRss/19807.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/longest/services/trackbacks/19807.html</trackback:ping><description>&lt;P&gt;#define _LGLIB_APP_&lt;BR&gt;//#define _LGLIB_DLL_&lt;/P&gt;
&lt;P&gt;#&amp;nbsp;ifdef _LGLIB_DLL_&lt;BR&gt;#&amp;nbsp;&amp;nbsp;define __LGLIB__ __declspec(dllexport)&lt;BR&gt;#&amp;nbsp;else &lt;BR&gt;#&amp;nbsp;&amp;nbsp;ifdef _LGLIB_APP_&lt;BR&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;define __LGLIB__&lt;BR&gt;#&amp;nbsp;&amp;nbsp;else&lt;BR&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;define __LGLIB__ __declspec(dllimport)&lt;BR&gt;#&amp;nbsp;&amp;nbsp;endif&lt;BR&gt;#&amp;nbsp;endif&lt;/P&gt;
&lt;P&gt;#&amp;nbsp;define&amp;nbsp;MAX_SEM_VALUE&amp;nbsp;1000000&amp;nbsp;&amp;nbsp;// 最大信号量&lt;/P&gt;
&lt;P&gt;typedef int socklen_t;&lt;BR&gt;typedef unsigned char&amp;nbsp;&amp;nbsp;uint8;&lt;BR&gt;typedef unsigned short&amp;nbsp;uint16;&lt;BR&gt;typedef unsigned long&amp;nbsp;&amp;nbsp;uint32;&lt;BR&gt;typedef unsigned __int64&amp;nbsp;uint64;&lt;BR&gt;typedef char&amp;nbsp;&amp;nbsp;&amp;nbsp;int8;&lt;BR&gt;typedef short&amp;nbsp;&amp;nbsp;&amp;nbsp;int16;&lt;BR&gt;typedef long&amp;nbsp;&amp;nbsp;&amp;nbsp;int32;&lt;BR&gt;typedef __int64&amp;nbsp;&amp;nbsp;int64;&lt;/P&gt;
&lt;P&gt;typedef unsigned long ( __stdcall *exec_t )( void* );&lt;BR&gt;typedef const char* cpstr;&lt;/P&gt;
&lt;P&gt;typedef uint16&amp;nbsp;Port_t;&amp;nbsp;&amp;nbsp;//!端口类型&lt;BR&gt;typedef uint32&amp;nbsp;timeout_t;&amp;nbsp;//!超时&lt;BR&gt;&amp;nbsp;const uint32 LG_SOCKET_OPEN&amp;nbsp;&amp;nbsp;= 0x0001;&amp;nbsp;//!&amp;lt; 套接字已经打开&lt;BR&gt;&amp;nbsp;const uint32 LG_SOCKET_CLOSE&amp;nbsp;&amp;nbsp;= 0x0002;&amp;nbsp;//!&amp;lt; 套接字没有打开或已经关闭&lt;BR&gt;&amp;nbsp;const uint32 LG_SOCKET_NOSERVICE&amp;nbsp;= 0x0003;&amp;nbsp;//!&amp;lt; 服务类型法错&lt;BR&gt;&amp;nbsp;const uint32 LG_SOCKET_NOMUTLICAST &amp;nbsp;= 0x0004;&amp;nbsp;//!&amp;lt; 没有设置多播模式&lt;BR&gt;&amp;nbsp;const uint32 LG_SOCKET_NOCONNECT&amp;nbsp;= 0x0005;&amp;nbsp;//!&amp;lt; 没有建立连接&lt;BR&gt;&amp;nbsp;const uint32 LG_SOCKET_OVERFLOW&amp;nbsp;&amp;nbsp;= 0x0006;&amp;nbsp;//!&amp;lt; 缓冲区溢出&lt;BR&gt;&amp;nbsp;const uint32 LG_SOCKET_CONNECT&amp;nbsp;&amp;nbsp;= 0x0007;&amp;nbsp;//!&amp;lt; 已经连接或正在连接&lt;BR&gt;&amp;nbsp;const uint32 LG_SOCKET_NO_LISTENING&amp;nbsp;= 0x0008;&amp;nbsp;//!&amp;lt; 套接字不处于监听状态&lt;BR&gt;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp; *}&lt;BR&gt;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*!lg_TcpStream&lt;BR&gt;&amp;nbsp; *{&lt;BR&gt;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;const uint32 LG_TCPSTREAM_HAVE_CONNECT&amp;nbsp;= 0x1001;&amp;nbsp;//!&amp;lt; 已经创建了连接&lt;BR&gt;&amp;nbsp;const uint32 LG_TCPSTREAM_BAD_ADDRESS&amp;nbsp;= 0x1002;&amp;nbsp;//!&amp;lt; 错误的地址&lt;BR&gt;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp; *}&lt;BR&gt;&amp;nbsp; */&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;/*!lg_UdpSocket&lt;BR&gt;&amp;nbsp; *{&lt;BR&gt;&amp;nbsp; */&lt;BR&gt;&amp;nbsp; const uint32 LG_UDPSOCKET_HAVE_BOUND&amp;nbsp;= 0x3001;&amp;nbsp;//!&amp;lt; 套接字已经被绑定了&lt;BR&gt;&amp;nbsp; const uint32 LG_UDPSOCKET_NOFOUND_NAME&amp;nbsp;= 0x3002;&amp;nbsp;//!&amp;lt; 没有找到目标名&lt;BR&gt;&amp;nbsp; const uint32 LG_UDPSOCKET_NOFOUND_ADDR&amp;nbsp;= 0x3003;&amp;nbsp;//!&amp;lt; 没有找到目标地址&lt;BR&gt;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp; *}&lt;BR&gt;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*!lg_SocketAddress&lt;BR&gt;&amp;nbsp; *{&lt;BR&gt;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;const uint32 LG_SOCKETADDRESS_NO_IP_CODE&amp;nbsp;= 0x2001;&amp;nbsp;//!&amp;lt; 无效IP地址&lt;BR&gt;&amp;nbsp;const uint32 LG_SOCKETADDRESS_OFF_RANGE_CODE&amp;nbsp;= 0x2002;&amp;nbsp;//!&amp;lt; 地址索引超出边界&lt;BR&gt;&amp;nbsp;/*&lt;BR&gt;&amp;nbsp; *}&lt;BR&gt;&amp;nbsp; */&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;/*!lg_Thread&lt;BR&gt;&amp;nbsp; *{&lt;BR&gt;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;const uint32 LG_THREAD_NO_INIT&amp;nbsp;&amp;nbsp;= 0x4001;&amp;nbsp;//!&amp;lt; 线程还没有初始化&lt;BR&gt;&amp;nbsp;const uint32 LG_THREAD_HAVE_RUN&amp;nbsp;&amp;nbsp;= 0x4002;&amp;nbsp;//!&amp;lt; 线程已经运行&lt;BR&gt;&amp;nbsp;const uint32 LG_THREAD_NO_OBJECT&amp;nbsp;= 0x4003;&amp;nbsp;//!&amp;lt; 创建线程对象失败&lt;BR&gt;&amp;nbsp;const uint32 LG_THREAD_NO_SEM&amp;nbsp;&amp;nbsp;= 0x4004;&amp;nbsp;//!&amp;lt; 线程没有设置启动信号&lt;BR&gt;&amp;nbsp;const uint32 LG_THREAD_NO_HANDLE&amp;nbsp;= 0x4005;&amp;nbsp;//!&amp;lt; 线程关闭了挂起功能&lt;BR&gt;&amp;nbsp;const uint32 LG_THREAD_NO_RUN&amp;nbsp;&amp;nbsp;= 0x4006;&amp;nbsp;//!&amp;lt; 线程没有运行&lt;BR&gt;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp; *}&lt;BR&gt;&amp;nbsp; */&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;/*!Other&lt;BR&gt;&amp;nbsp; *{&lt;BR&gt;&amp;nbsp; */&lt;BR&gt;&amp;nbsp; const uint32 LG_NO_IMP&amp;nbsp;= 0xFF01;&amp;nbsp;//!&amp;lt; 没有实现该功能&lt;BR&gt;// 常量定义&lt;BR&gt;&amp;nbsp;const uint32 &amp;nbsp;TIMEOUT_INF = ~(uint32)0;&amp;nbsp;//!不允许超时标记&lt;/P&gt;
&lt;P&gt;&amp;nbsp;const uint32 LG_BUFFER_LEN_LIMIT = 0x5001;//数据长度不够&lt;BR&gt;&amp;nbsp;const uint32 LG_TYPE_DISMATCH&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x5002;//类型不匹配&lt;BR&gt;&amp;nbsp;const uint32 LG_STRING_END_ERROR = 0x5003;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;#define VERSION 100&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;#pragma warning( disable : 4251 )&lt;BR&gt;&amp;nbsp;#pragma warning( disable : 4786 )&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/longest/aggbug/19807.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>longest</dc:creator><title>代码库之二 －原子计数</title><link>http://blog.vckbase.com/longest/articles/19797.html</link><pubDate>Thu, 27 Apr 2006 18:21:00 GMT</pubDate><guid>http://blog.vckbase.com/longest/articles/19797.html</guid><wfw:comment>http://blog.vckbase.com/longest/comments/19797.html</wfw:comment><comments>http://blog.vckbase.com/longest/articles/19797.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/longest/comments/commentRss/19797.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/longest/services/trackbacks/19797.html</trackback:ping><description>&lt;P&gt;&lt;FONT color=#008000&gt;&lt;BR&gt;这段时间忙着整理代码，想写一个简单的封装库，所以这里的文字比较少，但代码比较简单应该比较好看懂。另外对我的代码有什么看法，错误的地方，请具体提出，我会非常感激，对于只会骂人的人请你哪儿凉快哪儿呆着去。&lt;BR&gt;今天提供一个原子计数的类&lt;BR&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000080&gt;///////////.H/////&lt;BR&gt;&lt;BR&gt;#ifndef LGLIB_SYNCLOCK_H&lt;BR&gt;#define LGLIB_SYNCLOCK_H&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000080&gt;#if _MSC_VER&amp;gt;1000&lt;BR&gt;#pragma once&lt;BR&gt;#endif&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000080&gt;#include &amp;lt;WINDOWS.H&amp;gt;&lt;BR&gt;namespace lglib&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp; * lg_AtomicCounter类提供了一个线程安全的整数计数器。AotomicCounter依赖于平&lt;BR&gt;&amp;nbsp; * 台是否提供&amp;#8220;原子&amp;#8221;整数操作。&lt;BR&gt;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;class __LGLIB__ lg_AtomicCounter&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;private:&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;int32 atomic;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000080&gt;&amp;nbsp;public:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp;&amp;nbsp; * 默认构造函数&lt;BR&gt;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp;lg_AtomicCounter();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp;&amp;nbsp; * 赋初值构造函数&lt;BR&gt;&amp;nbsp;&amp;nbsp; *&lt;BR&gt;&amp;nbsp;&amp;nbsp; * @param&amp;nbsp;value&amp;nbsp;初始值&lt;BR&gt;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp;lg_AtomicCounter(int value);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*! 自增量运算。 */&lt;BR&gt;&amp;nbsp;&amp;nbsp;int32 operator++(void);&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*! 自减量运算。 */&lt;BR&gt;&amp;nbsp;&amp;nbsp;int32 operator--(void);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000080&gt;&amp;nbsp;&amp;nbsp;/*! 增量运算。 */&lt;BR&gt;&amp;nbsp;&amp;nbsp;int32 operator+=( int change );&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000080&gt;&amp;nbsp;&amp;nbsp;/*! 减量运算。 */&lt;BR&gt;&amp;nbsp;&amp;nbsp;int32 operator-=( int change );&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000080&gt;&amp;nbsp;&amp;nbsp;/*! 加法运算。 */&lt;BR&gt;&amp;nbsp;&amp;nbsp;int32 operator+( int change );&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000080&gt;&amp;nbsp;&amp;nbsp;/*! 减法运算。 */&lt;BR&gt;&amp;nbsp;&amp;nbsp;int32 operator-( int change );&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*! 赋值运算。 */&lt;BR&gt;&amp;nbsp;&amp;nbsp;int32 operator=(int value);&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*! 非运算。 */&lt;BR&gt;&amp;nbsp;&amp;nbsp;bool operator!(void);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000080&gt;&amp;nbsp;&amp;nbsp;/*! 类型转换，将该类转换为int型量。 */&lt;BR&gt;&amp;nbsp;&amp;nbsp;operator int32();&lt;BR&gt;&amp;nbsp;};&lt;BR&gt;}&lt;BR&gt;&lt;FONT color=#a52a2a&gt;/////////////////////////.CPP////////////////////////////////&lt;BR&gt;namespace lglib {&lt;BR&gt;//---------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;// 默认构造函数&lt;BR&gt;&amp;nbsp;lg_AtomicCounter::lg_AtomicCounter()&lt;BR&gt;&amp;nbsp;{ atomic = 0; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*!&lt;BR&gt;&amp;nbsp;* 赋初值构造函数&lt;BR&gt;&amp;nbsp;*&lt;BR&gt;&amp;nbsp;* @param&amp;nbsp;value&amp;nbsp;初始值&lt;BR&gt;&amp;nbsp;*/&lt;BR&gt;&amp;nbsp;lg_AtomicCounter::lg_AtomicCounter(int value)&lt;BR&gt;&amp;nbsp;{ atomic = value; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*! 自增量运算。 */&lt;BR&gt;&amp;nbsp;int32 lg_AtomicCounter::operator++(void)&lt;BR&gt;&amp;nbsp;{ return InterlockedIncrement( &amp;amp;atomic ); }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*! 自减量运算。 */&lt;BR&gt;&amp;nbsp;int32 lg_AtomicCounter::operator--(void)&lt;BR&gt;&amp;nbsp;{ return InterlockedDecrement( &amp;amp;atomic ); }&lt;BR&gt;//---------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;// 增量运算。&lt;BR&gt;&amp;nbsp;int32 lg_AtomicCounter::operator+=( int change )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;InterlockedExchangeAdd( &amp;amp;atomic, change );&lt;BR&gt;&amp;nbsp;&amp;nbsp;return atomic;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;//---------------------------------------------------------------------------&lt;BR&gt;&amp;nbsp;// 减量运算&lt;BR&gt;&amp;nbsp;int32 lg_AtomicCounter::operator-=( int change )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;InterlockedExchangeAdd( &amp;amp;atomic, -change );&lt;BR&gt;&amp;nbsp;&amp;nbsp;return atomic;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;/*! 加法运算。 */&lt;BR&gt;&amp;nbsp;int32 lg_AtomicCounter::operator+( int change )&lt;BR&gt;&amp;nbsp;{ return atomic + change; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*! 减法运算。 */&lt;BR&gt;&amp;nbsp;int32 lg_AtomicCounter::operator-( int change )&lt;BR&gt;&amp;nbsp;{ return atomic - change; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*! 赋值运算。 */&lt;BR&gt;&amp;nbsp;int32 lg_AtomicCounter::operator=(int value)&lt;BR&gt;&amp;nbsp;{ return InterlockedExchange(&amp;amp;atomic, value); }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*! 非运算。 */&lt;BR&gt;&amp;nbsp;bool lg_AtomicCounter::operator!(void)&lt;BR&gt;&amp;nbsp;{ return ( atomic == 0 ) ? true : false; }&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*! 类型转换，将该类转换为int型量。 */&lt;BR&gt;&amp;nbsp;lg_AtomicCounter::operator int32()&lt;BR&gt;&amp;nbsp;{ return atomic; }&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/longest/aggbug/19797.html" width = "1" height = "1" /&gt;</description></item></channel></rss>