C# Winfrom项目,运行程序一段时间后揭示“存储空间不足,无法处理此命令”的报错信息
C# Winfrom项目,运行程序一段时间后提示“存储空间不足,无法处理此命令”的报错信息。
在C# Winfrom项目,有一个form窗体,六个Panel控件(用于放置显示监控视频图像的用户自定义控件),
还有一个timer计时器控件(设置每隔6分钟调用其它六个监控视频图像放到对应的Panel控件)
目前遇到的问题是,监控点的视频图像有的由于网络好点显示加载视频图像快点,有的由于网络不是太好加载显示视频图像慢点。
在form窗体运行一段时间后,导致这个form窗体的六个Panel控件在轮流显示相应的六个监控视频图像后,提示“存储空间不足,无法处理此命令”的报错信息。
发现在这个时间段内,电脑内存的使用率为40%至50%左右。
请问如何修改下面的代码可以解决此问题?谢谢!
附代码:
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) //创建播放监控视频的组件
{
foreach(Control ctl in pl.Controls)
{
ctl.dispose() //内存释放,不过貌似释放不了内存。这个地方还有其它方法可以释放内存?
}
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);
}
------解决思路----------------------
先确认是C盘没空间了,还是内存不足了。32位程序的内存使用有限制的。另外windows的内存使用率显示也有问题,当产生大量内存碎片时,那个使用率根本不准确。
------解决思路----------------------
foreach(Control ctl in pl.Controls)
{
PlayerMon.PlayerMon pl= ctl as PlayerMon.PlayerMon ;
找找这个pl有没有 Close关闭视频的方法。
ctl.dispose() //内存释放,不过貌似释放不了内存。这个地方还有其它方法可以释放内存?
}
在C# Winfrom项目,有一个form窗体,六个Panel控件(用于放置显示监控视频图像的用户自定义控件),
还有一个timer计时器控件(设置每隔6分钟调用其它六个监控视频图像放到对应的Panel控件)
目前遇到的问题是,监控点的视频图像有的由于网络好点显示加载视频图像快点,有的由于网络不是太好加载显示视频图像慢点。
在form窗体运行一段时间后,导致这个form窗体的六个Panel控件在轮流显示相应的六个监控视频图像后,提示“存储空间不足,无法处理此命令”的报错信息。
发现在这个时间段内,电脑内存的使用率为40%至50%左右。
请问如何修改下面的代码可以解决此问题?谢谢!
附代码:
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) //创建播放监控视频的组件
{
foreach(Control ctl in pl.Controls)
{
ctl.dispose() //内存释放,不过貌似释放不了内存。这个地方还有其它方法可以释放内存?
}
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);
}
------解决思路----------------------
先确认是C盘没空间了,还是内存不足了。32位程序的内存使用有限制的。另外windows的内存使用率显示也有问题,当产生大量内存碎片时,那个使用率根本不准确。
------解决思路----------------------
foreach(Control ctl in pl.Controls)
{
PlayerMon.PlayerMon pl= ctl as PlayerMon.PlayerMon ;
找找这个pl有没有 Close关闭视频的方法。
ctl.dispose() //内存释放,不过貌似释放不了内存。这个地方还有其它方法可以释放内存?
}