Windows平台怎么实现主程序来加载服务、事件循环?
大家好,一直Linux平台上开发,也在Windows平台做过一些简单测试程序,没有留意这个问题。
现在才突然想起来了,如果要在Windows平台做一个东东,才发现不能用Linux的方式。
在Linux上面,调试的时候Console直接输出,要进入后台服务直接加参数-b就可以了,但在Windows要将应用作为服务或者作为GUI的服务线程不是那么简单哈。还在groups上面问了一下,没人答。关键是ACE目前位置没有支持Windows-GUI集成消息的Reactor实现。有一个ACE_Msg_MFMO_Reactor可以处理WM_*消息,但我没有弄明白怎么把它集成到GUI中或者NT_Service中。
有碰到or想过这方面的兄弟吗?指点一下。
谢谢。 都非常容易的。
ACE里面实现了一个NT_Service接口,你集成就可以了。能做NT Service的程序开发。
如果要用GUI,启动前调用一下ACE::init()就可以了,特别容易。 一个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;
} 自己写个线程跑这个Reactor循环啊 good question!
reactor与mfc的消息循环结合在一起,应该称之为 ACE_MFC_Reactor了吧,
就跟ACE_Xt_Reactor一样。
其实winston的方法就可以解决你的问题,不过要注意:MFC不是线程安全的,请
注意保护你的MFC类。
页:
[1]