ace_service_config::reconfigure导致proactor没法停止?
文件1: WinProactor.cppStart()
{
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,正常退出。
大家知道为什么吗?谢谢! 追踪一下。猜不出。 原帖由 winston 于 2009-5-16 10:46 发表 http://www.acejoy.com/bbs/images/common/back.gif
追踪一下。猜不出。
谢谢!
版主有时间帮我稍微跟踪一下吗,呵呵,毕竟你比我熟悉多了。。
代码就像上面那么简单,调用一下就会阻塞,我感觉ace_service_config这一套东西好像不是很方便。
阻塞的问题没法解决的话,我打算用ace_log_msg就好了,然后在开个定时器,检查文件的大小是否超过限制,是的话就重开一个,应该可行吧? 自己动手,丰衣足食。有问题再问。 你的代码都没法编译调试,只有你自己操作了。 我自己添补修改了你的代码,并没有发现你说的问题。
我用的是最新版本的ACE系统。你检查一下系统的版本。 原帖由 winston 于 2009-5-16 14:29 发表 http://www.acejoy.com/bbs/images/common/back.gif
我自己添补修改了你的代码,并没有发现你说的问题。
我用的是最新版本的ACE系统。你检查一下系统的版本。
我用的也是最新的啊,5.6.9
你的代码应该跟我上面简化写的那样差不多吧? 在一个线程里面跑proactor,主线程里面调用reconfigure?
要不把你的代码贴我看看好吗?谢谢!~ #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;
} 原帖由 winston 于 2009-5-16 22:02 发表 http://www.acejoy.com/bbs/images/common/back.gif
#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看看,马上就挂着退不出来。为什么呢?
页:
[1]