PDA

View Full Version : سوال: اجرای همزمان 2 فرم



NasimBamdad
شنبه 13 خرداد 1391, 18:05 عصر
سلام .

من نیاز دارم که 2 فرم رو همزمان اجرا کنم ،

ما Form1 رو دارم و Form2 . من می خواهم هر 2 تا فرم همزمان اجرا بشوند ، اما اول Form1 نمایش داده بشه و بعد از 10 ثانیه Form1 بسته بشه و Form2 نمایش داده بشه .

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

آیا این کار درست هست و بهینه ؟ اگه نه لطفا روش دیگری بفرمایید .

در واقع اگه دیده باشید ، نرم افزار ها مثل Photoshop و یا Microsoft Word همچین چیزی دارند که میاد یک صفحه نمایشی و زیبا دارند که Loading داره و بعد از اتمام لودینگ برنامه اجرا میشه ، این طوری کاربر خسته نمیشه و مطمئن هست که نرم افزار رو اجرا کرده .

ممنون میشم کمک کنید

tooraj_azizi_1035
شنبه 13 خرداد 1391, 18:28 عصر
سلام
باید از کلاس ApplicationContext استفاده کنید.
لینک خود سایت: http://barnamenevis.org/showthread.php?283451-مشکل-در-لود-اولیه-فرم&highlight=ApplicationContext
لینک مایکروسافت: http://msdn.microsoft.com/en-us/library/system.windows.forms.applicationcontext.aspx

NasimBamdad
شنبه 13 خرداد 1391, 18:32 عصر
سلام
باید از کلاس ApplicationContext استفاده کنید.
لینک خود سایت: http://barnamenevis.org/showthread.php?283451-مشکل-در-لود-اولیه-فرم&highlight=ApplicationContext
لینک مایکروسافت: http://msdn.microsoft.com/en-us/library/system.windows.forms.applicationcontext.aspx

خیلی سخته :D .

باید امشب تا صبح نخوابم ببینم این چیه ! :D مرسی عزیزم !

NasimBamdad
شنبه 13 خرداد 1391, 18:32 عصر
کد ساده تری نداری ؟ :D ما مخمون در این حد نیست

tooraj_azizi_1035
شنبه 13 خرداد 1391, 18:43 عصر
کجاشو نمی فهمی؟
راهی به جز استفاده از این کلاس نیست.

hunter_ara
شنبه 13 خرداد 1391, 18:57 عصر
کد ساده تری نداری ؟ :D ما مخمون در این حد نیست

