peakzhang 发表于 2008-9-18 23:38:22

Windows平台怎么实现主程序来加载服务、事件循环?

大家好,
      一直Linux平台上开发,也在Windows平台做过一些简单测试程序,没有留意这个问题。
   现在才突然想起来了,如果要在Windows平台做一个东东,才发现不能用Linux的方式。
   在Linux上面,调试的时候Console直接输出,要进入后台服务直接加参数-b就可以了,但在Windows要将应用作为服务或者作为GUI的服务线程不是那么简单哈。还在groups上面问了一下,没人答。关键是ACE目前位置没有支持Windows-GUI集成消息的Reactor实现。有一个ACE_Msg_MFMO_Reactor可以处理WM_*消息,但我没有弄明白怎么把它集成到GUI中或者NT_Service中。
   有碰到or想过这方面的兄弟吗?指点一下。
谢谢。

peakzhang 发表于 2008-9-18 23:38:30

都非常容易的。
ACE里面实现了一个NT_Service接口,你集成就可以了。能做NT Service的程序开发。
如果要用GUI,启动前调用一下ACE::init()就可以了,特别容易。

peakzhang 发表于 2008-9-18 23:38:39

一个ACE的事件循环、一个Windows的消息循环,不冲突了吗?
以WTL写GUI为例,它已经有个Run循环了,把Reactor的事件循环加在哪里呢?

代码如下:
========================================================


CAppModule _Module;

int Run(LPTSTR /*lpstrCmdLine*/ = NULL, int nCmdShow = SW_SHOWDEFAULT)
{
      CMessageLoop theLoop;
      _Module.AddMessageLoop(&theLoop);

      CMainFrame wndMain;

      RECT rc = {0, 0, 350, 135};
      if(wndMain.CreateEx(NULL, &rc) == NULL)
      {
                ATLTRACE(_T("Main window creation failed!\n"));
                return 0;
      }

      wndMain.CenterWindow();
      wndMain.ShowWindow(nCmdShow);

      int nRet = theLoop.Run();

      _Module.RemoveMessageLoop();
      return nRet;
}

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/,
LPTSTR lpstrCmdLine, int nCmdShow)
{
      HRESULT hRes = ::CoInitialize(NULL);
      ATLASSERT(SUCCEEDED(hRes));

      ::DefWindowProc(NULL, 0, 0, 0L);

      AtlInitCommonControls(ICC_BAR_CLASSES); // add flags to support other
controls

      hRes = _Module.Init(NULL, hInstance);
      ATLASSERT(SUCCEEDED(hRes));

      int nRet = Run(lpstrCmdLine, nCmdShow);

      _Module.Term();
      ::CoUninitialize();

      return nRet;
}

peakzhang 发表于 2008-9-18 23:38:54

自己写个线程跑这个Reactor循环啊

peakzhang 发表于 2008-9-18 23:39:01

good question!

reactor与mfc的消息循环结合在一起,应该称之为 ACE_MFC_Reactor了吧,

就跟ACE_Xt_Reactor一样。

其实winston的方法就可以解决你的问题,不过要注意:MFC不是线程安全的,请

注意保护你的MFC类。
页: [1]
查看完整版本: Windows平台怎么实现主程序来加载服务、事件循环?