PDA

View Full Version : کند بودن برنامه با 39 فرم



bahar_engineer
پنج شنبه 09 مهر 1388, 10:29 صبح
سلام

من یه برنامه ساختم که در کل 39 تا فرم داره ... و این فرم ها اکثرشون عکس بک گراند دارند که باید کیفیت بالایی هم داشته باشه . این برنامه قراره وارد بازار بشه اما الان حجمش خیلی بالاست

مشکلی از نظر حجم برای رایت نیست فقط اینکه این حجم باعث می شه دیر بالا بیاد و موقع عوض شدن صفحات در اونجایی که صفحه parent مخفی می شه (hidden) تا صفحه فرزند بالا بیاد در این میان حدود 1 ثانیه ای صفحه ویندوز نشون داده می شه ... یعنی صفحه برنامه ای که در حال اجراست غیر از برنامه من..

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

آیا به نظر شما غیر استاندارده این همه فرم ؟
آیا چنین نرم افزارهایی همگی سرعت پایینی دارند؟

چه اقدامی می شه انجام داد تا سرعت برنامه بهتر بشه ؟

در ضمن یکی از صفحات از 16 عکس با ابعاد کوچک با فرمت gif تشکیل شده که همگی متحرک هستند ... این صفحه هم عکس بک گراند داره ... زمانی که این عکس بک گراند هست تعدادی از عکس های gif نمایش داده نمی شن... اما زمانی که این عکس رو حذف کنم همه gif animator ها نمایش داده می شن

یعنی نمی شه از چنین عکس هایی در صفحات استفاده کرد؟

در ضمن همین صفحه اگه داخلش روی یه باتن که فعال هست یعنی عملیات خاصی رو انجام می ده کلیک کنم سریع همه gif animator ها ظاهر می شن ... دلیلش چیه؟

ممنون می شم راهنمایی کنین

bahar_engineer
شنبه 11 مهر 1388, 09:24 صبح
کسی نمی دونه مشکل از کجاست؟

یه صفحه که شامل 15-16 تا gif animator می شه و این صفحه بدون هیچ گونه کدی ...

وقتی عکس بک گراند داره فقط تعدادی از gif animator ها رو نمایش می ده

اما وقتی عکس بک گراند نداره همه رو نمایش می ده


فکر می کردم به خاطر حجمشه ... اما اگه شما 20 تا gif animator دیگه هم به صفحه اضافه کنین باز در حالت نداشتن عکس بک گراند همه رو نمایش می ده اما وقتی عکس بک گراند برای فرم بذارم فقط تعدادی از gif ها نمایش داده می شن

Parham.D
شنبه 11 مهر 1388, 12:01 عصر
1. استاندارد بودن یا نبودن بستگی به نوع و کاری است که نرم افزار شما انجام میده. Photoshop و AutoCad هم به کندی لود میشن اما استاندارد هستند.
2. کند بودن برنامه شما بستگی به کاری است که انجام میدهد، نوع کد نویسی و سخت افزار مورد نیازش است. پس باز هم بستگی داره. گمانم باید بیشتر توضیح بدید.
3. کارهای مختلفی میشه انجام داد تا برنامه سریعتر انجام بشه. از جمله اینکه برنامه اصلی که فایل EXE اجرا کننده است را سبکتر کنید و برنامه را بین برنامه‏های کوچکتر و Dll ها تقسیم کنید. با کد نویسی دقیق تر شما میتونی تعداد فرم ها را کمتر کنید و مثلا به صورت RunTime بسازید. من از جزئیات برنامه شما خبر ندارم. کارهای زیادی میشه انجام داد، حتی میشه مقدار بیشتری از کار کرد CPU , RAM را به برنامه اختصاص داد. به هر حال برنامه‏ای با این همه فرم منطقی به نظر نمیرسه و احتمالا بعد از انتشار برای پشتیبانی هم گرفتاریهای زیادی دارید، چون که احتمال بروز خطا بیشتر میشه.
4. مشکل صفحه Gif دار را باید دید. این فرم را قرار دهید تا بررسی بشه.

