PDA

View Full Version : دیر لود شدن فرم



m_karimi
چهارشنبه 03 آبان 1396, 20:47 عصر
با سلام
من بعضی فرمهایی که طراحی کردم هنگام اجرا به کندی لود می شود. از چند tablelayout در فرم استفاده کردم. میخواستم ببینم برای بالا رفتن سرعت لود فرم چه راهکارهایی وجود دارد؟

danialafshari
جمعه 05 آبان 1396, 00:43 صبح
با سلام
tablelayout بخاطر autosize ی که روی آبجکت های درونش انجام میشه کمی سرعت و کند می کنه ولی آنقدر نیست که اذیت کند مشکلتون بیشتر object هایی و کدهایی است که در هنگام load وارد کردید
به هر حال روش زیر کمک کنندس
در فرم خاصیت DoubleBuffered رو برابر True قرار بدید
و این کد رو هم هم طبق فرم برنامتون بزارید

public static void SetDoubleBuffered(System.Windows.Forms.Control c)
{
if (System.Windows.Forms.SystemInformation.TerminalSe rverSession)
return;
System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control).GetProperty("DoubleBuffered",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
aProp.SetValue(c, true, null);
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}

private void Form1_Load(object sender, EventArgs e)
{
SetDoubleBuffered(tableLayoutPanel1);
}

موفق باشید

m_karimi
جمعه 05 آبان 1396, 00:52 صبح
با سلام
tablelayout بخاطر autosize ی که روی آبجکت های درونش انجام میشه کمی سرعت و کند می کنه ولی آنقدر نیست که اذیت کند مشکلتون بیشتر object هایی و کدهایی است که در هنگام load وارد کردید
به هر حال روش زیر کمک کنندس
در فرم خاصیت DoubleBuffered رو برابر True قرار بدید
و این کد رو هم هم طبق فرم برنامتون بزارید

public static void SetDoubleBuffered(System.Windows.Forms.Control c)
{
if (System.Windows.Forms.SystemInformation.TerminalSe rverSession)
return;
System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control).GetProperty("DoubleBuffered",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
aProp.SetValue(c, true, null);
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}

private void Form1_Load(object sender, EventArgs e)
{
SetDoubleBuffered(tableLayoutPanel1);
}

موفق باشید

میشه در مورد autosize ای که فرمودید tablelayout روی آبجکت های درونش انجام میدهد توضیح بیشتری دهید؟

danialafshari
جمعه 05 آبان 1396, 01:00 صبح
میشه در مورد autosize ای که فرمودید tablelayout روی آبجکت های درونش انجام میدهد توضیح بیشتری دهید؟
منظورم اینه که وقتی dock ش رو روی Fill قرار بدید با توجه به اندازه فرم سایزش تغییر میکنه

m_karimi
جمعه 05 آبان 1396, 22:13 عصر
با تشکر از پاسخ بسیار خوبتان. فرمها به سرعت لود می شوند. من فقط برای کنترلهای tablelayout گذاشتم. ولی یه مشکلی که به وجود امد دکمه های برنامه ام وقتی با موس می روم روی انها با تاخیر کلیک می شود. یعنی یک مقدار موس را باید روی کنترل نگه دارم تا عمل کند. مشکل بعدی این است که وقتی فرم لود میشود یه لحظه اول کل صفحه به مدت یک ثانیه مشکی می شود بعد فرم بالا می اید.

danialafshari
شنبه 06 آبان 1396, 13:24 عصر
با سلام
بدون بررسی کردن پروژه بیشتر از این نمیشه راهنمایی کرد
یک توصیه دیگه اینه که یک خروجی بگیرید و پوشه Debug رو روی یک سیستم دیگه تست کنید
یک نمونه اینجا بزارید تا بهتر بشه بررسی کرد
موفق باشید

m_karimi
شنبه 06 آبان 1396, 19:00 عصر
با سلام
بدون بررسی کردن پروژه بیشتر از این نمیشه راهنمایی کرد
یک توصیه دیگه اینه که یک خروجی بگیرید و پوشه Debug رو روی یک سیستم دیگه تست کنید
یک نمونه اینجا بزارید تا بهتر بشه بررسی کرد
موفق باشید

این قطعه را حذف کردم مشکل سیاهی برطرف شد ولی وقتی آن کد بود سرعت خیلی بهتر و بالاتر بود ولی مشکل سیاهی داشت
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
این cp.ExStyle دیگر مقادیر آن چیست. نمیشه مقدارهای دیگه داد به ان؟

لینک زیر هم همین مشکل من رو داشتند
http://www.c-sharpcorner.com/forums/how-to-avoid-flicker-on-form-load

danialafshari
یک شنبه 07 آبان 1396, 00:56 صبح
با سلام
این دفعه DoubleBuffered فرم رو روی False قرار بدید
در فضای General (بالای فرم):

int intOriginalExStyle = -1;
bool bEnableAntiFlicker = true;

سازنده(Constructor) رو بشکل زیر تغییر بدید:

public Form1()
{
ToggleAntiFlicker(false);
InitializeComponent();
this.ResizeBegin += new EventHandler(Form1_ResizeBegin);
this.ResizeEnd += new EventHandler(Form1_ResizeEnd);
}

این متدها رو اضافه کنید:

private void ToggleAntiFlicker(bool Enable)
{
bEnableAntiFlicker = Enable;
this.MaximizeBox = true;
}
protected override CreateParams CreateParams
{
get
{
if (intOriginalExStyle == -1)
{
intOriginalExStyle = base.CreateParams.ExStyle;
}
CreateParams cp = base.CreateParams;

if (bEnableAntiFlicker)
{
cp.ExStyle |= 0x02000000; //WS_EX_COMPOSITED
}
else
{
cp.ExStyle = intOriginalExStyle;
}

return cp;
}
}

کد زیر رو در اونت ResizeBegin

ToggleAntiFlicker(true);

و این رو در ResizeEnd قرار بدید

ToggleAntiFlicker(true);

باز هم میگم بیشتر ممکنه مربوط به کدهای Load تون باشه
موفق باشید

parsianmajid
پنج شنبه 29 شهریور 1397, 13:07 عصر
میشه در مورد autosize ای که فرمودید tablelayout روی آبجکت های درونش انجام میدهد توضیح بیشتری دهید؟


سلام
فقط کافیه بالای فرم مادر کد زیر را قرار دهیدمشکل کندی سرعت حل خواهد شد


namespace NameProject
}
public partial class FRM_Main : Form
}
protected override CreateParams CreateParams

}
get
}
;CreateParams cp = base.CreateParams
;cp.ExStyle |= 0x02000000
;return cp
{
{
{

ahmadreza517
شنبه 31 شهریور 1397, 14:45 عصر
سلام
داخل رویداد load کد نوشتید زیاده ؟ اگه اینطوره برای بالا بردن سرعت دستورات داخل load فرم را داخل یک تابع قرار بدین و بصورت نامتقارن در یک thread صداش بزنید.