glchen 发表于 2009-5-16 00:17:24

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

文件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,正常退出。
大家知道为什么吗?谢谢!

winston 发表于 2009-5-16 10:46:13

追踪一下。猜不出。

glchen 发表于 2009-5-16 11:26:09

原帖由 winston 于 2009-5-16 10:46 发表 http://www.acejoy.com/bbs/images/common/back.gif
追踪一下。猜不出。

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

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

阻塞的问题没法解决的话,我打算用ace_log_msg就好了,然后在开个定时器,检查文件的大小是否超过限制,是的话就重开一个,应该可行吧?

winston 发表于 2009-5-16 13:08:01

自己动手,丰衣足食。有问题再问。

winston 发表于 2009-5-16 13:11:26

你的代码都没法编译调试,只有你自己操作了。

winston 发表于 2009-5-16 14:29:52

我自己添补修改了你的代码,并没有发现你说的问题。
我用的是最新版本的ACE系统。你检查一下系统的版本。

glchen 发表于 2009-5-16 17:22:06

原帖由 winston 于 2009-5-16 14:29 发表 http://www.acejoy.com/bbs/images/common/back.gif
我自己添补修改了你的代码,并没有发现你说的问题。
我用的是最新版本的ACE系统。你检查一下系统的版本。

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

要不把你的代码贴我看看好吗?谢谢!~

winston 发表于 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;
}

glchen 发表于 2009-5-18 10:37:48

原帖由 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]
查看完整版本: ace_service_config::reconfigure导致proactor没法停止?