找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4605|回复: 1

求助!给ACE_Activation_Queue设置通知策略不被响应的问题

[复制链接]
发表于 2010-2-2 18:09:00 | 显示全部楼层 |阅读模式
#include <ace\OS_main.h>
#include <ace\Future.h>
#include <ace\Task.h>
#include <ace\Method_Request.h>
#include <ace\Activation_Queue.h>
#include <ace\Reactor_Notification_Strategy.h>
#include <ace\Reactor.h>
#include <ace\Message_Queue.h>
#include <iostream>
using std::cout;
using std::endl;

class readFileResult
{
public:
        readFileResult(char* buff, int buffer_Len)
        {
        m_buff = buff;
                m_buffer_Len = buffer_Len;
        }
        readFileResult()
        {

        }

        readFileResult(const readFileResult & other)
        {
         m_buff = other.m_buff;
                 m_buffer_Len = other.m_buffer_Len;
        }
        char * GetBuffer()
        {
                return m_buff;
        }
        int GetBufferLen()
        {
                return m_buffer_Len;
        }

        void displayBuffer()
        {
                cout<< m_buff<<endl;
        }

private:
        char *m_buff;
        int m_buffer_Len;
};

class ReadFile_Observer1:public ACE_Future_Observer<readFileResult>
{
public:

        ReadFile_Observer1()
        {
        }

        ~ReadFile_Observer1()
        {
        }
    virtual void update (const ACE_Future<readFileResult> &future)
        {
                 readFileResult rs ;
         future.get(rs);
         cout<<"ReadFile_Observer1 :"<<rs.GetBuffer()<<endl;  
               
        }

};
class ReadFile_Observer2:public ACE_Future_Observer<readFileResult>
{
public:
       
        ReadFile_Observer2()
        {
        }
       
        ~ReadFile_Observer2()
        {
        }
    virtual void update (const ACE_Future<readFileResult> &future)
        {
                readFileResult rs ;
                future.get(rs);
                cout<<"ReadFile_Observer2 :"<<rs.GetBuffer()<<endl;  
               
        }
       
};

class Function1_Request : public ACE_Method_Request
{
public:
        Function1_Request (readFileResult &rs,
                ACE_Future<readFileResult> returnVal)
                :rs_(rs)//,  returnVal_(returnVal)
        {
                returnVal_= returnVal;
        }
       
        virtual int call (void)
        {       
                ::Sleep(500);
                strcpy(rs_.GetBuffer(), "end function1");
                this->returnVal_.set (rs_);
                return 0;
        }
       
private:
    readFileResult &rs_;
        ACE_Future<readFileResult> returnVal_;
};

class ActivityObject : public ACE_Task<ACE_NULL_SYNCH>
{
public:
                ActivityObject()
         : notifier_ (0, this, ACE_Event_Handler::WRITE_MASK)
                {
                 this->reactor (ACE_Reactor::instance());
                 this->reactor ()->register_handler(this, ACE_Event_Handler::READ_MASK);
                 this->notifier_.reactor (this->reactor ());
                                 this->m_activity_queue.queue()->notification_strategy (&this->notifier_);
                                 this->activate();
         }

         ~ActivityObject()
         {

         }

         virtual int  svc(void)
         {

                        this->reactor ()->owner(ACE_Thread::self());
               return this->reactor ()->run_event_loop();
         }

         ACE_Future<readFileResult> function1(readFileResult &rfile )
         {
                 ACE_Future<readFileResult> test;
                                  m_activity_queue.enqueue(new Function1_Request(rfile, test));
                 return test;
         }

         int handle_input(ACE_HANDLE fd  = 0)
         {

                 ACE_Method_Request *  pMethodRequest = m_activity_queue.dequeue();
                 if (pMethodRequest->call() == -1)
                 {
                         return -1;
                 }
                 
                delete pMethodRequest;
                return 0;
         }

private:
        ACE_Activation_Queue m_activity_queue;
        ACE_Reactor_Notification_Strategy notifier_;
};

int ACE_TMAIN(int, ACE_TCHAR *[])
{
    ActivityObject obj;
    char buff[1024];
    memset(buff,0,sizeof(buff)/sizeof(char));
    readFileResult rfile(buff, 1024);
    ACE_Future<readFileResult> read_result = obj.function1(rfile);
    read_result.attach(new ReadFile_Observer1);
    read_result.attach(new ReadFile_Observer2);
    obj.wait();
    return 0;
}


为什么int handle_input(ACE_HANDLE fd  = 0)总是不能被调用?我在线程中已经改变了ACE_Reactor的拥有者了啊!
 楼主| 发表于 2010-2-3 10:08:12 | 显示全部楼层
找到原因了,通知策略和后续响应的MARK不一致。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-22 18:21 , Processed in 0.013690 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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