找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3802|回复: 8

ace_service_config::reconfigure导致proactor没法停止?

[复制链接]
发表于 2009-5-16 00:17:24 | 显示全部楼层 |阅读模式
文件1: WinProactor.cpp

Start()
{
  ACE_WIN32_Proactor* winImp = new ACE_WIN32_Proactor;
  ACE_Proactor* proactor = new ACE_Proactor(winImp, 1);
  ACE_Proactor::instance(proactor, 1);

  activate();
}

Stop()
{
  ACE_Proactor::end_event_loop();
  wait();
}

svc()
{
  ACE_Proactor::run_event_loop();
  return 0;
}

文件2: main.cpp

ACE_TMAIN()
{
  ACE_Service_Config::open(argc, argv, ACE_DEFAULT_LOGGER_KEY, 1, 0, 1);

  WinProactor proactor;
  proactor.Start();

  while(TCHAR c = getchar())
  {
    if('q' == c) break;
    if('r' == c) ACE_Service_Config::reconfigure();
  }

  proactor::Stop(); // 如果输入r执行了reconfigure,这里的调用将阻塞在wait上面
}

简化到最简单的代码就像上面那样,先输入r,再输入q,proactor阻塞在wait上;如果不输入r,直接输入q,正常退出。
大家知道为什么吗?谢谢!
发表于 2009-5-16 10:46:13 | 显示全部楼层
追踪一下。猜不出。
 楼主| 发表于 2009-5-16 11:26:09 | 显示全部楼层
原帖由 winston 于 2009-5-16 10:46 发表
追踪一下。猜不出。

谢谢!
版主有时间帮我稍微跟踪一下吗,呵呵,毕竟你比我熟悉多了。。

代码就像上面那么简单,调用一下就会阻塞,我感觉ace_service_config这一套东西好像不是很方便。

阻塞的问题没法解决的话,我打算用ace_log_msg就好了,然后在开个定时器,检查文件的大小是否超过限制,是的话就重开一个,应该可行吧?
发表于 2009-5-16 13:08:01 | 显示全部楼层
自己动手,丰衣足食。有问题再问。
发表于 2009-5-16 13:11:26 | 显示全部楼层
你的代码都没法编译调试,只有你自己操作了。
发表于 2009-5-16 14:29:52 | 显示全部楼层
我自己添补修改了你的代码,并没有发现你说的问题。
我用的是最新版本的ACE系统。你检查一下系统的版本。
 楼主| 发表于 2009-5-16 17:22:06 | 显示全部楼层
原帖由 winston 于 2009-5-16 14:29 发表
我自己添补修改了你的代码,并没有发现你说的问题。
我用的是最新版本的ACE系统。你检查一下系统的版本。

我用的也是最新的啊,5.6.9
你的代码应该跟我上面简化写的那样差不多吧? 在一个线程里面跑proactor,主线程里面调用reconfigure?

要不把你的代码贴我看看好吗?谢谢!~
发表于 2009-5-16 22:02:37 | 显示全部楼层
#include "stdafx.h"
#include <ace/WIN32_Proactor.h>
class WinProactor :ACE_Task<ACE_MT_SYNCH>
{
public:
int Start()
{
  ACE_WIN32_Proactor* winImp = new ACE_WIN32_Proactor;
  ACE_Proactor* proactor = new ACE_Proactor(winImp, 0);
  ACE_Proactor::instance(proactor, 0);
  return 0;
}
int Stop()
{
  ACE_Proactor::end_event_loop();
  wait();
  return 0;
}
int svc()
{
  ACE_Proactor::run_event_loop();
  return 0;
}
};

int ACE_TMAIN(int argc, ACE_TCHAR* argv[])
{
ACE_Service_Config::open(argc, argv, ACE_DEFAULT_LOGGER_KEY, true, false, true);
WinProactor proactor;
proactor.Start();
while(TCHAR c = getchar())
{
  if('q' == c)
   break;
  if('r' == c)
   ACE_Service_Config::reconfigure();
}
proactor.Stop(); // 如果输入r执行了reconfigure,这里的调用将阻塞在wait上面
return 0;
}
 楼主| 发表于 2009-5-18 10:37:48 | 显示全部楼层
原帖由 winston 于 2009-5-16 22:02 发表
#include "stdafx.h"
#include
class WinProactor :ACE_Task
{
public:
int Start()
{
  ACE_WIN32_Proactor* winImp = new ACE_WIN32_Proactor;
  ACE_Proactor* proactor = new ACE_Proactor(winImp, 0);
  ACE ...


多谢版主。
我今天试了一下,把 ACE_Proactor::instance(m_proactor, 1);改成ACE_Proactor::instance(m_proactor, 0);就不会了,像你那样。
你可以试试把0该成1看看,马上就挂着退不出来。为什么呢?
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-26 07:18 , Processed in 0.016308 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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