PDA

View Full Version : مشکلی با Splash



saed2006
دوشنبه 21 دی 1388, 13:44 عصر
من این
http://barnamenevis.org/forum/showpost.php?p=610009&postcount=154
مقاله رو خوندم و دقیقا مثل اون عمل کردم
لود فرم اصلی برنامه من زمان بر هست
حالا مشکل اینه که Splash به محض انکه فرم اصلی لود شد مخفی میشه
چجوری باید این مشکل رو حل کنم؟

SMRAH1
دوشنبه 21 دی 1388, 13:51 عصر
سلام
توجه کنید که دستور

splashForm.Refresh();
باعث نمایش دوباره فرم میشه و باید در ابتدای Form_Load فرم اصلی حتما آورده شود (در غیر اینصورت Spalsh دیده نمیشه).در ضمن در این نمونه به محض پایان Form_Load فرم اصلی،نماشی Splash متوقف میشه.اگر می خواهید این توقف تا نمایش کامل فرم ادامه داشته باشه می تونید از دستور

Program.splashForm.Close();
رو از آخر Form_Load برداشته و رویداد Shown فرم رو بگیرد و در انتهای آن،دستور بالا رو وارد کنید
موفق باشید

saed2006
دوشنبه 21 دی 1388, 13:57 عصر
ممنون از پاسخ شما
من هم دقیقا همین کار رو کردم
یعنی پردازش زمان بری که فرم اصلی باید انجام بده رو بین
splashForm.Refresh();
و
Program.splashForm.Close();
قرار دادم اما مشکل اینه که splash مانع نمایش اولیه لود فرم نمیشه
به عبارتی به محص اجرای رویداد load فرم spalsh مخفی میشه و اون تاثیر رو دیگه نداره

SMRAH1
دوشنبه 21 دی 1388, 14:10 عصر
سلام
نا اونجایی که من می دونم،اگر شما این کد رو (همانطور که خودتان نوشتید) درست انجام داده باشید نباید «به عبارتی به محص اجرای رویداد load فرم spalsh مخفی میشه و اون تاثیر رو دیگه نداره»، اتفاق بیفته.
البته هر جای فکر می کنید که splash دیده نمیشه ،می تونید دوباره اون رو Refresh کنید.
اگر نمونه کد بگذارید،بهتر میشه بحث کرد.
موفق باشید

saed2006
دوشنبه 21 دی 1388, 14:33 عصر
من دقیقا همین کاری که گفتین رو انجام دادم
اما مشکل اینه که بعد از مخفی شدن فرم splash وقتی فرم اصلی لود میشه باز یک زمان 3 -4 ثانیه میگذره تا کامل لود بشه و این در حالی هست که فرم splash دیگه نیست
من توی فرم اصلی یک لیست ویو دارم که مقدار زیادی عکس درونش لود میشه
راه حل چیست؟
مرسی

FastCode
دوشنبه 21 دی 1388, 14:39 عصر
فرم main رو un-visible لود کنید.
splash رو با یک thread دیگر اجرا کنید.
توی splash برای تموم شدن لود فرم main صبر کنید.
splash رو ببندید.
main رو visible کنید.

AliRezaPro
دوشنبه 21 دی 1388, 18:37 عصر
از این ساده تر؟

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

Thread th = new Thread(new ThreadStart(DoSplash));
th.Start();
Thread.Sleep(3000);
th.Abort();
Thread.Sleep(1000);
}

private void DoSplash()
{
Splash sp = new Splash();
sp.ShowDialog();
}

saed2006
سه شنبه 22 دی 1388, 08:58 صبح
فرم main رو un-visible لود کنید.
splash رو با یک thread دیگر اجرا کنید.
توی splash برای تموم شدن لود فرم main صبر کنید.
splash رو ببندید.
main رو visible کنید.

سوالم کم ابتدایی هست اما چجوری visible رو تغییر بدم وقتی توی پروپرتی ها وجود نداره
وقتی هم که مینویسم this.visible=false
فرم برای لحظه ای نشون داده میشه و بعد بلا فاصله مخفی میشه

چجوری میتونم تا تموم شدن لود فرم اصلی در splash صبر کنم؟

من این کد



splashForm = new splashform();
Thread th = new Thread(new ThreadStart(splashForm.Show));
th.Start();

MainFrm m = new MainFrm();
splashForm.Refresh();

Application.Run(m);

نوشتم اما فرم splash اصلا نمایش داده نمیشه

