找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3995|回复: 1

JAWS3中的Reactor框架

[复制链接]
发表于 2007-12-13 23:56:43 | 显示全部楼层 |阅读模式
最近开始学习ACE,想把其中的JAWS3部分内容抽取出来,封装成一个动态库,供MFC或者在DELPHI中都可使用。ACE中自带的JAWS3是不完整的,为了了解它的运行流程,就使用JAWS3目录下的子目录small,用vc6在其中新建一个Console类型的工程,然后把所有文件都包含进来,并把JAWS3目录下的main.cpp文件也拷贝过来,
  1. int
  2. main (int argc, ACE_TCHAR *argv[])
  3. {
  4.   ACE_REACTOR_INSTANCE_INIT;
  5. //以下两行代码是增加的
  6.     TeraSS_Acceptor acp;
  7.     acp.init(argc, argv);
  8.   JAWS_Signal_Task::instance ();
  9.   if (ACE_Service_Config::open (argc, argv) == -1
  10.       && errno != ENOENT)
  11.     ACE_ERROR_RETURN ((LM_ERROR,
  12.                        ACE_TEXT ("%p\n"),
  13.                        ACE_TEXT ("open")),
  14.                       1);
  15.   // Run forever, performing the configured services until we
  16.   // shutdown.
  17.   JAWS_Event_Dispatcher::run_event_loop ();
  18.   ACE_Thread_Manager::instance ()->wait ();
  19.   return 0;
  20. }
复制代码
jaws.conf配置文件中的 JAWS_IO = REACTIVE ,并在SS_State_READ.cpp中的service和transition函数打断点,
这样运行后,程序能够正确进入以上两个函数。

现在让Reactor不在主线程中运行(要应用到MFC中时,它是不可能在主线程中运行的),修改了Event_Dispatcher.cpp
文件,是ACE_Reactor::run_event_loop ()在另一个线程中启动,如下
  1. JAWS_Event_Dispatcher_Proactor_Event_Loop (void *)
  2. {
  3.   ACE_Proactor::run_event_loop ();
  4.   return 0;
  5. }
  6. static ACE_THR_FUNC_RETURN
  7. JAWS_Event_Dispatcher_Reactor_Event_Loop (void *)
  8. {
  9.   //ACE_REACTOR_INSTANCE_INIT;
  10.   int result;
  11.   result = ACE_Thread::spawn ( JAWS_Event_Dispatcher_Proactor_Event_Loop, 0, THR_BOUND);
  12.   if (result < 0)
  13.     {
  14.       ACE_ERROR ((LM_ERROR, "%p\n", "ACE_Thread::spawn"));
  15.       return 0;
  16.     }
  17.   // Now, enter the reactor's event loop.
  18.   ACE_Reactor::run_event_loop ();
  19.   // End the proactor's event loop if reactor was interrupted.
  20.   ACE_Proactor::end_event_loop ();
  21.   
  22.   return 0;
  23. }
  24. void
  25. JAWS_Event_Dispatcher::end_event_loop (void)
  26. {
  27.   ACE_Reactor::end_event_loop ();
  28. }
  29. void
  30. JAWS_Event_Dispatcher::run_event_loop (void)
  31. {
  32.   // First, initiate the proactor thread
  33.   int result;
  34.   result = ACE_Thread::spawn (JAWS_Event_Dispatcher_Reactor_Event_Loop, 0, THR_BOUND);
  35.   if (result < 0)
  36.     {
  37.       ACE_ERROR ((LM_ERROR, "%p\n", "ACE_Thread::spawn"));
  38.       return;
  39.     }
  40. }
复制代码
即把原来在JAWS_Event_Dispatcher::run_event_loop中执行的内容放在另一个线程中执行了。这时,再执行程序通讯时,能进service函数,但进不了transition函数。如果修改aws.conf配置文件中的 JAWS_IO 为SYNCH或ASYNCH,则
都能进入,为什么尼? Reactor框架必须在主线程中执行吗?
 楼主| 发表于 2007-12-13 23:56:53 | 显示全部楼层
ace_reactor::instance()->run_event_loop()之前,加上

ace_reactor::instance()->owner(ace_thread::self());获得reactor的使用权
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-5-20 05:49 , Processed in 0.162406 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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