在 PictureBox 中绘制火车时,C# 中出现内存不足异常

2024-01-06

我正在尝试创建一个应用程序来显示在线火车picturebox

所以为了实现这个我创建了一个worker thread为了获得在线火车位置。所以我定义了线程,如下所示:

private Thread workerThread = null;
private delegate void UpdateListBoxDelegate();
private UpdateListBoxDelegate UpdateListBox = null;

In Form_load我称这些为:

            UpdateListBox = new UpdateListBoxDelegate(this.UpdateStatus);
            // Initialise and start worker thread
            workerThread = new Thread(new ThreadStart(this.GetOnlineTrain));
            workerThread.Start();

我的委托处理方法是:

private void UpdateStatus()
{
    foreach (TimeTable onlineTrain in OnlineTrainList.ToList())
    {
        if (lstSensorLeft.Count != 0 || lstSensorRight.Count != 0)
        {
            pictureBoxonlineTrain.Image = null;

            DrawOnlineTrain();
        }
        else
        {
            pictureBoxonlineTrain.Image = null;
        }
    }

    this.Invalidate();
}

The GetOnlineTrain获取在线火车的位置,如下所示:

public void GetOnlineTrain()
{
    try
    {
        while (true)
        {
            TimeTableRepository objTimeTableREpository = new TimeTableRepository();
            OnlineTrainList = objTimeTableREpository.GetAll().ToList();
            objTimeTableREpository = null;
            Invoke(UpdateListBox);
        }
    }
    catch(Exception a)
    {
    }

}

最后的函数将在线火车绘制在picturebox :

   public void DrawOnlineTrain()
        {
            Bitmap map=null;
            if (OnlineTrainList.Count > 0)
            {
                map = new Bitmap(pictureBoxonlineTrain.Size.Width, pictureBoxonlineTrain.Size.Height);

                var graph = Graphics.FromImage(map);

                foreach (TimeTable t in OnlineTrainList.ToList())
                {
                   // graph.Dispose();
                    Rectangle rectTrainState = new Rectangle(t.XTrainLocation.Value - 3,
                                                             t.YTrainLocation.Value - 3,
                                                             15, 15);
                    graph.FillRectangle(RedBrush, rectTrainState);
                    graph.DrawString(t.TrainId.ToString(), pictureBoxonlineTrain.Font, Brushes.White, t.XTrainLocation.Value  -3, t.YTrainLocation.Value -3);

                }
            }
            pictureBoxonlineTrain.Image = map;
          //  pictureBoxonlineTrain.Image.Save(@"C:\RailwayShiraz\ShirazMetro\ShirazRailWayWeb\Images\Train.jpg");
        } 

但我的应用程序花费了大量内存,有时我得到了Out of memory exception有时我的火车Disappears来自picturebox。为了第一次绘制在线火车,我在上面绘制了火车地图(线路、车站...)picturebox有尺寸x=A and y=b之后我创建另一个picturebox具有相同的尺寸并放置第二个picturebox首先picturebox使用此代码:

    pictureBoxonlineTrain.Parent = pictureBoxMetroMap;

我想也许我的代码的某些部分消耗了大量内存,我应该使用Dispose或者其他什么。有时我得到out of memory exception该错误是由graphic我不确定!有时我会从这一行收到错误:

   map = new Bitmap(pictureBoxonlineTrain.Size.Width, pictureBoxonlineTrain.Size.Height);

您能给我一些帮助吗?是否有任何我应该处理的类?或者问题是由我的实现引起的

我跟踪内存使用情况taskmanager有时我的使用量达到1,666,881我的应用程序退出。

此致


