2013-03-04 47 views
2

我有一个包含System.Windows.Forms.TrackBar的控件。我将其最大值设置为〜200,000,000。当我这样做时,控制需要800MB的内存。将最大值减少到2,000,000使用更合理的内存量。System.Windows.Forms.TrackBar内存使用具有很大的最大值

//trackBar.Maximum = 210554060; // uses ~800MB of memory 
trackBar.Maximum = 1000000;  // uses a small amount of memory 

这是Windows控件中的错误吗?或者我要求trackbar做一些不合理的事情?

更新: 我创建了一个新窗体项目,只有窗体上有一个轨迹条。我将最大值设置为200,000,000。我设置TickFrequency并进行更改,以便不存在数百万个滴答和更改步骤。

当我这样做时,应用程序使用超过800MB的内存。我正在使用.NET Framework 4.

trackbar max set to 200,000,000, using > 800MB memory

更新 我有点找到的解释这个问题:http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.windowsforms.controls/2006-12/msg00015.html

添加链接测试项目 https://www.dropbox.com/s/nh6jsymw05feoqn/testingTrackbar.zip?m

+0

你是怎么确定它使用大量内存的? – 2013-03-04 19:45:16

+0

@ImmortalBlue:请参阅[本文](http://stackoverflow.com/questions/15206654/excessive-memory-usage-by-comctl32-dl​​l-when-a-checkbox-controls-visible-becomes) As far将其缩小到TrackBar,我将跟踪栏的最大值更改为1000000,并使用资源监视器工具查看提交内存。我想我应该确保问题不是其他的使用最大值的东西。 – GreenRibbon 2013-03-04 19:55:55

+0

那么,我刚刚做了一个noddy复制,并且最大尺寸对我的应用程序没有任何影响。我怀疑它实际上是使用那么多内存的trackbar。您是否将某些内容绑定到了trackbar的最大值? – 2013-03-04 20:02:12

回答

4

这是Windows控件中的错误?

是的,我认为你可以称之为一个错误。在64位操作系统上特别讨厌,平台目标设置为AnyCPU,因此没有合理的内存分配上限。我的机器完全死于鼠标交换死亡,Ctrl + Alt + Del无响应,我用硬启动将其恢复。谢谢。

实际上有两个错误。它从原生轨迹栏控件开始,没有将合理的上限限制在滴答数量上。通过按照正确的顺序分配属性,您可以在设计模式中生存下来。但它由于TrackBar类包装中的缺陷而复杂化,它在运行时初始化本机控件时,会在TickFrequency属性之前分配Maximum属性。所以在短暂的时间内,它仍然有一个巨大的蜱虫。呃,当它有20亿的时候,它不是简单的,就像我不知情的尝试。

没有简单的解决方法,这个错误不会得到修复。使用合理的值,你总是可以通过乘法来映射它们。