PDA

View Full Version : Progress Bar



dr_jacky_2005
یک شنبه 28 شهریور 1389, 09:30 صبح
آقا نگین سرچ کنا.
من کردم
پیدام کردم
ولی یا به کارم نیمده
یا ارور میداده.

من یک فرم 2 لودینگ دارم.
یک فرم 1 دیگر هم دارم که تووش درخته و این درخته توسط تابع مثلا ایکس پر میشه.

تابع ایکس در لود فرم 1 است.(هنگ بودن سیستم هم همینجاست).
(در مجموع بگم که پر شدن درخت در هنگام بالا اومدن فرم 1 باید انجام بشه)

حالا میخوام فرم 1 که داره لود میشه و درخت پر میشه،لودینگ نمایش بده.
فقط یک مسئله که میخوام حداقل 2 ثانیه لودینگ نمایش داده بشه،حتی اگر نیاز نبود.
اگرم که نیازه که به اندازه نیازش لودینگ رو نمایش بده.
(البته اگه اینم نشد،مشکلی نیس،فقط لود بیاد و بره به اندازه)

در آخرم این فرم 2 لودینگ بسته بشه.

من میدونم که با اینا باید کار کرد ولی یا ارور میده یا نمیشه:
Invoke
Thread
BackgroundWorker
Delegate
Timer

لطفا کامل توضیح بدین دوستان:ناراحت:
_____________________
مشکل اینجاست که من تابع پر کردن درختام(تابع ایکس) توو لود فرم 1 است.

وقتی اون تابع رو میام میزارم توو DoWork این ارور میاد:
Cross-thread operation not valid: Control 'TrvCoding' accessed from a thread other than the thread it was created on.

TrvCoding هم اسم درخته.

واسه همین میام این رو میزارم بالا سر تابه ایکس:
CheckForIllegalCrossThreadCalls = false;

بعد این ارور رو توو DoWork میده:

Action being performed on this control is being called from the wrong thread. Marshal to the correct thread using Control.Invoke or Control.BeginInvoke to perform this action.

(آخه اومدم تابع ایکس رو گذاشتم توو DroWork . نذارمم که اصلا سودی نداره و لودینگی نمیشه!)

بعد واسه رفع این ارور ، این ایـــــــــف رو میذارم:


if (TrvCoding.InvokeRequired == false)
{
TvfCoding.LoadTreeFullData();
}
ولی باز لودینگی نمیبینم.
یعنی هستا ولی 1 میلیونم ثانیه.
اصلا میگیم اینا که من گفتم کار کنه،
من میخوام حداقل 2 ثانیه لودینگ بده.

چرا false?
چون اگه true باشه،
Cross-thread operation not valid: Control 'TrvCoding' accessed from a thread other than the thread it was created on.
میاد!!!
حقم داره ، چون داره توو لود فرم 1 ، تابع ایکس یک بار میاد.
البته این خط رو هم کامنت کردم ولی در مجموع کار نمیکنه!

حالا چطور من تابه DoWork رو توو لودینگ فرم 1 بیارم؟آیا راه اینه؟اگه آره،مشکل توو این قسمته:
backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)

و

private void form1_Load(object sender, EventArgs e)

که نوع E یکی نیس!

Cast هم نمیشه.ارور میده.

آگه راه هم این نیس، راه لطفا
_____
هرچی مثال توو نت است،اومدن عملیاتشون رو توو دگمه نوشتن.
ولی مال من توو لود است

saied_genius
یک شنبه 28 شهریور 1389, 17:44 عصر
سلام

ببینید ، اگر فقط هدفتان نمایش متن "لطفاً منتظر باشید ..." است. راحتترین راه این است:

1- یک label وسط فرم قرار دهید.

2- visible آنرا false کنید.

3- پس از اینکه بر روی گزینه مورد نظر کلیک شد ، پیغام نشان داده شود ، پس از اتمام کار دوباره invisable شود.

باز هم اگر فکر می کنید نیاز به multi threading دارید ، بگویید تا یک مثال برایتان بگذارم .

--------------------
در مورد error هایی که به شما می دهد، به این دلیل است که شما می خواهید از یک thread دیگر ، thread فرم خود را مقدار دهی کنید (Cross Threading) ، که در حالت عادی امکان پذیر نیست.