处理不再需要的位图。它们消耗大量的非托管内存。 GC 不知道非托管内存,无法基于无法访问的非托管内存触发收集。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PictureBox 中绘制火车时,C# 中出现内存不足异常 的相关文章

  • 什么定义了类型的大小?

    ISO C 标准规定 sizeof char lt sizeof short lt sizeof int lt sizeof long 我在 BIT Linux mint 19 1 上使用 GCC 8 大小为long int is 8 我正
  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • 信号与信号2

    我的应用程序可能会受益于使用 boost 的信号库之一而不是本土解决方案 该应用程序是多线程的 但执行信号处理的部分是单线程的 如果多线程不是问题 是否有任何理由更喜欢 Boost Signals2 而不是 Boost Signal Boo
  • C# 中类似图的实现

    所以我有一个对象 我们称之为 Head 它有一个对象列表 C C1 C2 C3 T T1 T2 和 M M1 M2 并且所有这些都是相互关联的 例如 Head gt C1 C2 C3 T1 T2 M1 M2 T1 gt C1 C2 T2 g
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • C++ 指针和对象实例化

    这有效 MyObject o o new MyObject 而这并不 MyObject o new MyObject Why 关键词new 返回一个指针 http msdn microsoft com en us library kewsb
  • 为什么像 BindingList 或 ObservableCollection 这样的类不是线程安全的?

    我一次又一次发现自己必须编写 BindingList 和 ObservableCollection 的线程安全版本 因为当绑定到 UI 时 这些控件无法从多个线程更改 我想理解的是why情况就是这样 这是设计错误还是故意的 问题是设计一个线
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 如何在 Visual Basic DLL 和 C++ DLL 之间创建隔离/免注册 COM?

    我必须在 C DLL 中使用 VB COM DLL 我弄清楚了如何从 C DLL 访问 VB COM DLL 并且它可以工作 现在我遇到了一个问题 我必须使用隔离的 COM 免注册 COM 因为我无法在必须使用它的每台 PC 上注册 DLL
  • FluentAssertions ShouldNotThrow 无法识别异步方法/Func

    我正在尝试检查异步方法是否抛出具体异常 为此 我使用 MSTEST 和 FluentAssertions 2 0 1 我已经检查过这个关于 Codeplex 的讨论 http fluentassertions codeplex com wo
  • 如何调试.NET Windows Service OnStart方法?

    我用 NET 编写的代码仅在作为 Windows 服务安装时才会失败 该故障甚至不允许服务启动 我不知道如何进入 OnStart 方法 如何 调试 Windows 服务应用程序 http msdn microsoft com en us l
  • 原子存储抛出错误

    我最近升级到了 C 11 兼容编译器 并且尝试将一些代码从 boost 更新到 c 11 标准 我在使用atomic store转换一些代码时遇到了问题 这是一些简单的测试代码 似乎会引发编译器错误 int main std shared
  • ASP.NET MVC 动作过滤器

    有谁知道即使在 CATCH 块中 ActionFilterAttribute 类的 OnResultExecuted 方法是否也会执行 ie CookiesActions public ActionResult Login Usuarios
  • Windows 上本机 C++ 应用程序中的自动死代码检测?

    背景 我有一个用原生 C 编写的应用程序 花了几年的时间 大约有 60 KLOC 有很多函数和类已经死了 可能有 10 15 就像下面提出的类似的基于 Unix 的问题 我们最近开始对所有新代码进行单元测试 并尽可能将其应用于修改后的代码
  • 应在堆栈上分配的最大数量

    我一直在寻找堆栈溢出有关应在堆栈上分配的最大内存量的指南 我看到了堆栈与堆分配的最佳实践 但没有关于应该在堆栈上分配多少以及应该在堆上分配多少的指南 有什么想法 数字可以作为指导吗 什么时候应该在堆栈上分配 什么时候应该在堆上分配 多少才算
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • C - 获取外部IP地址

    我需要通过 C C 调用获取我的公共 IP 地址 我知道作为替代方案 我可以从 http whatismyip akamai com 等外部链接获取 我写了一个示例来获取外部IP地址 但我的程序没有返回外部 IP 地址 我正在获取内部 IP
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • 为什么 C++ 标准没有将 sizeof(bool) 定义为 1?

    Size of char signed char and unsigned char由 C 标准本身定义为 1 个字节 我想知道为什么它没有定义sizeof bool also C 03 标准 5 3 3 1 说 sizeof char s
  • 在 C# 中使用自定义千位分隔符

    在显示字符串时 我尝试不使用 字符作为千位分隔符 而是使用空格 我想我需要定义一种自定义文化 但我似乎做得不对 有什么指点吗 例如 将 1000000 显示为 1 000 000 而不是 1 000 000 no String Replac