ali_md110
شنبه 11 مهر 1388, 13:21 عصر
توی دات نت زیاد بودن فرم های شما باعث کندی برنامه نمیشه چون تازمانی یک کد یا یک فرم صدا زده نشه اون فرم هم فضایی رو اشغال نمیکنه من فکر کنم مشکل از جای دیگه برنامتون باشه ممکنه مشکل بهینه سازی فضای برنامه باشه یا منابع اشیائتون رو آزاد نمیکنید
عکس gif رو توی چه کنترلی نمایش میدید و ایا از کامپوننت خاصی استفاده میکنید ؟
میتونید از کانتینرها توی فرمتون استفاده کنید

bahar_engineer
شنبه 11 مهر 1388, 17:38 عصر
ممنون از همگی

در مورد اون gif animator ها توی فرمم یک خاصیت به نام double buffered بود که اونو true کردم

مشکلش حل شد

اما در مورد فرم ها :

این نرم افزار یه برنامه کودکان هست که شامل صفحات زیادیه ... موزیک ، نقاشی ، سرگرمی ، داستان ، انواع آموزش ها ، قرآن و...

که هر کدوم مجزا هستند و نمی شه فرم ها رو از این کمتر کرد.

اما در مورد آزاد کردن فضای اشیاء ، من در برنامه اصلا از دستور dispose استفاده نکردم ... اما هر بار تنها یک فرم توی صفحه باز می شه البته بعضی از فرم های پدر هیدن می شن.

و بعد از اتمام کار با اون فرم ، فرم جاری بسته می شه با دستور close ... اینطوری مگه فضاش آزاد نمی شه ؟

آیا هنوزم باید dispose کنم؟

اگه اینطوره لطفا راهنمایی کنین چون خیلی مهمه

سار
شنبه 11 مهر 1388, 22:03 عصر
کد نمونه یکی دو تا از فرمهات رو اینجا بنویس.

cimiarnm
شنبه 11 مهر 1388, 22:40 عصر
دوست عزیز سلام
موردی که به ذهنم رسید و شاید مشکل گشای باشد این است که حجم عکسهای بکگراند شما چقدر است؟
فرض کنید عکس شما 800*600 باشد در حالی که فرم شما 100*200 است . این یعنی سربار اضافی بر روی برنامه. اگر اینطور است شما میتواند با کمک نرم افزار های ادیت تصویر اندازه تصاویر را با حفظ کیفیت آنها در ابعاد فرمها درآورید تا حجم برنامه کاهش یابد . یک راه حل دیگر این است که بکگراند فرم های خود را نه در حالت طراحی بلکه به کمک کد نویسی تعریف کنید و تصاویر را نه در سورس برنامه بلکه در یک پوشه جدا ذخیره نمائید که در هنگام نمایش فرم لود شوند . با اینکار حجم برنامه شما فوق العاده کاهش میباید

bahar_engineer
یک شنبه 12 مهر 1388, 09:43 صبح
فرم های من همه 1024*768 هستند و عکس های بک گراند هم همین سایزند . اون فعلا مشکلش حل شده مگر اینکه موقع اجرا از طریق فایل exe دوباره بخواد مشکل داشته باشه . چون ظاهرا از بافری دوبرابر بقیه استفاده می کنه

در مورد کد فرم ها :

یک نمونه : عکس ها ضمیمه هست

مثلا در اینجا فرم game فرم پدر هست و فرم playgame فرزند که موقعی که روی یکی از بازی های فرم game کلیک بشه فرم game پنهان می شه و فرم playgame باز می شه ... از الگوی سینگلتون استفاده کردم ...

