c++程序员修炼真经之三

 谈一下跨平台网络通信应用程序的设计,第一种呢就是用预编译宏,在不同的宏定义下包含不同的头文件,调用不同的函数,这个麻烦了点,但好处是直截了当,调试方便,哪儿个步骤出来问题了然于胸,第二种呢就是用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,以后还会把更多的项目经验传授给大家.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值