谈一下跨平台网络通信应用程序的设计,第一种呢就是用预编译宏,在不同的宏定义下包含不同的头文件,调用不同的函数,这个麻烦了点,但好处是直截了当,调试方便,哪儿个步骤出来问题了然于胸,第二种呢就是用apr啦,头文件呢应该是象这样
#include <apr.h>
#include <apr_pools.h>
#include <apr_network_io.h>
#include <apr_thread_proc.h>
#include <apr_poll.h>
#include <apr_thread_cond.h>
#include <apr_portable.h>
#include <apr_queue.h>
#include <stdlib.h>
#if ( UNI_CURRENT_SYSTEM == 2 )
#include <syslog.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <net/if_arp.h>
#endif
然后就去调里面的东西吧,
比如说调
apr_initialize() ;
第三种呢就是用ACE,不过这个东西可是门槛不低啊,
第四种呢用asio,在boost_1_35_0中包含进去了,boost_1_34_1中还没有需要单独加进去
好了,我们今天要实现的项目问题中要用到ACE还要实现一个优先队列的机制,请注意我的目的不是要演示我的
优先队列设计的有多么好,而是要告诉你ACE_Time_Value设置不当会搞死你的CPU哦!
// SmsPriorityMessageQueue.h: interface for the SmsPriorityMessageQueue class.
//
//
#if !defined(AFX_SMSPRIORITYMESSAGEQUEUE_H__553E9667_5E4D_46D0_AF52_C340AA5229F2__INCLUDED_)
#define AFX_SMSPRIORITYMESSAGEQUEUE_H__553E9667_5E4D_46D0_AF52_C340AA5229F2__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "ace/OS.h"
#include "ace/Synch.h"
#include "ace/Basic_Types.h"
#include "ace/Message_Queue.h"
class ACE_Time_Value;
class MsgHandleData;
#define DISALLOW_EVIL_CONSTRUCTORS(TypeName) /
TypeName(const TypeName&); /
TypeName& operator=(const TypeName&)
class SmsPriorityMessageQueue
{
public:
SmsPriorityMessageQueue();
virtual ~SmsPriorityMessageQueue();
//int peek(ACE_Message_Block *mb, ACE_Time_Value *tv= 0);
int enqueue(ACE_Message_Block *mb, ACE_Time_Value *tv= 0);
//int dequeue(ACE_Message_Block *&mb, ACE_Time_Value *tv=(&ACE_Time_Value(0,5)));
int dequeue(ACE_Message_Block *&mb, ACE_Time_Value *tv=(&ACE_Time_Value(1)));
//int is_full (void) const;
//int is_empty (void) const;
//ACE_UINT32 message_count (void) const;
//void clear();
ACE_UINT32 odinaryque_count(void) const;
ACE_UINT32 priorityque_count(void) const;
ACE_UINT32 total_count(void) const;
private:
mutable ACE_Message_Queue<ACE_MT_SYNCH> ordinaryQueue_;//普通队列
mutable ACE_Message_Queue<ACE_MT_SYNCH> priorityQueue_;//优先队列
DISALLOW_EVIL_CONSTRUCTORS(SmsPriorityMessageQueue);
};
#endif // !defined(AFX_SMSPRIORITYMESSAGEQUEUE_H__553E9667_5E4D_46D0_AF52_C340AA5229F2__INCLUDED_)
这是我的头文件,内含了两个ACE_Message_Queue<ACE_MT_SYNCH>,一个是普通队列,一个是优先队列
ok,现在看实现一(有问题),
int SmsPriorityMessageQueue::dequeue(ACE_Message_Block *& mb, ACE_Time_Value *tv)
{
if(priorityQueue_.dequeue(mb,tv)==-1)
{
if(ordinaryQueue_.dequeue_head(mb,tv)==-1)
{
return -1;
}
}
return 0;
}
然后你运行,哇,机器好慢啊,仔细一看CPU97%--100%了,为什么会出现这种情况呢?把tv的默认值加大再试一
试,还是不行,怎么办呢?
实现二(正确)
int SmsPriorityMessageQueue::dequeue(ACE_Message_Block *& mb, ACE_Time_Value *tv)
{
//ACE_Time_Value delaytime(5);
//unsigned int secondX=tv->sec();
ACE_Time_Value timeValue_;
ACE_Time_Value waitTime_(0,10);
//注意下面两句话很重要
timeValue_ = ACE_OS::gettimeofday();
timeValue_ +=waitTime_;
//豁然开朗了吧dequeu操作需要相对当前的时间
if(priorityQueue_.dequeue(mb,&timeValue_)==-1)
{
timeValue_ = ACE_OS::gettimeofday();
timeValue_+=(*tv);
if(ordinaryQueue_.dequeue_head(mb,&timeValue_ )== -1)
{
return -1;
}
}
if(mb== 0)
{
return -1;
}
return 0;
}
运行一看,风平浪静了吧
结束语:今天带大家领略了一把ACE,以后还会把更多的项目经验传授给大家.