template <class T>
class Task : public Task_Base
{
public:
   /*
    * Constructor and Destructor
    */
   Task (const string &taskName, int iMaxQueueSize = 1000);
   virtual ~Task (void);

   /*
    * Initialize object
    */
   virtual int init();

   /*
    * orderly shutdown of task
    */
   virtual int shutdown();

   /*
    * putter/getter for message queue
    */
   virtual int put(T *pT);
   virtual T* get();

   /*
    * size of message queue
    */
   virtual int size();
   
   /*
    * thread entry point
    */
   virtual int svc();

   /*
    * derived class must implement. main processing entry point.
    */
   virtual void run() = 0;

   /*
    * name of task
    */
   string getName() {return m_taskName;}

   /*
    * Returns a pointer to the lock adapter.
    */
   static ACE_Lock_Adapter<ACE_SYNCH_MUTEX> *lock_adapter (void);

protected:
   int initTask();
   
private:
   string m_taskName;
   
   // Simple Barrier to make sure all service threads have
   // entered their loop before accepting any messages.
   ACE_Barrier m_barrier;
   
   // This Lock_Adapter is used to synchronize operations
   // on the ACE_Message_Block objects
   static ACE_Lock_Adapter<ACE_SYNCH_MUTEX> lock_adapter_;

   //count of queue
   int m_iQueueCt;
   int m_iMaxQueueSize;
};