none
关于基于MFC的应用程序达到句柄上限的问题 RRS feed

  • 问题

  •      目前正在开发一款CS架构的网络游戏,客户端窗口是基于MFC构架的,所有窗口和控件全都继承至MFC的控件。这就造成了一个问题,由于不断添加新控件导致程序的句柄数目越来越大。目前启动后已经达到了4000+个 User对象,由于进程句柄有上限(查阅过部分资料为:9999,可以修改注册表达到180000).所以当程序3开时,句柄数目超过上限,导致系统所有创建窗口的操作失败。想请教一下各位技术高手,这个问题有没有什么好的方法可以解决。

    2010年8月4日 3:24

答案

  • 老是把系统资源耗尽的话,客户会把你的程序删除掉的。你的程序功能做得再好也没有用。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年8月4日 14:44
    版主
  • 句柄是要占用系统资源的(系统内存而非用户内存).所以句柄数量是有限制的.句柄过多会极大地减慢系统运行速度.

    你这样设计程序就是不合理的,理论上一个进程句柄不应该超过1000.释放掉你已经不需要的句柄.

    再说,Windows系统GDI是用来绘制简单界面的,做个简单游戏还行,没有对复杂的界面作特殊优化,性能肯定不行.

    你这属于设计不合理,只能重做,难道你们设计的时候都不进行可行性分析么?


    0xBAADF00D
    2010年8月5日 7:56
    版主
  • 对于某些资源不需要都要创建,可以使用享源的模式,比如一些画笔,字体等等。都可以做个资源池进行复用。这样就可以降低资源数量。
    麻烦把正确答案设为解答。
    2010年8月5日 13:17
    版主

全部回复

  • 用DirectX

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年8月4日 4:43
    版主
  • 谢谢版主回复,如果用DirectX,是不是要重做所有窗口,如果那样的话工作量太大了,有没有其他方法呢?
    2010年8月4日 5:21
  • 重新设计界面,能自己画的就不创建窗口。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年8月4日 5:25
    版主
  •  这种方法是可以,但是好像不太适用于目前的项目,因为我现在有4000+个User对象,要全部重新设计的话,项目进度不允许。

    2010年8月4日 7:07
  • 老是把系统资源耗尽的话,客户会把你的程序删除掉的。你的程序功能做得再好也没有用。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年8月4日 14:44
    版主
  • 句柄是要占用系统资源的(系统内存而非用户内存).所以句柄数量是有限制的.句柄过多会极大地减慢系统运行速度.

    你这样设计程序就是不合理的,理论上一个进程句柄不应该超过1000.释放掉你已经不需要的句柄.

    再说,Windows系统GDI是用来绘制简单界面的,做个简单游戏还行,没有对复杂的界面作特殊优化,性能肯定不行.

    你这属于设计不合理,只能重做,难道你们设计的时候都不进行可行性分析么?


    0xBAADF00D
    2010年8月5日 7:56
    版主
  •           多谢Vonger,确实是设计上有问题,我是中途接手这个项目,这样设计的原因我想可能是在项目初期没有想到会添加如此多的句柄。这个项目已经在线上运营,只开一个进程的话没有太大的问题。所以如果完全从底层重做话项目无法接受,我现在在尝试完全使用动态创建和销毁资源。

    2010年8月5日 9:52
  • 对于某些资源不需要都要创建,可以使用享源的模式,比如一些画笔,字体等等。都可以做个资源池进行复用。这样就可以降低资源数量。
    麻烦把正确答案设为解答。
    2010年8月5日 13:17
    版主