随机推荐

  • 在 ubuntu 16.04 lts 上安装 numba 0.30.1

    如何在 Ubuntu 16 04 LTS 上安装 Python 3 的当前版本 0 30 1 numba 我的 Python 版本是 3 5 2 并且我安装了 Ubuntu 的准系统 我认为是服务器版本 好吧 经过几个小时的弄清楚事情之后
  • 列表框未突出显示选项卡更改时的选择

    我目前正在第一次尝试 C 和 WPF 我有一个带有两个选项卡的窗口 tabA and tabB 每个选项卡都有一个列表框 它们几乎相同 tabA has listboxA and tabB has listboxB 当选择列表框中的某个项目
  • 语义相同的两个属性的 TypeId 应该不同还是相同?

    MSDN 指出 http msdn microsoft com en us library system attribute typeid 28v vs 71 29 aspx财产的TypeId that 在实现时 该标识符仅仅是属性的类型
  • C++ - 确定 Linux 中是否存在目录(而不是文件)[重复]

    这个问题在这里已经有答案了 在 Linux 中使用 C 如何确定目录 而不是文件 是否存在 我尝试使用 stat 函数 但当找到文件时它返回正值 我只想查找输入的字符串是否是目录 而不是其他内容 根据人 2 统计 http linux di
  • Go 中的条件编译

    我正在尝试写一个Gowrapper https github com deft code go enet using CGo http golang org cmd cgo for ENet https github com lsalzma
  • 如何在单击按钮时发送 wp_mail?

    我正在我的 WordPress 插件中构建一个选项页面 我有一个包含收件人 发件人 主题和消息以及保存和发送按钮的表单 这个想法是您填写收件人 发件人 主题和消息 单击 保存 然后单击 发送 发送消息 我在尝试在单击按钮时运行发送功能时遇到
  • 解析 Chrome 书签 Json 文件:Java

    目前我正在使用 netbeans IDE 我尝试使用其他解决方案 但到目前为止没有运气 问题是 我在尝试时遇到错误读取Json文件来自谷歌 Chrome 书签文件 C Users Admin AppData Local Google Chr
  • 如何向 Mule 有效负载添加附加数据?

    我正在尝试将一些额外的静态数据添加到入站 http 消息 作为 URL 参数接收 有效负载 然后将其提交到基于出站 http 表单的端点 我的骡子配置如下
  • 能否以编程方式获取运行 Android 6.0+ 的设备的 MAC 地址?

    能否以编程方式获取运行 Android 6 0 的设备的 MAC 地址 根据this https developer android com about versions marshmallow android 6 0 changes ht
  • 使用 OpenLayers 5 显示地理参考图像

    我正在尝试制作一个应用程序 用户可以在其中对扫描地图进行地理配准 您可以在此处查看示例 https codesandbox io s 2o99jvrnyy https codesandbox io s 2o99jvrnyy有两个图像 资产
  • #import 和 @class 之间有什么区别,什么时候应该使用其中之一?

    在过去的一个月左右的时间里 我一直在自学 Objective C 我是一名 Java 专家 现在我的大脑已经掌握了其中的大部分内容 目前让我感到困惑的一件事是 通过 class 导入类与 import 导入类有什么区别 一种比另一种更好 还
  • 如何减少Kafka主题的分区数量?

    我在 Kafka 上创建了一个具有 4 个分区的主题 默认设置number partition 4 现在我想将这个主题的数字分区更改为3 我尝试过跑步 bin kafka topics sh alter zookeeper localhos
  • 使用枚举描述绑定组合框

    我通过 Stackoverflow 发现有一种简单的方法可以用枚举填充组合框 cbTipos DataSource Enum GetValues typeof TiposTrabajo 就我而言 我为我的枚举定义了一些描述 public e
  • 如何捕获屏幕的一部分

    我正在使用 win32 PrintWindow 函数将屏幕捕获到 BitMap 对象 如果我只想捕获窗口的一部分区域 如何裁剪内存中的图像 这是我用来捕获整个窗口的代码 System Runtime InteropServices DllI
  • 有没有办法在 C# 中抑制警告,类似于 Java 的 @SuppressWarnings 注释?

    有没有办法在 C 中抑制警告 类似于 Java 的 SuppressWarnings 注释 如果做不到这一点 是否有另一种方法可以抑制 Visual Studio 中的警告 Yes 如需禁用 请使用 pragma warning disab
  • Python:文件中的反斜杠(\u...)

    我有一个包含 u 格式的 unicode 字符的文件 我想将它们作为普通的 unicode 字符串写入另一个文件 但我无法将反斜杠解释为转义字符 所以我把它放在一个文件中 例如 u1203 u1208 u1208 u0074 u00E4 u
  • C++ 类函数应该以 } 结尾吗?或者只有一个}?

    关于 C 语法的基本问题 C 函数应该以 结尾吗 或者没关系 或者这两个例子有什么区别 有结局 void Test print 没有 void Test print 我见过有或没有的 C 代码 但我不明白有什么区别 Thanks Updat
  • 如何将 xsd 转换为人类可读的文档? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们有一些基于 XML 的接口 这些接口在 XSD 模式中得到了很好的记录 这些接口现在将公开 我们希望为它们创建参考文档 有没有一个工具
  • java 8 中删除 JDBC ODBC 桥

    从 Java 8 开始 JDK 将不再包含 JDBC ODBC Bridge Class forName sun jdbc odbc JdbcOdbcDriver classNotFoundException is thrown 还有其他连
  • 在 PictureBox 中绘制火车时,C# 中出现内存不足异常

    我正在尝试创建一个应用程序来显示在线火车picturebox 所以为了实现这个我创建了一个worker thread为了获得在线火车位置 所以我定义了线程 如下所示 private Thread workerThread null priv