PDA

View Full Version : چگونگی نمایش پیغام از ابتدا تا انتهای محاسبات



iranigirl1364
پنج شنبه 27 دی 1386, 08:03 صبح
با سلام:
دوستان گرامی من در برنامم یک دکمه دارم که وقتی روی آن کلیک می شه , یک سری محاسبات انجام می شه و یک زمانی هم این محاسبات طول می کشن.
می خواستم بدونم چه طوری می شه , تا زمانی که این محاسبات در حال انجام است یک پیغام روی فرم دیگه برای مثال با عنوان "کاربر گرامی لطفا صبر کنید" نمایش داده شود و با اتمام محاسبات این فرم به طور اتوماتیک بسته شود؟
اگه منو راهنمایی کنید ممنون می شم!
با تشکر و احترام فراوان:لبخندساده:

Mahdi.Kiani
پنج شنبه 27 دی 1386, 08:31 صبح
با سلام:
دوستان گرامی من در برنامم یک دکمه دارم که وقتی روی آن کلیک می شه , یک سری محاسبات انجام می شه و یک زمانی هم این محاسبات طول می کشن.
می خواستم بدونم چه طوری می شه , تا زمانی که این محاسبات در حال انجام است یک پیغام روی فرم دیگه برای مثال با عنوان "کاربر گرامی لطفا صبر کنید" نمایش داده شود و با اتمام محاسبات این فرم به طور اتوماتیک بسته شود؟
اگه منو راهنمایی کنید ممنون می شم!
با تشکر و احترام فراوان:لبخندساده:

از کنترل backGroundWorker استفاده کنید
در رویداد DoWork از این کنترل، کد های مربوط به محاسباتتون را انجام بدین
در همین زمان هم می تونین فرم مورد نظرتون که حاوی پیام هست را Show کنید
زمانی که محاسبات تمام شد، رویداد RunWorkerComplete به طور اتوماتیک Fire می شه که می تونین در این زمان فرم مورد نظرتون را ببندین

Chabok
پنج شنبه 27 دی 1386, 09:09 صبح
سلام

اگر هم نمیخواهید زیاد در گیر کدهای backGroundWorker بشوید میتوانید از یک Label استفاده کنید .
قبل از شروع محاسبات Text اون رو تغییر بدن . برای مثال : لطفا اندکی صبر کنید ....
سپس فرم خود را refresh کنید . ;()refresh
و پس از پایان عملیات هم که دیگه تموم شده . هر کاری میخواهید بکنید .
فقط با این کار در حین انجام عملیات فرم شما Lock خواهد بود .

اگر زمان کار طولانی است و یا این روش خوب نیست می توانید همون طور که دوستمون فرمودند از backGroundWorker و یا Thread استفاده کنید .

sinpin
پنج شنبه 27 دی 1386, 17:51 عصر
اگر هم نمیخواهید زیاد در گیر کدهای backGroundWorker بشوید میتوانید از یک Label استفاده کنید .
قبل از شروع محاسبات Text اون رو تغییر بدن . برای مثال : لطفا اندکی صبر کنید ....
سپس فرم خود را refresh کنید . ;()refresh
و پس از پایان عملیات هم که دیگه تموم شده . هر کاری میخواهید بکنید .
فقط با این کار در حین انجام عملیات فرم شما Lock خواهد بود .
اگر زمان کار طولانی است و یا این روش خوب نیست می توانید همون طور که دوستمون فرمودند از backGroundWorker و یا Thread استفاده کنید .
البته روش بالا در شرایط محدودی ممکنه جواب بده.

اما بصورت کلی :
1- اگه تعداد عملیات کم است اما حجم عملیات زیاد است (مثلا کار کردن با یک فایل بزرگ) ؛ عملیات را در یک thread مستقل انجام بدید
2- اگه تعداد عملیات زیاد است اما هر یک cpu رو به مدت کمی در اختیار میگیرند بهتره هر از گاهی از Application.DoEvents() بهره بگیرید.

iranigirl1364
جمعه 28 دی 1386, 17:51 عصر
با سلام:
ابتدا به خاطر جواب های تمامی شما دوستان گرامی متشکرم.

***من Backgrouund worker رو امتحان کردم , اما نتیجه نداد!!!!!!

***در مورد جواب دوست گرامی با آی دی sinpin هم چون تا حالا اصلا با thread کار نکردم , متوجه منظورتون نشدم , لطفا بیشتر توضیح دهید اگه براتون امکان داره!!!!!!!

یک بار دیگه هم از همتون تشکر می کنم.
با تشکر و احترام فراوان

