PDA

View Full Version : سوال: خطای Out Of memory



mehran788
شنبه 04 مهر 1394, 05:50 صبح
سلام. خسته نباشید
من یه برنامه نوشتم و از اون Setup ساختم و روی سیستم نصب کردم و داشتم ازش استفاده می کردم. ولی به مرور که حجم داده برنامه بالا رفت گاهی خطای Out Of Memory می داد و از برنامه خارج می شد تا اینکه الان دیگه برنامه رو که اجرا می کنم این خطا رو میده. من Form_Load اومدم داده هام رو از بانک فراخوانی کردم و با کنترل های رانتایم به رو فرمم انداختم. الان نمیدونم مشکل از کجاست حتی خواستم از خود ویژوال استودیو برای خطایابی استفاده کنم که تو اون لحظه از برنامه خارج میشه و نشون نمیده خطا مال کدوم خطه. لطفا کمک کنین چطوری خطایابی کنم؟ ممنون
اینم کد Form_Load:
if (lbtype.Text == "Contact") lbname.Text = "Contact Name";
if (lbtype.Text == "Type1")
lbname.Text = "Type1 ID";
if (lbtype.Text == "Type2")
lbname.Text = "Type2 ID";
if (lbtype.Text == "All")
lbname.Text = "All";
SqlCommand com = new SqlCommand();
SqlConnection con=new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\mydata.mdf;Integrated Security=True;User Instance=True");
com.Connection = con;
SqlDataReader dr;
if (lbname.Text == "Type2 ID")
com.CommandText = "select * from tblcontacts where Type='Type2'";
if (lbname.Text == "Contact Name")
com.CommandText = "select * from tblcontacts where Type='Contact'";
if (lbname.Text == "Type1 ID")
com.CommandText = "select * from tblcontacts where Type='Type1'";
if (lbname.Text == "All")
com.CommandText = "select * from tblcontacts";
con.Open();
dr = com.ExecuteReader();
string path = @"D:\Userpics";
int read = 0;
int readnum = 1;
while (dr.Read())
{
Panel pnl = new Panel();
pnl.Location = new Point(10, read + 10);
pnl.Width=355;pnl.Height=60;
pnl.BackColor = Color.IndianRed;
pnl.Name = "Panel" + Convert.ToString(readnum);
pnl.Tag = readnum;
panelmain.Controls.Add(pnl);
read = read + 70;
pnl.Click += new EventHandler(pnl_Click);
pnl.MouseMove+=new MouseEventHandler(pnl_MouseMove);
Label lb = new Label();
lb.Text = dr["Code"].ToString();
lb.Width = 10; lb.Height = 10;
lb.Location = new Point(10, 10);
lb.Visible = false;
pnl.Controls.Add(lb);
lb.Name = "lbcode" + Convert.ToString(readnum);
PictureBox pcb = new PictureBox();
pcb.SizeMode = PictureBoxSizeMode.Zoom;
pcb.Width = 50; pcb.Height = 50;
pcb.Location=new Point(5,5);
pnl.Controls.Add(pcb);
pcb.Image = Image.FromFile(path + @"\" + dr["Picture"].ToString());
pcb.Name = "pcb" + Convert.ToString(readnum);
pcb.Tag = readnum;
pcb.Click +=new EventHandler(pcb_Click);
pcb.MouseMove+=new MouseEventHandler(pcb_MouseMove);
TableLayoutPanel tlp = new TableLayoutPanel();
tlp.Name = "tlp" + Convert.ToString(readnum);
tlp.Tag = readnum;
tlp.RowCount = 1; tlp.ColumnCount = 3;
tlp.ColumnStyles.Add(new ColumnStyle(SizeType.Percent,0));
tlp.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
tlp.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
tlp.RowStyles.Add(new RowStyle(SizeType.Absolute, 50));
tlp.Controls.Add(new Label() { Text = dr["Name"].ToString() }, 1, 0);
tlp.Location = new Point(60, 20);
tlp.Click += new EventHandler(tlp_Click);
tlp.MouseMove+=new MouseEventHandler(tlp_MouseMove);
pnl.Controls.Add(tlp);
PictureBox pcb1 = new PictureBox();
pcb1.SizeMode = PictureBoxSizeMode.Zoom;
pcb1.Name = "pcblogo" + Convert.ToString(readnum);
pcb1.Tag = readnum;
pcb1.Width = 50; pcb.Height = 50;
pcb1.Location = new Point(300, 5);
if (dr["Type"].ToString() == "Type2")
pcb1.Image = Properties.Resources.Type2;
if (dr["Type"].ToString() == "Contact")
pcb1.Image = Properties.Resources.Contact;
if (dr["Type"].ToString() == "Type1")
pcb1.Image = Properties.Resources.Type1;
pcb1.Click +=new EventHandler(pcb1_Click);
pcb1.MouseMove+=new MouseEventHandler(pcb1_MouseMove);
pnl.Controls.Add(pcb1);
readnum++;

Felony
شنبه 04 مهر 1394, 10:50 صبح
این یعنی چی ؟!


if (lbname.Text == "Type2 ID")
com.CommandText = "select * from tblcontacts where Type='Type2'";
if (lbname.Text == "Contact Name")
com.CommandText = "select * from tblcontacts where Type='Contact'";
if (lbname.Text == "Type1 ID")
com.CommandText = "select * from tblcontacts where Type='Type1'";
if (lbname.Text == "All")
com.CommandText = "select * from tblcontacts";


تعداد رکوردها چنداست ؟
اگر 50 میلیون رکورد هم تو دیتابیس باشه همین کارو باهاش میکنی ؟!

داده ها رو صفحه بندی کنید و به صورت n تا n تا به کاربر نمایش بدید .

mehran788
شنبه 04 مهر 1394, 15:22 عصر
این کد که به خاطر تنظیم SQL Command هست و فقط یکبار اجرا میشه.
این خطا بخاطر چی پیش میاد؟ بخاطر اینکه داده ها رو نو کنترل رانتایم قرار می دم؟
چون الان که 88 تا رکورد ثبت کردم رسما از کار افتاده. به غیر از صفحه بندی چه کاری می تونم بکم که بهتر باشه؟ ممنون

i-mahdi
شنبه 04 مهر 1394, 15:28 عصر
دوست عزیز شما تصاویر رو هم از بانک می گیرید ؟

mehran788
شنبه 04 مهر 1394, 15:56 عصر
نه فقط اسم عکس رو از بانک میگیرم و بعد از آدرسی که مشخصه فراخوانی می کنم

hamid_hr
شنبه 04 مهر 1394, 16:57 عصر
حجم هر کدوم از عکسات تقریبا چقدر هست؟

mehran788
شنبه 04 مهر 1394, 21:24 عصر
مثل یه عکس معمولی دیگه تقریبا بیشتر از 1 مگ
الان سوالم اینه: وقتی یک عکس رو به Picturebox قرار می دی وارد حافظه رم می شه حالا اگه ما با کد pictbox.Image = null; این عکس رو از روی Picturebox برداریم بازم رم خالی نمیشه. چیکار کنیم عکس مورد نظر از رم هم پاک بشه و فضا آزاد کنه؟
ممنون

mehran788
شنبه 04 مهر 1394, 22:50 عصر
سلام. خسته نباشید
من تو برنامه ای که نوشتم تمام اطلاعات رو توسط کنترل های رانتایم تو فرم نشون می دم که برای هر رکورد یه عکس وجود داره که این باعث میشه خیلی زود حافظه پر بشه و خطا بده.
مشکل اینجاست وقتی به Picturebox هایی که دارم عکسی رو قرار می دم بعد از اینکه اون picturebox رو null می کنم باز حافظه آزاد نمیشه. چیکار باید بکنم؟ ممنون

ASKaffash
یک شنبه 05 مهر 1394, 07:38 صبح
سلام
خوب طبیعی است شما درون یک حلقه در Runtime دارید پانل و درون پانل تعدادی کنترل و به خصوص عکس add می کنید که از یک بانک دریافت میکنید این یعنی استفاده از منابع برای ایجاد object های زیاد در حافظه باید روش را عوض کنید که مدیریت منابع صورت گیرد مثلا از یک گرید استفاده شود (البته اگر مقدور باشد)

jamal_ch
یک شنبه 05 مهر 1394, 07:57 صبح
سلام
به نظر من بهترین روش استفاده از گرید است چرا از گرید استفاده نکردی مشکل کجاست ؟
بگید شاید بشه راهنمایی کرد

mehran788
یک شنبه 05 مهر 1394, 14:55 عصر
خوب اینجوری به نظرم ظاهر بهتری داره.
احتمالا باید راهی باشه که اینطوری هم انجامش داد