PDA

View Full Version : کاهش سرعت برنامه در زمان افزودن شی به فرم



pouria_bayat
دوشنبه 16 فروردین 1395, 17:55 عصر
سلام وقت بخیر
من برای بارگذاری تمامی فایلهای موجود در یک درایو یا فولدر و نمایش اونها توی فرم برنامه از کدهای زیر استفاده کردم و تمامی روشهای Parralel و تسک های موازی رو اجرا کردم ولی مشگل اینه که اگر تعداد فایلها زیاد باشه فرم تا اتمام بارگذاری هنگ میکنه نمونه کدها رو میزارم اگر میتونید کمک کنید تا فرم برنامه کاهش سرعت نداشته باشه ممنون


private void LoadFolderAndFilesPanel()
{
new Task(() =>
{
try
{

//Load Folders
InEachPanel = (PComp.Size.Width - 30) / FixedSize.Width;
int FileCount = FolderANdFileName[CS.Value].Files.Count();
int FolderCount = FolderANdFileName[CS.Value].Folders.Count();

FLPindex = 0;
NodeCounter = 0;

var tasks = new List<Task>();

for (int i = 0; i < FolderCount; i++)
{
int Idx = i;
tasks.Add(Task.Run(() =>
{
lock (LoadPanel)
{
CreateFolderPanel(Idx);
}
}));
}

Task.WaitAll(tasks.ToArray());
tasks.Clear();

for (int i = 0; i < FileCount; i++)
{
int Idx = i;
tasks.Add(Task.Run(() =>
{
lock (LoadPanel)
{
CreateFilePanel(Idx);

}
}));
}
Task.WhenAll(tasks.ToArray());


ProgressBar.Value = 0;
}
catch (Exception ex)
{
//
}
}).Start();
}
void CreateFilePanel(int index)
{
try
{
var act = new Action(() =>
{
if (NodeCounter >= InEachPanel || FLPindex == 0)
{
FLP.Add(new FlowLayoutPanel());
FLP[FLPindex].Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windo ws.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
FLP[FLPindex].FlowDirection = FlowDirection.LeftToRight;
FLP[FLPindex].WrapContents = false;
FLP[FLPindex].BackColor = System.Drawing.Color.Transparent;
FLP[FLPindex].Size = new Size(PComp.Size.Width - 30, FixedSize.Height + 9);
FLPindex++;
NodeCounter = 0;

MLP.Controls.Add(FLP[FLPindex - 1]);
MLP.Refresh();

}
if ((FolderANdFileName[CS.Value].FilesIsHidden[index].CompareTo(true) == 0 && CHBHiddenFilesAndFolders.Checked) || FolderANdFileName[CS.Value].FilesIsHidden[index].CompareTo(false) == 0)
{
FlowLayoutPanel SubFLP = new FlowLayoutPanel();
SubFLP.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windo ws.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
SubFLP.Name = " SubFLP" + index.ToString();
SubFLP.Size = FixedSize;
SubFLP.FlowDirection = FlowDirection.TopDown;
SubFLP.WrapContents = false;
SubFLP.Tag = index;
SubFLP.BackColor = System.Drawing.Color.Transparent;
//
PictureBox PBox = new PictureBox();
PBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windo ws.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
PBox.Enabled = true;
PBox.Name = FolderANdFileName[CS.Value].Files[index];
PBox.Tag = SubFLP;
PBox.AutoSize = true;
string[] RetExtenstion = FolderANdFileName[CS.Value].Files[index].Split('.');
if (RetExtenstion != null)
{
if (ImgLst.Images.Keys.Contains(RetExtenstion[RetExtenstion.Count() - 1] + ".png"))
{
PBox.Image = ImgLst.Images[RetExtenstion[RetExtenstion.Count() - 1] + ".png"];
}
else
PBox.Image = ImgLst.Images["blank.png"];
}
else
PBox.Image = ImgLst.Images["blank.png"];
PBox.Cursor = Cursors.Hand;
PBox.Click += new System.EventHandler(PBoxFile_Click);
PBox.MouseHover += PBox_MouseHover;
PBox.MouseLeave += PBox_MouseLeave;
var Margin = PBox.Margin;
int LeftMargin = ((FixedSize.Width - ImgLst.ImageSize.Width) / 2) - 2;
PBox.Margin = new System.Windows.Forms.Padding(LeftMargin, Margin.Top, Margin.Right, Margin.Bottom);
PBox.BackColor = Color.Transparent;
SubFLP.Controls.Add(PBox);

Label lblFileName = new Label();
lblFileName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windo ws.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
lblFileName.Enabled = true;
lblFileName.BackColor = Color.Transparent;
lblFileName.Size = new System.Drawing.Size(FixedSize.Width - 5, 25);
lblFileName.TabIndex = 0;
lblFileName.Name = FolderANdFileName[CS.Value].Files[index];
lblFileName.Text = FolderANdFileName[CS.Value].Files[index];
lblFileName.Tag = SubFLP;
lblFileName.Cursor = Cursors.Hand;
lblFileName.Click += lblFile_Click;
lblFileName.MouseHover += lbl_MouseHover;
lblFileName.MouseLeave += lbl_MouseLeave;
lblFileName.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
System.Windows.Forms.ToolTip TT = new System.Windows.Forms.ToolTip();
TT.SetToolTip(lblFileName, FolderANdFileName[CS.Value].Files[index]);
SubFLP.Controls.Add(lblFileName);

FLP[FLPindex - 1].Controls.Add(SubFLP);
FLP[FLPindex - 1].Refresh();
NodeCounter++;

}
});
if (InvokeRequired)
BeginInvoke(act);
else
act();
}
catch (Exception ex)
{
//
}
}

reza_ali202000
دوشنبه 16 فروردین 1395, 19:11 عصر
سلام دوست عزیز
تعداد تسک هایی که میسازی خیلی خیلی زیاد میشه و این یعنی تکه تکه شدن رم و توان رم کاهش پیدا میکنه.
هر حلقه رو به مثلا 5 تا حلقه بشکن و خود حلقه رو بزار توی تسک. اینجوری نهایتا 5 تسک با کارایی بالاتری ایجاد میشه.
نکته دوم اینکه زمانی که کل تسک ها تمام شد اونوقت عکسها رو توی پنلت ست کن. اینجوری که نوشتید خیلی خیلی روی سیستم و رم فشار میاد و بهترین راه خلاصی ویندوز از این موارد هنگ کردن هست.
کاش لاقل قسمتی که مربوطه مال برنامتون رو گذاشته بودید تا بتونینم روش کار کنیم

pouria_bayat
سه شنبه 17 فروردین 1395, 03:39 صبح
ممنون یکی از دوستان راهنمایی خوبی کرد گفت برای افزایش سرعت از Treeview آستفاده کنم ، چک کردم خیلی خوب جواب