sinpin
جمعه 28 دی 1386, 20:13 عصر
***در مورد جواب دوست گرامی با آی دی sinpin هم چون تا حالا اصلا با thread کار نکردم , متوجه منظورتون نشدم , لطفا بیشتر توضیح دهید اگه براتون امکان داره!!!!!!!

حتما !!!!!!!
شما محاسبات رو کجا انجام میدید ؟ احتمالا درون یک حلقه (در اینصورت با ایجاد یک وقفه ساده میتونید مشکل رو حل کنید)
وقتی برنامه به یک حلقه میرسه اول اون رو به اتمام میرسونه و بعد میره سراغ کارهای دیگه (از جمله ایونت هندلینگ) یکی از این کارها رسیدگی به رویداد OnPaint خودش و سایر کنترلها است. پس لازمه درون حلقه یک وقفه ایجاد کنیم و بهش بگیم که در این لحظه(وقفه) یه خورده هم به ظاهر خودت (OnPaint) برس !
طبق نیاز خودتون و با توجه به حجم عملیات شما میتونید در حلقه یک شرط بزارید که مثلا پس از هر 100 دور حلقه بیاد و یک وقفه ایجاد کنه. اما چطور وقفه رو ایجاد میکنید، در ساده ترین حالت با دستور زیر :

Application.DoEvents();این به برنامه میگه که در این لحظه رویدادها رو هندل کن (حالا هر رویدادی : از MouseMove و OnPaint یک کنترل گرفته تا...)

iranigirl1364
یک شنبه 30 دی 1386, 07:38 صبح
با سلام:
شما دو روش رو پیشنهاد داده بودید:
1)استفاده از thread
2)استفاده از ApplicationDoEvets()
دوست گرامی ممنون به خاطر توضیحات , اما من در مورد چگونگی استفاده از thread توضیحاتی نیاز دارم!!!!!!اصلا چه طوری باید از یک tread استفاده کنم؟ چه طوری باید از thread در برنامم استفاده کنم که به هدف زیر برسم:
( من در برنامم یک دکمه دارم که وقتی روی آن کلیک می شه , یک سری محاسبات انجام می شه و یک زمانی هم این محاسبات طول می کشن.
می خواستم بدونم چه طوری می شه , تا زمانی که این محاسبات در حال انجام است یک فرم دیگه show شه و یک پیغام برای مثال با عنوان "کاربر گرامی لطفا صبر کنید" نمایش داده شود و با اتمام محاسبات این فرم کهshow شده بود به طور اتوماتیک بسته شود؟)
اگه توضیحات لازم رو بفرمایید ممنون می شم
بازم به خاطر راهنماییتون ممنونم
با تشکر و احترام فراوان

sinpin
جمعه 05 بهمن 1386, 14:53 عصر
Thread t;
private void button1_Click(object sender, EventArgs e)
{
progressBar1.Value = 0;
progressBar1.Minimum = 0;
progressBar1.Maximum = 100;
t = new Thread(new ThreadStart(CountAndExitThread));
t.Start();
}

private void CountAndExitThread()
{
for (int i = 1; i <= 100; i++)
{
progressBar1.Invoke(new ProgressBarIncrementDelegate(ProgressBarIncrement) );
Thread.Sleep(50);
}
}

private delegate void ProgressBarIncrementDelegate();
private void ProgressBarIncrement()
{
progressBar1.Value++;
}

once4ever
جمعه 05 بهمن 1386, 18:43 عصر
شما حتما با همان BackgroundWorker کار کنید و سعی کنید که یاد بگیرید

Mahdi.Kiani
جمعه 05 بهمن 1386, 19:15 عصر
با نظر [Once4ever (http://barnamenevis.org/forum/member.php?u=8564) موافقم چون واقعا Once For Ever!!!!

shokoufeh
شنبه 06 بهمن 1386, 11:59 صبح
دوستان عزیز اگر کسی اطلاعاتی در باره ticker های تبلیغاتی دارد لطفا به من کمک کند .مثل متن هایی که در زیر شبکه های تلویزیون حرکت می کنند.

hassan razavi
شنبه 06 بهمن 1386, 12:14 عصر
قدیما با استفاده از یک Timer و اضافه کردن space به متن اینکار رو انجام میدادیم. ولی حالا مثل اینکه کنترلهایی برای این کار موجود هست.

sinpin
جمعه 12 بهمن 1386, 19:28 عصر
دوستان عزیز اگر کسی اطلاعاتی در باره ticker های تبلیغاتی دارد لطفا به من کمک کند .مثل متن هایی که در زیر شبکه های تلویزیون حرکت می کنند.
یک لیبل یا عکس رو بندازید روی یک پنل و بعد با یک تایمر موقعیت مکانی اون رو هی (!) تغییر بدید و...