کد فرم game


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace childfriend
{
public partial class game : Form
{
private playgame play;

public game()
{
InitializeComponent();
}

private void pictureBox4_Click(object sender, EventArgs e)
{
this.Hide();
play = GenericSingleton<playgame>.GetInstance();
play.game = "Fishing";
play.Tag = this;
play.ShowDialog();
}

private void pictureBox3_Click(object sender, EventArgs e)
{
this.Hide();
play = GenericSingleton<playgame>.GetInstance();
play.game = "Panic Pro!";
play.Tag = this;
play.ShowDialog();
}

private void pictureBox2_Click(object sender, EventArgs e)
{
this.Hide();
play = GenericSingleton<playgame>.GetInstance();
play.game = "Monkey lander";
play.Tag = this;
play.ShowDialog();
}

private void pictureBox1_Click(object sender, EventArgs e)
{
this.Hide();
play = GenericSingleton<playgame>.GetInstance();
play.game = "Zed";
play.Tag = this;
play.ShowDialog();
}

private void pictureBox5_Click(object sender, EventArgs e)
{
this.Hide();
play = GenericSingleton<playgame>.GetInstance();
play.game = "The Penalty Challenge";
play.Tag = this;
play.ShowDialog();
}

private void pictureBox6_Click(object sender, EventArgs e)
{
this.Hide();
play = GenericSingleton<playgame>.GetInstance();
play.game = "V-Force";
play.Tag = this;
play.ShowDialog();
}

private void pictureBox7_Click(object sender, EventArgs e)
{
this.Hide();
play = GenericSingleton<playgame>.GetInstance();
play.game = "Worm Food";
play.Tag = this;
play.ShowDialog();
}

private void pictureBox8_Click(object sender, EventArgs e)
{
this.Hide();
play = GenericSingleton<playgame>.GetInstance();
play.game = "River Kayak";
play.Tag = this;
play.ShowDialog();
}

private void button1_Click(object sender, EventArgs e)
{
this.Close();
}

//don't let close form with ALT+F4
protected override System.Boolean ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
if ((msg.Msg == 0x104) && (((int)msg.LParam) == 0x203e0001))
return true;
return false;
}
}
}



کد فرم plagegame :


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace childfriend
{
public partial class playgame : Form
{
public string game;
public playgame()
{
InitializeComponent();
}

private void playgame_Load(object sender, EventArgs e)
{
axShockwaveFlash1.Movie = Application.StartupPath + @"\flash\kidsgame\" + game + ".swf";
}

private void button1_Click(object sender, EventArgs e)
{
this.Close();
foreach (Form MyGame in Application.OpenForms)
{
if (MyGame is game)
Application.OpenForms["game"].Show();
}
}

//don't let close form with ALT+F4
protected override System.Boolean ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
if ((msg.Msg == 0x104) && (((int)msg.LParam) == 0x203e0001))
return true;
return false;
}
}
}



ممنون از توجهتون

سار
یک شنبه 12 مهر 1388, 09:55 صبح
این عکسهاچیزی نیست که کند کنه برنامه تو رو.تو کد هات هم چیز خاصی نبود. ببینم در زمان طراحی چیزی روی فرمت داری؟ کامپوننت خاصی، اتصال به بانکی یا یه همچین چیزهایی.
بعد یه نکته دیگه. چه زمانی برنامه کند میشه. موقعی که Exe رو اجرا میکنی یا زمانی که یک فرم رو باز می کنی. ایا بار دوم هم که این کار رو میکنی باز هم کند هست؟

bahar_engineer
یک شنبه 12 مهر 1388, 10:35 صبح
جناب سار سوء تفاهم پیش اومده

اون قضیه عکس ها منتفیه

الان سوال بخش دیگه پست اول این تاپیک بود که 39 تا فرم که دارم ... وقتی یه فرم پدر هیدن می شه تا بیاد فرم فرزند باز بشه صفحه ویندوز و نشون می ده ... یعنی یه تاخیر در این تغییر فرم وجود داره

و در ضمن فرم اصلی برنامه که همیشه باز هست رو نشون نمی ده بلکه فرم ویندوز یا برنامه ای که در کنار برنامه من بازه رو در این بین نمایش می ده

مشکل الان اینجاست.

در ضمن این کدها ساده ترین فرم برنامه من بود ... من 3 تا بانک دارم ... کلی عکس و کامپوننت

البته این کندی ربطی به کامپوننت فکر نمی کنم داشته باشه چون توی همین دو فرم ساده هم که گذاشتم هنوز این تاخیر وجود داره

... نمی دونم دلیلش چیه ... فرم پدر که پنهان می شه ... تا بیاد فرم فرزند باز بشه طول می کشه که در این میان صفحه ای از یک برنامه دیگر روی ویندوز، در صفحه نمایش داده می شه. این تغییر فرم بصورت موازی انجام نمی شه ...

در ضمن من این کدها رو گذاشتم که بهم بگین dispose نمی کنم آیا در چنین کدهایی هنوز نیاز به dispose کردن هست یا نه ؟

چون اگه این همه فرم فضاشون آزاد نشه که کاملا نرم افزار غیر کاربردی خواهد بود.