C# Winfrom项目,运行程序一段时间后提示“内在不足”的报错信息。

sxl_88 2015-03-26 10:35:34

在C# Winfrom项目,有一个form窗体,六个Panel控件(用于放置显示监控视频图像的用户自定义控件),
还有一个timer计时器控件(设置每隔2分钟调用其它六个监控视频图像放到对应的Panel控件)

目前遇到的问题是,监控点的视频图像有的由于网络好点显示加载视频图像快点,有的由于网络不是太好加载显示视频图像慢点。
在form窗体运行一段时间后,导致这个form窗体的六个Panel控件在轮流显示相应的六个监控视频图像后,提示“内在不足”的报错信息。
发现在这个时间段内,电脑CPU的使用率为90%至100%之间。


是不是将timer计时器控件的时间间隔设置多点(例如设置每隔6分钟)或者将运行这个程序电脑的硬件配置再改善下,硬件配置高点。请问这样可以解决此问题吗?
还是有其它的办法解决此问题?最好能提供相关的参考资料。谢谢!
...全文
398 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxl_88 2015-03-27
  • 打赏
  • 举报
回复
引用 15 楼 wyd1520 的回复:
[quote=引用 14 楼 sxl_88 的回复:] 不好意思,当时输入太快了,输入有误。报错信息为"内存不足"; foreach(Control ctl in pl.Controls) { ctl.dispose() //内存释放 } pl.Controls.Clear(); 请问,这样可以释放内存吗?
可以的呀,不过你最好要把他转换成视频控件,由控件里的方法去主动释放[/quote] foreach(Control ctl in pl.Controls) { PlayerMon.PlayerMon ctlplaymon = (PlayerMon.PlayerMon) ctl; //转换成视频控件 ctlplaymon.dispose(); //在转换后的视频控件对象中内存释放 } pl.Controls.Clear(); 请问,这样把他转换成视频控件,再由转换后的视频控件调用dispose()方法,来释放内存。这样做可以吗?
本拉灯 2015-03-27
  • 打赏
  • 举报
回复
引用 14 楼 sxl_88 的回复:
不好意思,当时输入太快了,输入有误。报错信息为"内存不足"; foreach(Control ctl in pl.Controls) { ctl.dispose() //内存释放 } pl.Controls.Clear(); 请问,这样可以释放内存吗?
可以的呀,不过你最好要把他转换成视频控件,由控件里的方法去主动释放
sxl_88 2015-03-27
  • 打赏
  • 举报
回复
不好意思,当时输入太快了,输入有误。报错信息为"内存不足"; foreach(Control ctl in pl.Controls) { ctl.dispose() //内存释放 } pl.Controls.Clear(); 请问,这样可以释放内存吗?
sxl_88 2015-03-27
  • 打赏
  • 举报
回复
帮忙看看,谢谢
於黾 2015-03-27
  • 打赏
  • 举报
回复
先把错误信息贴出来看 不要说什么"内在不足",内在是什么玩意
sxl_88 2015-03-27
  • 打赏
  • 举报
回复
引用 10 楼 wyd1520 的回复:
[quote=引用 9 楼 sxl_88 的回复:] [quote=引用 8 楼 wyd1520 的回复:] 你这里也释放 pl.Controls.Clear(); 这里Clear没有释放控件的资源的。 你要把上次加载的控件给释放掉再 PlayerMon.PlayerMon ocm = new PlayerMon.PlayerMon(); ocm.Name = name.ToString(); ocm.Width = width; ocm.Height = height; ocm.Top = (pl.Height - ocx.Height) / 2; ocm.Left = ((pl.Width - ocx.Width) / 2)-1; ocm.Play(monitorarray[0], monitorarray[1], monitorarray[2], monitorarray[3], monitorarray[5], monitorarray[6], monitorarray[4], monitorarray[7], "rtsp", monitorarray[10], monitorarray[11], monitorarray[0], monitorarray[1], "HIK-DS8000HC", monitorarray[5], monitorarray[5], monitorarray[2], monitorarray[3], "av_stream", monitorarray[8], monitorarray[12], monitorarray[14]); pl.Controls.Add(ocx);
1、关键是上次加载控件的对象没有存下来,所以没有办法释放掉上次加载的控件。 2、如果能获取上次加载控件的对象,用Dispose方法能释放掉对象吗? 请帮忙想想办法,如何解决此问题。谢谢。[/quote] 你在Clear之前就可以取到那加载的控件呀。 foreach(Control ctl in pl.Controls) { 内存释放 } pl.Controls.Clear();[/quote] foreach(Control ctl in pl.Controls) { ctl.dispose() //内存释放 } pl.Controls.Clear(); 这样可以释放内存吗?
sxl_88 2015-03-27
  • 打赏
  • 举报
回复
能帮忙再看看,谢谢。
sxl_88 2015-03-26
  • 打赏
  • 举报
回复
引用 3 楼 woshiwaixingren123 的回复:
给你提个方向,仅供参考: 你每次调用过后是否有效的释放或内存 ,虽然gc会自动回收,但是如果线程一直处于等待状态,切不手动释放内存 就会出现这种情况 。
具体怎么样释放内存呢,能详细点吗。谢谢。
随煜而安 2015-03-26
  • 打赏
  • 举报
回复
楼上的方法是可行的。 也可以弄个静态数组,动态标记这些需要释放的资源 在每次timer触发时先dispose掉这些资源
会走路的小鸟 2015-03-26
  • 打赏
  • 举报
回复
给你提个方向,仅供参考: 你每次调用过后是否有效的释放或内存 ,虽然gc会自动回收,但是如果线程一直处于等待状态,切不手动释放内存 就会出现这种情况 。
本拉灯 2015-03-26
  • 打赏
  • 举报
回复
上代码,加分数,
Justin-Liu 2015-03-26
  • 打赏
  • 举报
回复
这种问题几天就会遇到一个。。。 该释放的对象没有释放就积累满了 Dispose没调用
本拉灯 2015-03-26
  • 打赏
  • 举报
回复
引用 9 楼 sxl_88 的回复:
[quote=引用 8 楼 wyd1520 的回复:] 你这里也释放 pl.Controls.Clear(); 这里Clear没有释放控件的资源的。 你要把上次加载的控件给释放掉再 PlayerMon.PlayerMon ocm = new PlayerMon.PlayerMon(); ocm.Name = name.ToString(); ocm.Width = width; ocm.Height = height; ocm.Top = (pl.Height - ocx.Height) / 2; ocm.Left = ((pl.Width - ocx.Width) / 2)-1; ocm.Play(monitorarray[0], monitorarray[1], monitorarray[2], monitorarray[3], monitorarray[5], monitorarray[6], monitorarray[4], monitorarray[7], "rtsp", monitorarray[10], monitorarray[11], monitorarray[0], monitorarray[1], "HIK-DS8000HC", monitorarray[5], monitorarray[5], monitorarray[2], monitorarray[3], "av_stream", monitorarray[8], monitorarray[12], monitorarray[14]); pl.Controls.Add(ocx);
1、关键是上次加载控件的对象没有存下来,所以没有办法释放掉上次加载的控件。 2、如果能获取上次加载控件的对象,用Dispose方法能释放掉对象吗? 请帮忙想想办法,如何解决此问题。谢谢。[/quote] 你在Clear之前就可以取到那加载的控件呀。 foreach(Control ctl in pl.Controls) { 内存释放 } pl.Controls.Clear();
sxl_88 2015-03-26
  • 打赏
  • 举报
回复
引用 8 楼 wyd1520 的回复:
你这里也释放 pl.Controls.Clear(); 这里Clear没有释放控件的资源的。 你要把上次加载的控件给释放掉再 PlayerMon.PlayerMon ocm = new PlayerMon.PlayerMon(); ocm.Name = name.ToString(); ocm.Width = width; ocm.Height = height; ocm.Top = (pl.Height - ocx.Height) / 2; ocm.Left = ((pl.Width - ocx.Width) / 2)-1; ocm.Play(monitorarray[0], monitorarray[1], monitorarray[2], monitorarray[3], monitorarray[5], monitorarray[6], monitorarray[4], monitorarray[7], "rtsp", monitorarray[10], monitorarray[11], monitorarray[0], monitorarray[1], "HIK-DS8000HC", monitorarray[5], monitorarray[5], monitorarray[2], monitorarray[3], "av_stream", monitorarray[8], monitorarray[12], monitorarray[14]); pl.Controls.Add(ocx);
1、关键是上次加载控件的对象没有存下来,所以没有办法释放掉上次加载的控件。 2、如果能获取上次加载控件的对象,用Dispose方法能释放掉对象吗? 请帮忙想想办法,如何解决此问题。谢谢。
本拉灯 2015-03-26
  • 打赏
  • 举报
回复
你这里也释放 pl.Controls.Clear(); 这里Clear没有释放控件的资源的。 你要把上次加载的控件给释放掉再 PlayerMon.PlayerMon ocm = new PlayerMon.PlayerMon(); ocm.Name = name.ToString(); ocm.Width = width; ocm.Height = height; ocm.Top = (pl.Height - ocx.Height) / 2; ocm.Left = ((pl.Width - ocx.Width) / 2)-1; ocm.Play(monitorarray[0], monitorarray[1], monitorarray[2], monitorarray[3], monitorarray[5], monitorarray[6], monitorarray[4], monitorarray[7], "rtsp", monitorarray[10], monitorarray[11], monitorarray[0], monitorarray[1], "HIK-DS8000HC", monitorarray[5], monitorarray[5], monitorarray[2], monitorarray[3], "av_stream", monitorarray[8], monitorarray[12], monitorarray[14]); pl.Controls.Add(ocx);
sxl_88 2015-03-26
  • 打赏
  • 举报
回复
请帮忙看看下面的代码如何修改。代码如下: private void FrmMonitor_Load(object sender, EventArgs e) { timer = new System.Threading.Timer(MyTimerCallback, null, 0, 360000); //每隔6分钟 } void MyTimerCallback(object o) { try { //防止在窗口句柄初始化之前就走到下面的代码 if (this.IsHandleCreated == true) { TheadPackage(); } } catch (Exception ex) { Log.Log(string.Format("MyTimerCallback:{0}\terrmsg:{1}", this.ToString(), ex.Message)); } } void TheadPackage() { System.Threading.Thread thread = new System.Threading.Thread( new System.Threading.ThreadStart(doWork)); thread.Start(); } void doWork() { try { System.Threading.Thread.Sleep(500); dtList1 = sqlHelper.GetNumsVedioList(index* 6); if (dtList1.Rows.Count == 0) { index = 0; dtList1 = sqlHelper.GetNumsVedioList(index * 6); } monitor_listVideoChannel = mod.MonitorUrl1(dtList1); index++; string[] MonitorArrayUrl = new string[6]; for (int k = 0; k < monitor_listVideoChannel.Count; k++) { string str1 = ""; str1 += "" + ((CVideoChannel)(monitor_listVideoChannel[k])).ip.ToString() + ","; str1 += "" + ((CVideoChannel)(monitor_listVideoChannel[k])).port.ToString() + ","; str1 += "" + ((CVideoChannel)(monitor_listVideoChannel[k])).username.ToString() + ","; str1 += "" + ((CVideoChannel)(monitor_listVideoChannel[k])).pass.ToString() + ","; str1 += "" + ((CVideoChannel)(monitor_listVideoChannel[k])).tpid.ToString() + ","; str1 += "" + ((CVideoChannel)(monitor_listVideoChannel[k])).vcno.ToString() + ","; str1 += "" + ((CVideoChannel)(monitor_listVideoChannel[k])).vcname.ToString() + ","; str1 += "" + ((CVideoChannel)(monitor_listVideoChannel[k])).vcid.ToString() + ","; str1 += "" + ((CVideoChannel)(monitor_listVideoChannel[k])).server.ToString() + ","; str1 += "" + ((CVideoChannel)(monitor_listVideoChannel[k])).ISVOICE.ToString() + ","; str1 += "" + ((CVideoChannel)(monitor_listVideoChannel[k])).STREAM.ToString() + ";"; str1 += "ISPICTURE&" + ((CVideoChannel)(monitor_listVideoChannel[k])).ISPICTURE.ToString() + ","; str1 += "ISPTZ&" + ((CVideoChannel)(monitor_listVideoChannel[k])).ISPTZ.ToString() + ","; str1 += "ISAUDIO&" + ((CVideoChannel)(monitor_listVideoChannel[k])).ISAUDIO.ToString() + ","; str1 += "ISRECORD&" + ((CVideoChannel)(monitor_listVideoChannel[k])).ISRECORD.ToString() + ","; str1 += "ISPLAYBACK&" + ((CVideoChannel)(monitor_listVideoChannel[k])).ISPLAYBACK.ToString() + ","; str1 += "ISDOWNLOAD&" + ((CVideoChannel)(monitor_listVideoChannel[k])).ISDOWNLOAD.ToString() + ","; str1 += "ISALARM&" + ((CVideoChannel)(monitor_listVideoChannel[k])).ISALARM.ToString() + ","; str1 += "ISTVWALL&" + ((CVideoChannel)(monitor_listVideoChannel[k])).ISTVWALL.ToString() + ";"; str1 += ((CVideoChannel)(monitor_listVideoChannel[k])).veinfo.ToString() + ";"; MonitorArrayUrl[k] = str1; } //防止在窗口句柄初始化之前就走到下面的代码 if (this.IsHandleCreated == true && Module1.frmvalue == "montor") { MyInvoke mi = new MyInvoke(SetMonitor); BeginInvoke(mi, new object[] { MonitorArrayUrl }); } System.Threading.Thread.Sleep(500); } catch (Exception ex) { Log.Log(string.Format("doWork:{0}\terrmsg:{1}", this.ToString(), ex.Message)); } } public void SetMonitor(string[] strarray) { try { for (int m = 0; m < strarray.Length; m++) { if (strarray[m] != null) { string strvalue = strarray[m].ToString(); string[] monitorarray = strvalue.Split(';')[0].Split(','); if (m == 0) { PlayMon(monitorarray[7].ToString(), 640, 360, panel1, monitorarray); } else if (m == 1) { PlayMon(monitorarray[7].ToString(), 640, 360, panel2, monitorarray); } else if (m == 2) { PlayMon(monitorarray[7].ToString(), 640, 360, panel3, monitorarray); } else if (m == 3) { PlayMon(monitorarray[7].ToString(), 640, 360, panel4, monitorarray); } else if (m == 4) { PlayMon(monitorarray[7].ToString(), 640, 360, panel5, monitorarray); } else if (m == 5) { PlayMon(monitorarray[7].ToString(), 640, 360, panel6, monitorarray); } } } } catch (Exception ex) { Log.Log(string.Format("SetMonitor:{0}\terrmsg:{1}", this.ToString(), ex.Message)); } } void PlayMon(string name, int width, int height, Panel pl, string[] monitorarray) //创建播放监控视频的组件 { pl.Controls.Clear(); PlayerMon.PlayerMon ocm = new PlayerMon.PlayerMon(); ocm.Name = name.ToString(); ocm.Width = width; ocm.Height = height; ocm.Top = (pl.Height - ocx.Height) / 2; ocm.Left = ((pl.Width - ocx.Width) / 2)-1; ocm.Play(monitorarray[0], monitorarray[1], monitorarray[2], monitorarray[3], monitorarray[5], monitorarray[6], monitorarray[4], monitorarray[7], "rtsp", monitorarray[10], monitorarray[11], monitorarray[0], monitorarray[1], "HIK-DS8000HC", monitorarray[5], monitorarray[5], monitorarray[2], monitorarray[3], "av_stream", monitorarray[8], monitorarray[12], monitorarray[14]); pl.Controls.Add(ocx); }
huhuapop 2015-03-26
  • 打赏
  • 举报
回复
估计是内存没有释放,记得释放内存,最好能附代码和思路,否则也没法帮忙
mingcsharp 2015-03-26
  • 打赏
  • 举报
回复
引用 4 楼 sxl_88 的回复:
[quote=引用 3 楼 woshiwaixingren123 的回复:] 给你提个方向,仅供参考: 你每次调用过后是否有效的释放或内存 ,虽然gc会自动回收,但是如果线程一直处于等待状态,切不手动释放内存 就会出现这种情况 。
具体怎么样释放内存呢,能详细点吗。谢谢。[/quote] 没法具体,除非你上代码,并附上你的思路

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