SMRAH1
سه شنبه 22 دی 1388, 19:48 عصر
سلام
مشکل دقیقا اینه:

Thread th = new Thread(new ThreadStart(splashForm.Show));
th.Start();
درواقع اگر شما یک بار برنامه رو در حالت دیباگ اجرا می کردید،متوجه میشدید که به خط splashForm.Refresh گیر میده.چون فرم توی یک Thread دیگر اجرا شده و یک Thread دیگه می خواهد اون رو تغییر بده.برای درک این مشکل و راه حل اون مقاله ای با عنوان :

How to: Make Thread-Safe Calls to Windows Forms Controls
رو در MSDN بخون.
بهترین راه اینه که به جای استفاده از یک Thread،خوده Splash رو به شکل معمولی Show کنی. (راه های دیگه پیچیده گیداره که واردش نمیشم).یعنی:

splashForm.Show();

موفق باشی

saed2006
چهارشنبه 23 دی 1388, 09:15 صبح
ممنون از دوست عزیز SMRAH1
اما مشکل " لحظه ای نمایش دادن فرم اصلی" همچنان باقی هست
FastCode جواب سوال های منو ندادیا:لبخندساده:

saed2006
چهارشنبه 23 دی 1388, 09:49 صبح
از این ساده تر؟

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

Thread th = new Thread(new ThreadStart(DoSplash));
th.Start();
Thread.Sleep(3000);
th.Abort();
Thread.Sleep(1000);
}

private void DoSplash()
{
Splash sp = new Splash();
sp.ShowDialog();
}

همین کد رو نوشتم اما فرم splash نشون داده نمیشه

AliRezaPro
چهارشنبه 23 دی 1388, 11:07 صبح
این کد مشکلی نداره و بسیار ساده هست
پروژه رو اپ کن ببینیم چیکار کردی

FastCode
جمعه 25 دی 1388, 14:24 عصر
ممنون از دوست عزیز SMRAH1
اما مشکل " لحظه ای نمایش دادن فرم اصلی" همچنان باقی هست
FastCode جواب سوال های منو ندادیا:لبخندساده:
ببخشید که متوجه درخواستتون نشدم:خجالت:
باید قبل از ;()form.Show بنویسید: ;form.Visible=false


از این ساده تر؟
ببخشید که این و میگم ولی توی این نمونه ای که شما فرستادید splash دقیقا" چه خاصیتی داره؟

AliRezaPro
جمعه 25 دی 1388, 15:43 عصر
ببخشید که این و میگم ولی توی این نمونه ای که شما فرستادید splash دقیقا" چه خاصیتی داره؟
به نظر شما چه خاصیتی داره؟
نمیتونه فرمی به نام Splash باشه ؟!

FastCode
شنبه 26 دی 1388, 15:17 عصر
به نظر شما چه خاصیتی داره؟
نمیتونه فرمی به نام Splash باشه ؟!

منظور من این بود که از زمان نمایش splash نمی توان هیچ استفاده ی مفیدی کرد.:متفکر:

saed2006
دوشنبه 23 فروردین 1389, 13:46 عصر
اقا فرم برنامه پر از کنترل هست و لود شدنش زمان بر
فرم splash مدتی نمایش داده میشه و بعد قبل از اینکه بسته بشه نیم ثانیه فرم اصلی نمایش داده میشه و بعد splash بسته و باز نیم ثانیه طول میکشه که فرم اصلی به طور کامل لود بشه نمیشه کاری کرد که بهتر کار کنه؟





this.Visible = false;
Program.splashForm.Refresh();

پردازش زمان بر

//System.Threading.Thread.Sleep(500);

Program.splashForm.Refresh();
Program.splashForm.Close();
Program.splashForm.Dispose();
//System.Threading.Thread.Sleep(100);
this.Visible = true;

meri_rad
دوشنبه 23 فروردین 1389, 15:11 عصر
اگه فرم برا welcome مي خواي
تو program.cs كد زير رو وارد كن


namespace sample
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
try
{
frmSplash objfrmSplash = new frmSplash();
objfrmSplash.ShowDialog();
Application.Run(new mainform());
}
catch (Exception ex)
{

}
}
}
}

رو فرم splash يه تايمر بذار خصوصيت interval مقدار بده مثلا 2000 ، enable=true ، ورويداد
timer1_Tick مثل زير بنويس


private void timer1_Tick(object sender, EventArgs e)
{
timer1.Enabled = false;
this.Close();
}