none
由Windows service创建的进程,进程中调用CWnd::Create()方法有次数限制 RRS feed

  • 问题

  • 环境:Windows Server 2012 R2 Ver.6.3

    我开发了一个window service程序去创建进程,该服务用户是Local System

    在进程中调用CWnd::Create()方法,大概在1900+次左右开始失败

            BOOL b = TRUE;
    	CList<CWnd*> lstWnd;
    	CString strLog(_T(""));
    	CRect rect(0, 0, 10, 10);
    	for(int i = 0; i < 10000; ++i)
    	{
    		CWnd* pWnd = new CWnd();
    		b = pWnd->Create(NULL, NULL, WS_CHILD,  rect, this, i );
    
    		strLog.Format(_T("[%d]Create window return %d"),i, b);
    		OutputLog(strLog);
    
    		lstWnd.AddTail(pWnd);
    	}

    如果我把CWnd::Create()换成::CreateWindowEx()方法的话,同样也是1900+次左右开始失败,并且GetLastError返回8(内存不足)

    另外,如果不用window service启动进程,直接双击运行进程,能够成功运行9900+次

    所以想知道window service程序启动的进程有什么限制?和直接双击运行进程有什么区别?

    2018年3月22日 2:13

全部回复

  • Hi,

    欢迎在MSDN论坛发帖。

    据我所知window service 被定义的session 0,运行的时候都是使用本地的system 账号,所以你在双击运行exe 的时候,使用的也是system的账户吗? 

    正常的应用程序,是一个独立的进程,但是service 有可能贡献一个运行的进程,这样的目的是为了快速的启动,资源的共享。

    不知道是不是这个原因导致这样的结果。 我也在网上发现 service 和应用程序的不同点,你可以参考一下。

    https://www.coretechnologies.com/blog/windows-services/windows-service-vs-regular-application/

    Best Regards,

    Hart

    注意:此回复包含对第三方万维网站点的引用。 Microsoft提供此信息为您提供方便。 Microsoft不控制这些网站,并且没有测试在这些网站上发现的任何软件或信息; 因此,Microsoft不能对任何软件或信息的质量,安全性或适用性做任何声明。 使用互联网上发现的任何软件都存在固有的危险,Microsoft警告您,在从互联网检索任何软件之前,请确保您完全理解风险。


    MSDN Community Support Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年3月23日 7:03
    版主
  • 试描述一下应用的场景,为什么要创建这么多的进程,目的是什么。

    进程要耗费系统资源,CPU,内存等。

    可以创建无数量限制的进程,但需要对不需要的进程进行释放以回收资源,以避免您遇到的内存不足问题。


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms


    2018年3月26日 0:54