موفق باشید.

dr_jacky_2005
دوشنبه 29 شهریور 1389, 08:22 صبح
سلام

ببینید ، اگر فقط هدفتان نمایش متن "لطفاً منتظر باشید ..." است. راحتترین راه این است:

1- یک label وسط فرم قرار دهید.

2- visible آنرا false کنید.

3- پس از اینکه بر روی گزینه مورد نظر کلیک شد ، پیغام نشان داده شود ، پس از اتمام کار دوباره invisable شود.

باز هم اگر فکر می کنید نیاز به multi threading دارید ، بگویید تا یک مثال برایتان بگذارم .

--------------------
در مورد error هایی که به شما می دهد، به این دلیل است که شما می خواهید از یک thread دیگر ، thread فرم خود را مقدار دهی کنید (Cross Threading) ، که در حالت عادی امکان پذیر نیست.

موفق باشید.
ممنون از توجهتون
ولی نه،لیبل نمیخوام.
تازه،میخوام یک فرم درست کنم که توو همه فرم های پروژه ام استفاده کنم.
لطفا ازmultiThreading یک مثال بزنید.
فقط لطفا مثالتون رو مثل فرم من شبیه سازی کنید.
یعنی 2 تا فرم.
1 لودینگ
1 گرید.
تابع پر شدن گرید در لود شدن فرم گرید دار باشه.
:قلب:

غلامرضا شریفی
دوشنبه 29 شهریور 1389, 11:04 صبح
اگر vb ميدانيد يك نمونه برايتان بگذارم

saied_genius
دوشنبه 29 شهریور 1389, 16:56 عصر
سلام
نمونه ای که ضمیمه کردم ، یک نمونه کامل است.

سعی کردم به ساده ترین نحو پیاده کنم ، دیگه نمی دونم.

پروژه با VS2010 است (ورژن پایین تر ندارم)

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

سوالی بود در خدمتم.

موفق باشید.

غلامرضا شریفی
سه شنبه 30 شهریور 1389, 18:57 عصر
جهت اتمام كار j=2000 قرار بدهيد

saied_genius
سه شنبه 30 شهریور 1389, 21:27 عصر
جهت اتمام كار j=2000 قرار بدهيد

روی فرم 2 کلیک کنیم ، هنگ می کند !!!

غلامرضا شریفی
چهارشنبه 31 شهریور 1389, 12:31 عصر
روی فرم 2 کلیک کنیم ، هنگ می کند !!!
معمولا وقتي از فرمي جهت انتظار استفاده ميشود نبايد طوري باشد كه قابل حركت و بسته شدن باشد من بخاطر اينكه فقط خواستم نحوه كار را نشان بدهم فرم 2 را بشكل صحيح خود طراحي نكردم در بالا هم توضيح دادم شما وقتي كارتان تمام شد بايد j=2000 شود يا j>105 شود فرقي نمي كند تا فرم دو اتومات بسته شود
روي فرم دو اگر كليك شود هنگ نميكند فقط هنگامي كه دبل كليك و يا جابجايي انجام شود Progress Bar استپ ميكند ولي برنامه از كار نمي افتد در پشت صحنه فرمانها اجرا ميشود تا به j=2000 برسد اگر خط اول همين پاسخ را اجرا كنيد مشكلي پيش نمي ايد
اگر را حل اينكه Progress Bar استپ ميكند يافتيد من هم از راهنمايي شما سپاسگزار خواهم بود

saied_genius
چهارشنبه 31 شهریور 1389, 15:59 عصر
هدف از ایجاد thread جدید ، هنگ نکردن فرم انتظار است.

من خیلی روی کد شما دقت نکردم ، ولی در نمونه کدی که من گذاشتم شما هم می توانید فرم را جابجا کنید و هم روی اون کلیک و دابل کلیک کنید و هیچ مشکلی پیش نمی آید (نباید مشکلی پیش بیاید).

وقتی فرم انتظار در thread مجزا اجرا می شود ، دیگری دلیلی بر هنگ کردن (حتی ظاهری) نباید وجود داشته باشد.

سوالی بود در خدمتم.

