找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4743|回复: 3

最简单的Streams框架,为什么不对?

[复制链接]
发表于 2008-7-15 22:06:46 | 显示全部楼层 |阅读模式
//头文件
  1. #include "ace/Task.h"
  2. #include "ace/Synch.h"
  3. #include "ace/Message_Block.h"
  4. #include "ace/Log_Msg.h"
  5. #include "ace/Stream.h"
  6. class S_Task_1 : public ACE_Task<ACE_MT_SYNCH>
  7. {
  8. int open(void* = 0){return this->activate();}
  9. int svc(void)
  10. {
  11.   ACE_Message_Block *mb;
  12.   for (mb = 0; ; )
  13.   {
  14.    ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("S_Task::svc() - ") ACE_TEXT ("waiting for work\n" )));
  15.    this->getq (mb);
  16.    
  17.    ACE_DEBUG((LM_DEBUG, ACE_TEXT ("S_Task_1 run \n")));
  18.    ACE_DEBUG((LM_DEBUG, ACE_TEXT ("Data %s\n"), mb->rd_ptr()));
  19.    this->put_next(mb);   
  20.   }
  21. }
  22. };
  23. class S_Task_2 : public ACE_Task<ACE_MT_SYNCH>
  24. {
  25. int open(void* = 0){return this->activate();}
  26. int svc(void)
  27. {
  28.   ACE_Message_Block *mb;
  29.   for (mb = 0; ; )
  30.   {
  31.    ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("S_Task::svc() - ") ACE_TEXT ("waiting for work\n" )));
  32.    this->getq (mb);
  33.    
  34.    ACE_DEBUG((LM_DEBUG, ACE_TEXT ("S_Task_2 run \n")));
  35.    ACE_DEBUG((LM_DEBUG, ACE_TEXT ("Data %s\n"), mb->rd_ptr()));
  36.    this->put_next(mb);
  37.   }
  38. }
  39. };
  40. class End_Task : public ACE_Task<ACE_MT_SYNCH>
  41. {
  42. int open(void* = 0){return this->activate();}
  43. int svc(void)
  44. {
  45.   ACE_Message_Block *mb;
  46.   for (mb = 0; ; )
  47.   {
  48.    ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("S_Task::svc() - ") ACE_TEXT ("waiting for work\n" )));
  49.    this->getq (mb);
  50.    
  51.    ACE_DEBUG((LM_DEBUG, ACE_TEXT ("End_Task run \n")));
  52.    ACE_DEBUG((LM_DEBUG, ACE_TEXT ("Data %s\n"), mb->rd_ptr()));
  53.    mb->release();
  54.   }
  55. }
  56. };
  57. class S_Stream : public ACE_Stream<ACE_MT_SYNCH>
  58. {
  59. public:
  60. typedef ACE_Stream<ACE_MT_SYNCH> inherited;
  61. typedef ACE_Module<ACE_MT_SYNCH> Module;
  62. S_Stream():inherited(){};
  63. int open (void)
  64. {
  65.   ACE_DEBUG((LM_DEBUG, ACE_TEXT("Stream open!\n")));
  66.   Module* endModule;
  67.   End_Task * end_ = new End_Task();
  68.   ACE_NEW_RETURN(endModule,
  69.    Module("End Module", end_),
  70.    -1);
  71.   this->inherited::open((void*)0, (Module*)0, endModule);
  72.   Module* module1;
  73.   ACE_NEW_RETURN(module1,
  74.    Module("module1", new S_Task_1()),
  75.    -1);
  76.   Module* module2;
  77.   ACE_NEW_RETURN(module2,
  78.    Module("module2", new S_Task_2()),
  79.    -1);
  80.   this->push(module1);
  81.   this->push(module2);  
  82.   return 0;
  83. }
  84. };
  85. //实现文件
  86. #include "SimpleStream.h"
  87. #include <stdlib.h>
  88. #include <iostream>
  89. using namespace std;
  90. int ACE_TMAIN (int, ACE_TCHAR *[])
  91. {
  92. ACE_Message_Block *input = new ACE_Message_Block();
  93. char *testData = "Test Data Body!";
  94. input->copy(testData, strlen(testData));
  95. S_Stream s;
  96. s.open();
  97. s.put(input);
  98. ACE_Message_Block *output;
  99. s.get(output);
  100. cout<< "Message Body:" << *output->rd_ptr();
  101. system("PAUSE");
  102. return 0;
  103. }
复制代码
编译完了以后几个Module都阻塞在get方法上了,我在主函数里put数据了啊,为什么所有的Module都get()不到数据呢??
谁来给解决一下啊,我初学Stream框架,谢谢了!!
 楼主| 发表于 2008-7-15 22:06:58 | 显示全部楼层
你要重新定义ace_task中的open方法,这样才能把message_block压入当前的message_queue,

int put(ACE_Message_Block *message,ACE_Time_Value *timeout)

{

          return this->putq(message,timeout);

}

一定要patient呀,看完书,再写测试代码!
 楼主| 发表于 2008-7-15 22:07:06 | 显示全部楼层
问题解决,没重载put方法,看书不仔细。。。
发表于 2008-8-4 16:47:30 | 显示全部楼层

学习....

能把完整的代码贴出来吗,我加了后还不行...
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-5-4 16:12 , Processed in 0.023744 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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