اینجا (http://www.codeproject.com/Articles/37886/Yet-Another-Splash-Screen-in-C) رو ببینید

en.reza
شنبه 13 خرداد 1391, 19:05 عصر
سلام
توی فایل Program تغییرات رو انجام بده

Application.Run(new From1());
Application.Run(new From2());

NasimBamdad
شنبه 13 خرداد 1391, 19:34 عصر
سلام
توی فایل Program تغییرات رو انجام بده

Application.Run(new From1());
Application.Run(new From2());

این کار میاد From1 رو اجرا می کنه و بعد هم Form2 . اما این 2 تا فرم نباید همزمان نمایش داده بشوند . قابلیت HIDING لازم هست .

en.reza
یک شنبه 14 خرداد 1391, 18:31 عصر
منظورت رو دقیق بگو
گفته بودی اجرای همزمان 2 فرم، خب این دستورات هم دوتا فرم رو با هم اجرا میکنه
اگه هم می خواهی بینشون وقفه بذار که بحث جداست

tooraj_azizi_1035
یک شنبه 14 خرداد 1391, 18:48 عصر
منظورشو دقیق گفت.

کجای کد لینکی که گذاشتم مبهمه؟؟؟؟؟؟؟؟؟؟؟؟؟

Miladkt.S.A.o
یک شنبه 14 خرداد 1391, 18:57 عصر
دوس عزیز سلام
کار ساده ای است
کافی است که در form1
یک تایمر ایجاد کنیدو خاصیت Enable
ان را true کرده و در interval ان عدد 100
را وارد کنید
سپس روی ایکن تایمر که در صفحه ایجاد میشود دبل کلیک کنید
در این صورت قسمت timer1_Tick باز میشود و در انجا کافی است وارد کنید

Form2 frm_obj=new Form2();
this.Hide();
frm_obj.showDialog();
this.Close();
timer1.Enabeld=false;

موفق باشید

tooraj_azizi_1035
یک شنبه 14 خرداد 1391, 19:05 عصر
جناب Miladkt.S.A.o (http://barnamenevis.org/member.php?244634-Miladkt.S.A.o)

this.Close باعث میشه برنامه کلاً بسته بشه و Thread جاری کارش رو تموم می کنه و کنترل به سیستم عامل داده می شه.
مایکروسافت کلاس ApplicationContext رو برای همین منظور (نمایش چندین فرم) در دات نت اضافه کرده. نمی دونم چرا دوستی که سوال کرد کدی که گذاشتم روی آزمایش نمی کنه و حتی نمی گه کجای این کد براش مبهمه!

Miladkt.S.A.o
یک شنبه 14 خرداد 1391, 19:13 عصر
جناب Miladkt.S.A.o (http://barnamenevis.org/member.php?244634-Miladkt.S.A.o)

this.Close باعث میشه برنامه کلاً بسته بشه و Thread جاری کارش رو تموم می کنه و کنترل به سیستم عامل داده می شه.
مایکروسافت کلاس ApplicationContext رو برای همین منظور (نمایش چندین فرم) در دات نت اضافه کرده. نمی دونم چرا دوستی که سوال کرد کدی که گذاشتم روی آزمایش نمی کنه و حتی نمی گه کجای این کد براش مبهمه!


سلام دوست عزیزم
شما بالای کد را مگر نخواندید!
ابتدا کد hide می شود
سپس فرم جدید باز شده و
بعد فرم قبلی closeمی شود
من خودم این کد را بارها و بارها اجرا کرده ام.

harani
دوشنبه 15 خرداد 1391, 11:58 صبح
به نظرم سوال خیلی راحتی پرسیدی در کافیست از یک کنترل تایمر استفاده کنیم (خاصیت interval را برابر 1000 که نماد ثانیه است و خاصیت Enable این کنترل را برابر true قرار میدهیم) و کافیست کد زیر را هم در رویداد Tick کنترل تایمر تایپ کنیم .


int numstop = 0;
private void timer1_Tick(object sender, EventArgs e)
{
Form2 f = new Form2();
numstop++;


if (numstop == 11)
{
timer1.Enabled = false;
}


if (numstop == 10)
{

f.Show();
}
}

harani
دوشنبه 15 خرداد 1391, 12:59 عصر
سوال راحتی است کافیست ابتدا یک کنترل تایمر به فرم اضافه کنید و خاصیت Enable آن را به true تغییر دهید .در نهایت در رویداد Tick این کنترل کد زیر را بنویسی .


int numstop = 0;
private void timer1_Tick(object sender, EventArgs e)
{
Form2 f = new Form2();
numstop++;


if (numstop == 11)
{
timer1.Enabled = false;
}


if (numstop == 10)
{

f.Show();
}
}

harani
دوشنبه 15 خرداد 1391, 17:43 عصر
کافیست در فرمی که به عنوان شروع باید نمایش دهید ابتدا یک کنترل progressbar و یک کنترل تایمر اضافه می کنیم خاصیت Enable تایمر را برابر true قرار میدهید و در رویداد tick این کد ا وارد میکنیم .


private void timer1_Tick(object sender, EventArgs e)
{
Form2 f = new Form2();
if (progressBar1.Value < 100)
progressBar1.Value += 10;
else
{
this.Hide();
this.Close();
timer1.Enabled = false;
f.ShowDialog();


}
}


و یا از


private void timer1_Tick(object sender, EventArgs e)
{
Form2 f = new Form2();
if (progressBar1.Value < 100)
progressBar1.Value += 10;
else
{

this.Close();
timer1.Enabled = false;
f.ShowDialog();


}
}

NasimBamdad
سه شنبه 16 خرداد 1391, 20:22 عصر
سلام . آقا / خانم harani عزیز کد شما رو تست کردم و مشکلی نبود . در ضمن اون this.close() کل برنامه رو می بنده ، اما از HIDE استفاده کردم و مشکل حل شد . فکر نکنم مشکلی باشه با HIDE ، از لحاظ بهینه سازی هم اطلاع ندارم .


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

آیا این کار درست هست و بهینه ؟ اگه نه لطفا روش دیگری بفرمایید .

در واقع اگه دیده باشید ، نرم افزار ها مثل Photoshop و یا Microsoft Word همچین چیزی دارند که میاد یک صفحه نمایشی و زیبا دارند که Loading داره و بعد از اتمام لودینگ برنامه اجرا میشه ، این طوری کاربر خسته نمیشه و مطمئن هست که نرم افزار رو اجرا کرده .


همون طور که بالا تر گفتم کد شما مشکلی نداشت ، اما خواسته های من رو برآورده نمی کنه . ببینید زمانی که Form1 بعد از مدت مثلا 10 ثانیه HIDE میشه ، تازه Form2 شروع به باز شدن می کنه کدهاش رو اجرا می کنه . از اونجا که ما می خواهیم FORM2 بدون وقفه و هیچ کندی اجرا بشه ، فکر می کنم که با همزمان سازی و یا Parallel باید Form2 رو همزمان با Form1 اجرا کرد که کدهاش و پروسس ها و فرآیند ها و.... اجرا بشوند و CPU بگیرند و زمانی که نیاز داره رو سپری کنه .

اینجا با Timer فقط یک وقفه بین اجرای فرم ها پیش آمده ، اما از زمان اجرای Form2 کسر نشده است .

به زبان بهتر 2 کار باید انجام داد .

1- محاسبه و دریافت کردن زمان مورد نیاز اجرای کامل Form2 .
2- اجرای Form1 و Form2 به صورت همزمان ، به صورتی که Form2 نمایش داده نشود ، اما در خفا و در مخفیانه کدهاش اجرا بشه .
3- بعد از گذشت زمان مورد اول - مورد 1 . __ Form2 اجرا شود .

دقیقا مثل نرم افزار PhotShop , Microsoft Word , Excel و ...

امیدوارم منظورم رو رسانده باشم .

( از همکاری همه دوستان ، نهایت تشکر را دارم . مرسی )

NasimBamdad
چهارشنبه 17 خرداد 1391, 15:09 عصر
خبری نشد ؟ کسی بلد نبود ؟

دوستان عزیز در قبال پرداخت هزینه ، اگر کسی بلد هست بگه . من پرداخت می کنم

mahdi.akbari
چهارشنبه 17 خرداد 1391, 16:23 عصر
سلا داداش
من یه نفرو می شناسم می تونه مشکلت رو حل کنه
الان هم آنلاینه بهش پی ام بده
vahid_music6@yahoo.com

tooraj_azizi_1035
چهارشنبه 17 خرداد 1391, 16:32 عصر
ببینید فرم Splash به خاطر نمایش روند شروع اجرای برنامه است. مثلاً ابتدا فونت ها لود می شوند بعد برخی سخت افزارها چک می شوند که این عملیات به شکل پیامی در فرم Splash ظاهر می شود که پس از اتمام موفقیت آمیز مراحل ابتدایی اجرای برنامه تازه فرم اصلی به نمایش در می آید.
اگر شما فقط از فرم Splash برای نمایش لوگوی برنامه و مکث چند ثانیه ای و بعد نمایش فرم اصلی استفاده می کنید که جواب داده شد اما در صورتی که قرار است عملیات خاصی را در هنگام شروع اجرای برنامه نیز انجام دهید و بعد از آن فرم اصلی را نمایش دهید باید از برنامه نویسی ناهمگام (Asynchronous) استفاده کنید.

برای این منظور باید از متد Control.BeginInvoke استفاده نمائید.

عملیات Strartup برنامه را در یک متد قرار می دهیم.
در انتهای عملیات کد مخفی کردن یا بستن فرم Splash را می نویسیم.

در خط بعد خطی از برنامه که فرم Splash به نمایش در می آید این متد را اجرا می کنیم:
SplashForm.BeginInvoke(MethodName)

البته مطالب بالا فقط در حد ایجاد ذهنیت در شما بود. نظرتان را بگوئید.

mahdi.akbari
چهارشنبه 17 خرداد 1391, 16:50 عصر
به نظر من می بایستی در رویداد لود فرم 1 ، رویداد لود فرم 2 را به این صورت هندل کنید
private void Form1_Load(object sender, EventArgs e)
{

f2.Load += new EventHandler(Form2_Load);
}

void Form2_Load(object sender, EventArgs e)
{
f2.Text = "hello";
}
و سپس یک تایمر هم در فرم 1 به این صورت قرار دهید
private void timer1_Tick(object sender, EventArgs e)
{
if (progressBar1.Value < 100)
progressBar1.Value += 10;
else
{
this.Hide();
timer1.Enabled = false;
f2.ShowDialog();
}

tooraj_azizi_1035
چهارشنبه 17 خرداد 1391, 19:30 عصر
سلام
این هم پروژه.

NasimBamdad
چهارشنبه 17 خرداد 1391, 22:07 عصر
سلام
این هم پروژه.

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

یک راهنمایی بکن ، اون کد هام رو کجای این پروژه شما باید باشه که فردا برم بیمارستان و تست کنم