موفق باشید.

غلامرضا شریفی
پنج شنبه 01 مهر 1389, 08:49 صبح
هدف از ایجاد thread جدید ، هنگ نکردن فرم انتظار است.

من خیلی روی کد شما دقت نکردم ، ولی در نمونه کدی که من گذاشتم شما هم می توانید فرم را جابجا کنید و هم روی اون کلیک و دابل کلیک کنید و هیچ مشکلی پیش نمی آید (نباید مشکلی پیش بیاید).

وقتی فرم انتظار در thread مجزا اجرا می شود ، دیگری دلیلی بر هنگ کردن (حتی ظاهری) نباید وجود داشته باشد.

سوالی بود در خدمتم.

موفق باشید.

دوست عزيز ميشود بفرماييد Progress Bar برنامه اي كه در اينجا قرار داده ايد كجا هست كه با جابجايي و دبل كليك هنگ نكند يك ليبل در فرم شما هست كه نمي دانم چطور ميخواهد هنگ كند
ضمنا برنامه اي كه قرار دادم هنگ نمي كند فقط Progress Bar استپ ميكند اگر تنظيماتي كه در پاسخ بعدي گفته شد رعايت شود مشكلي پيش نمي ايد

hamid.shekasteh
دوشنبه 12 مهر 1389, 20:21 عصر
پس چرا C#‎ نگذاشتید !!! اینجا که بخش vb نیست !

ابن جا دو نمونه نوشتم ، ببینید:

http://www.barnamenevis.org/forum/showthread.php?t=248607
http://www.barnamenevis.org/forum/sh...=237267&page=3 (http://www.barnamenevis.org/forum/showthread.php?t=237267&page=3)

dr_jacky_2005
شنبه 01 آبان 1389, 15:50 عصر
من یک فرم لودینگ دارم که تووش پروگرس بار است.
یک فرم هم دارم که تووش درخت است و با تابعی پر از دیتا میشود.
اینگونه عمل کرده ام:
این رو نوشتم توو فرم که درخت تووشه که بتونم فرم لودینگ رو شو کنم:

LoadingForm frmp;

اینم توو لود فرمه که تووش درخته:

frmp = new LoadingForm();
frmp.Show();
this.Cursor = Cursors.WaitCursor;
backgroundWorker1.RunWorkerAsync();

اینم توو دوو ورک بکگرادنورکر:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
int returnedRecordCount = 100;
for (int i = 1; i <= returnedRecordCount; i++)
{
if (this.backgroundWorker1.CancellationPending)
{
e.Cancel = true;
return;
}
this.backgroundWorker1.ReportProgress(i);

System.Threading.Thread.Sleep(20);
}
if (TrvCoding.InvokeRequired)
{

TrvCoding.Invoke(new MethodInvoker(delegate { TvfCoding.LoadTreeFullDate(); }));

//TvfCoding.LoadTreeFullDate();
}
}

اینم توو کامپلیت:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Cursor = Cursors.Default;
frmp.Close();
//frmp.Hide();
}

اینم وقتی که فرمه که تووش درخته،دارخ بسته میشه:

private void HesabStateWorkForm_FormClosed(object sender, FormClosedEventArgs e)
{
if (this.backgroundWorker1.IsBusy) this.backgroundWorker1.CancelAsync();
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (e.ProgressPercentage <= this.frmp.progressBar1.Maximum)
{
this.frmp.progressBar1.Value = e.ProgressPercentage;
}
}

اینم توو لود فرم لودینگ:

progressBar1.Value = 0;
for (int x = 0; x < 100; x++)
{
if (progressBar1.Value < progressBar1.Maximum)
{
//System.Threading.Thread.Sleep(10);
progressBar1.Value++;
}
}

اینا هم نکته ها:
دو تا پروپرتی توانایی کنسل کردن و گزارش دادن true است.
و
فرم لودینگ هم TopMost = true

سوالات:
الآن همه چی میاد،عالی...
ولی
اول لودینگ میاد،بعد پر شدن درخت شروع میشه!

من میخوام هم زمان باشن!


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

اگر مورد بالا نشد،میخوام که پروگرس بار بلوکی نباشد،marquee باشد.(style)