找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 6406|回复: 1

请教ACE_TASK getq 超时问题

[复制链接]
发表于 2009-9-24 08:40:33 | 显示全部楼层 |阅读模式
我的环境是VC++6 和ACE-5.5 编译examples/APG/theadpool 运行发现, 如果不修改 MAX_TIMEOUT = 500 Workers 在处理14个消息后就退出了,不知是什么问题,是否我的ACE版本有问题。谢谢。


// Task_ThreadPool.cpp,v 1.6 2004/07/02 21:56:50 shuston Exp
#include "ace/config-lite.h"
#if defined (ACE_HAS_THREADS)
#include  "ace/OS_main.h"
#include "ace/OS_NS_string.h"
#include "ace/OS_NS_time.h"
#include "ace/Task.h"
#include "ace/Synch.h"
#include "ace/SString.h"
// Listing 2 code/ch16
class Workers : public ACE_Task<ACE_MT_SYNCH>
{
public:
  Workers ()
  { }
  virtual int svc (void)
  {
    while (1)
      {
        ACE_Message_Block *mb = 0;
        if (this->getq (mb) == -1)
          {
            ACE_DEBUG ((LM_INFO,
                        ACE_TEXT ("(%t) Shutting down\n")));
            break;
          }
        // Process the message.
        process_message (mb);
      }
    return 0;
  }
  // Listing 2
private:
  void process_message (ACE_Message_Block *mb)
  {
    ACE_TRACE (ACE_TEXT ("Workers::process_message"));
    int msgId;
    ACE_OS::memcpy (&msgId, mb->rd_ptr (), sizeof(int));
    mb->release ();
//    ACE_DEBUG ((LM_DEBUG,
//                ACE_TEXT ("(%t) Started processing message %d\n"),
//               msgId));
    ACE_OS::sleep (3);
    ACE_DEBUG ((LM_DEBUG,
                ACE_TEXT ("(%t) Finished processing message %d\n"),
                msgId));
  }
};
// Listing 1 code/ch16
class Manager : public ACE_Task<ACE_MT_SYNCH>
{
public:
  enum {POOL_SIZE = 5, MAX_TIMEOUT = 50000};
  Manager () : shutdown_(0)
  {
    ACE_TRACE (ACE_TEXT ("Manager::Manager"));
  }
  int svc (void)
  {
    ACE_TRACE (ACE_TEXT ("Manager::svc"));
    ACE_DEBUG ((LM_INFO, ACE_TEXT ("(%t) Manager started\n")));
    // Create pool.
    Workers pool;
    pool.activate (THR_NEW_LWP | THR_JOINABLE, POOL_SIZE);
    while (!done ())
      {
        ACE_Message_Block *mb = 0;
        ACE_Time_Value tv ((long)MAX_TIMEOUT);
        tv += ACE_OS::time (0);
         
        // Get a message request.
        if (this->getq (mb, &tv) < 0)
          {
            pool.msg_queue ()->deactivate ();
            pool.wait ();
            break;
          }
        // Ask the worker pool to do the job.
        pool.putq (mb);
      }
    return 0;
  }
private:
  int done (void);
  int shutdown_;
};
// Listing 1
int Manager::done (void)
{
  return (shutdown_ == 1);
}

int ACE_TMAIN (int, ACE_TCHAR *[])
{
  Manager tp;
  tp.activate ();
  // Wait for a moment every time you send a message.
  ACE_Time_Value tv;
  tv.msec (10);
  ACE_Message_Block *mb;
  for (int i = 0; i < 300; i++)
    {
      ACE_NEW_RETURN
        (mb, ACE_Message_Block(sizeof(int)), -1);
      ACE_OS::memcpy (mb->wr_ptr (), &i, sizeof(int));
      ACE_OS::sleep (tv);
      // Add a new work item.
      tp.putq (mb);
    }
  ACE_Thread_Manager::instance ()->wait ();
  return 0;
}
#else
#include "ace/OS_main.h"
#include "ace/OS_NS_stdio.h"
int ACE_TMAIN (int, ACE_TCHAR *[])
{
  ACE_OS::puts (ACE_TEXT ("This example requires threads."));
  return 0;
}
#endif /* ACE_HAS_THREADS */
发表于 2009-9-24 09:32:00 | 显示全部楼层
在if语句内部打一个断点,
if (this->getq (mb, &tv) < 0)
          {
            pool.msg_queue ()->deactivate ();
            pool.wait ();
            break;
          }
看是否进去了,然后检查errno是否为ETIME
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-23 13:31 , Processed in 0.017835 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表