lingy 发表于 2009-9-24 08:40:33

请教ACE_TASK getq 超时问题

我的环境是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 */

modern 发表于 2009-9-24 09:32:00

在if语句内部打一个断点,
if (this->getq (mb, &tv) < 0)
          {
            pool.msg_queue ()->deactivate ();
            pool.wait ();
            break;
          }
看是否进去了,然后检查errno是否为ETIME
页: [1]
查看完整版本: 请教ACE_TASK getq 超时问题