找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5545|回复: 4

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

[复制链接]
发表于 2008-9-18 23:38:22 | 显示全部楼层 |阅读模式
大家好,
      一直Linux平台上开发,也在Windows平台做过一些简单测试程序,没有留意这个问题。
     现在才突然想起来了,如果要在Windows平台做一个东东,才发现不能用Linux的方式。
     在Linux上面,调试的时候Console直接输出,要进入后台服务直接加参数-b就可以了,但在Windows要将应用作为服务或者作为GUI的服务线程不是那么简单哈。还在groups上面问了一下,没人答。关键是ACE目前位置没有支持Windows-GUI集成消息的Reactor实现。有一个ACE_Msg_MFMO_Reactor可以处理WM_*消息,但我没有弄明白怎么把它集成到GUI中或者NT_Service中。
     有碰到or想过这方面的兄弟吗?指点一下。
谢谢。
 楼主| 发表于 2008-9-18 23:38:30 | 显示全部楼层
都非常容易的。
ACE里面实现了一个NT_Service接口,你集成就可以了。能做NT Service的程序开发。
如果要用GUI,启动前调用一下ACE::init()就可以了,特别容易。
 楼主| 发表于 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;
}
 楼主| 发表于 2008-9-18 23:38:54 | 显示全部楼层
自己写个线程跑这个Reactor循环啊
 楼主| 发表于 2008-9-18 23:39:01 | 显示全部楼层
good question!

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

就跟ACE_Xt_Reactor一样。

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

注意保护你的MFC类。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-5-3 20:47 , Processed in 0.013322 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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