PDA

View Full Version : سوال: ProgressBar : در زمان لود اطلاعات در گرید "اطلاعات در حال بار گذاری است" نمایش داده شود



ostovarit
سه شنبه 12 مرداد 1389, 00:54 صبح
من میخواهم در زمان لود اطلاعات در گرید به وسیله یک ProgressBar عملیات بار گزاری اطلاعات را نمایش دهم تا کاربر منتظر بایند گرید شود و از هنگ کردن نرم افزار جلوگیری شود ... یا اینکه متن "اطلاعات در حال بار گذاری است" در زمان بایند نمایش داده شود.

لطفا راهنمایی بفرمایید ؟

سورس کد ، سمپل ، پیشنهاد ، لینک و ...

================================================== =====
این تاپیک به جواب رسید نمونه های زیادی برای بک ProgressBar دوستان گذاشتند ...
در حال حاضر در مورد BackGroundWorker بحث می شود ...

2ndesigner
سه شنبه 12 مرداد 1389, 01:59 صبح
من متد خاصی برای این کار بلد نیستم ولی به نظر من می تونی یک لیبل ایجاد کنی و قبل از هر متدی که می خواهی لود شدنش رو اعلام کنی ، متن لیبل رو متناسب با او تغییر بدی...
در ضمن این فقط یه ایده است برای تازه کار ها

ostovarit
سه شنبه 12 مرداد 1389, 02:31 صبح
من متد خاصی برای این کار بلد نیستم ولی به نظر من می تونی یک لیبل ایجاد کنی و قبل از هر متدی که می خواهی لود شدنش رو اعلام کنی ، متن لیبل رو متناسب با او تغییر بدی...
در ضمن این فقط یه ایده است برای تازه کار ها

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

ایمان مدائنی
سه شنبه 12 مرداد 1389, 07:40 صبح
مي توني يه فرم درست كني و قبل از بايند شدن اونو شو ديالوگ كني و وقتي بايند تموم شد اونو كلوز كني !
تا توش ميتوني بنويسي كه لطفا چند لحضه صبر كنيد
موفق باشي

حجتی نیا
سه شنبه 12 مرداد 1389, 08:51 صبح
من میخواهم در زمان لود اطلاعات در گرید به وسیله یک ProgressBar عملیات بار گزاری اطلاعات را نمایش دهم تا کاربر منتظر بایند گرید شود و از هنگ کردن نرم افزار جلوگیری شود ... یا اینکه متن "اطلاعات در حال بار گذاری است" در زمان بایند نمایش داده شود.

لطفا راهنمایی بفرمایید ؟

سورس کد ، سمپل ، پیشنهاد ، لینک و ...
با backgroundworker راحت میتونی انجام بدی،خودم واسه عملیات ریستور نوشتم و خیلی خوب کارمیکنه..
1 - ابتدا یه فرم جدید ایجاد میکنی و یه progressbar و .. میزاری توش، همه کارایی که باید انجام بشه رو تو رویداد لود فرم بنویس . درضمن باید topmost هم باشه
2 - یه backgroundworker میکشی تو فرمی که گرید داری و تو پروپرتی اون خاصیت cancel رو true میکنی ، در رویداد do-work اون، فرمی که بالا ایجاد کردی رو show میکنی(showdialog نه)، حالا در برنامه قبل اینکه گرید لود بشه مینویسی :

backgroundWorker1.RunWorkerAsync();
this.Cursor = Cursors.WaitCursor;در انتها که گرید پر شد مینویسی :

backgroundWorker1.CancelAsync();
this.Cursor = Cursors.Default;تمام..

mmd2009
سه شنبه 12 مرداد 1389, 08:59 صبح
با سلام

صحبت های حجتی نیا (http://www.barnamenevis.org/forum/member.php?u=88681) درسته منم پیشنهاد میکنم بری تو قسمت نمونه کد ها صفحه یکی مونده به اخری یک نمونه کار هستش از اون طریق میتونی استفاده بکنی

ozzy_mra
سه شنبه 12 مرداد 1389, 09:56 صبح
با سلام

صحبت های حجتی نیا (http://www.barnamenevis.org/forum/member.php?u=88681) درسته منم پیشنهاد میکنم بری تو قسمت نمونه کد ها صفحه یکی مونده به اخری یک نمونه کار هستش از اون طریق میتونی استفاده بکنی

سلام دوست عزیز من برنامه که گفتیدو نتونستم پیدا کنم ممکنه لینکشو برام بزارید؟
خیلی ممنونم

mmd2009
سه شنبه 12 مرداد 1389, 11:33 صبح
http://www.barnamenevis.org/forum/showpost.php?p=1043600&postcount=525

hamide_kh
یک شنبه 17 مرداد 1389, 19:27 عصر
با backgroundworker راحت میتونی انجام بدی،خودم واسه عملیات ریستور نوشتم و خیلی خوب کارمیکنه..
1 - ابتدا یه فرم جدید ایجاد میکنی و یه progressbar و .. میزاری توش، همه کارایی که باید انجام بشه رو تو رویداد لود فرم بنویس . درضمن باید topmost هم باشه
2 - یه backgroundworker میکشی تو فرمی که گرید داری و تو پروپرتی اون خاصیت cancel رو true میکنی ، در رویداد do-work اون، فرمی که بالا ایجاد کردی رو show میکنی(showdialog نه)، حالا در برنامه قبل اینکه گرید لود بشه مینویسی :
کد:
backgroundWorker1.RunWorkerAsync();
this.Cursor = Cursors.WaitCursor;
در انتها که گرید پر شد مینویسی :
کد:
backgroundWorker1.CancelAsync();
this.Cursor = Cursors.Default;
تمام..

سلام
من کارهایی که شما را انجام دادم اما برنامه مشکل داره،برنامه را ضمیمه کردم اگه ممکنه یک نگاهی بهش باندازید ببنید مشکل از چیست؟

حجتی نیا
دوشنبه 18 مرداد 1389, 18:47 عصر
سلام
من کارهایی که شما را انجام دادم اما برنامه مشکل داره،برنامه را ضمیمه کردم اگه ممکنه یک نگاهی بهش باندازید ببنید مشکل از چیست؟
یه برنامه واست گذاشتم نیازی به background.. نداره و فقط با fmessagebox کار میکنه ..

مهدی فرزاد
دوشنبه 18 مرداد 1389, 19:19 عصر
یه برنامه واست گذاشتم نیازی به background.. نداره و فقط با fmessagebox کار میکنه ..

سلام
این چیزی که الان گذاشتید بر حسب زمانی که ما خودمون براش تعیین میکنیم پیغام رو روی صفحه نمایش میده نه بر اساس مدت زمانی که برنامه در حال اجرای عملیات هست
روش قبل بهتر بود
من روش قبل رو امتحان کردم ولی موقعی که کار تمام میشه با اینکه backgroundWorker1.RunWorkerAsync(); کردم ولی هم چنان پیغام باقی میمونه!!!!!!!!!!
چرا؟؟؟
البته من WPF کار کردم ، ممکن از اون باشه؟؟

mmd2009
دوشنبه 18 مرداد 1389, 19:24 عصر
اینو (http://softprojects.org/fa/KB/Articles/DesktopMisc/BackgroundWorker.aspx)ببین شاید به دردت بخوره

hamide_kh
سه شنبه 19 مرداد 1389, 17:17 عصر
سلام
این چیزی که الان گذاشتید بر حسب زمانی که ما خودمون براش تعیین میکنیم پیغام رو روی صفحه نمایش میده نه بر اساس مدت زمانی که برنامه در حال اجرای عملیات هست
روش قبل بهتر بود
من روش قبل رو امتحان کردم ولی موقعی که کار تمام میشه با اینکه
backgroundWorker1.RunWorkerAsync();
کردم ولی هم چنان پیغام باقی میمونه!!!!!!!!!!
چرا؟؟؟

منم دقیقا همین مشکل را دارم میشه همون برنامه را اصلاحش کنید

مهدی فرزاد
سه شنبه 19 مرداد 1389, 17:50 عصر
CancelAsync: توقف اجرای دستورات.

درخواستی را مبنی بر قطع شدن عملیات ثبت می کند. با فراخوانی این تابع مقدار CancellationPending به true تغییر پیدا خواهد کرد.
توجه کنید که با فراخوانی این تابع اجرای دستورات همان لحظه متوقف نخواهد شد. این وظیفه نویسنده کد خواهد بود که مقدار ویژگی CancellationPending را بررسی کرده و ادامه عملیات را قطع کند.
هشدار: همیشه مقدار CancellationPending را در درون رویداد DoWork بررسی کنید. در صورت عدم بررسی این ویژگی ، اجرای تابع CancelAsync تاثیری نخواهد داشت و اجرای دستورات قطع نخواهد شد.
نکته: برای استفاده از این تابع باید مقدار ویژگی WorkerSupportsCancellation را به trueتغییر دهید، در غیر اینصورت با خطای InvalidOperationException روبرو خواهید شد.

برگرفته از مقاله آقای سالار خلیل زاده در سایت www.softprojects.org (http://www.softprojects.org)

مهدی فرزاد
سه شنبه 19 مرداد 1389, 18:16 عصر
من یه سئوال توی بخش WPF پرسیدم در همین رابطه اگه کسی دوست داره کمک کنه یه نگاهی بهش بندازه
http://www.barnamenevis.org/forum/showthread.php?t=238818

hamide_kh
جمعه 22 مرداد 1389, 19:22 عصر
اینو ببین شاید به دردت بخوره
سلام من این لینک را دیدم اما نتونستم مشکلم را حل کنم
جناب حجتی نیا یا دوستان دیگه میشه اون برنامه ای که در پست 9 گذاشتم را یک نگاه بندازیذ

mahdi87_gh
جمعه 22 مرداد 1389, 20:48 عصر
دوست عزیز برداشت بنده از background Worker این هستش که ما یه کاری که مدت طولانی ای انجام خواهد شد و ما میتوانیم میزان پیشرفت کار را در هر لحظه گزارش بدهیم همراه با یک progressbar استفاده کنیم. (البته نمیگم که برداشت من کاملا درسته) در اینجا شما نیاز دارید در طی انجام عملیات لود اطلاعات یک فرم wating نمایش داده شود. روشی که من استفاده میکنم اینه که یه فرم wating طراحی میکنم و داخلش یک فایل فلش یا gif قرار میدهم. حالا قبل از اجرای دستورات ado.net با استفاده از یک thread فرم wating رو نمایش میدم. و در پایان لود اطلاعات اون فرم رو می بندم
موفق باشید

حجتی نیا
جمعه 22 مرداد 1389, 23:24 عصر
http://barnamenevis.org/forum/showthread.php?t=64210
پست 535 و 536 رو نگاه کن ...

araz_pashazadeh
یک شنبه 24 مرداد 1389, 12:11 عصر
با عرض سلام
ولی بهترین روش همین backgroundworker هستش من خیلی جستجو کردم ولی به نتیجه نرسیدم نمونه کدهای زیادی بودن ولی همشون به نحوی خطا داشتن.
اگه دوستان در این ضمینه نمونه کد یا مثالی داشتن ممنون میشم اگه در اختیار ما هم قرار بدن.
با تشکر...

ایمان مدائنی
یک شنبه 24 مرداد 1389, 12:17 عصر
من يك نمونه پيشرفته دارم ببين به كارت مياد http://www.barnamenevis.org/forum/showthread.php?t=239752

araz_pashazadeh
یک شنبه 24 مرداد 1389, 18:16 عصر
همون طوری که گفتم بهترین راه استفاده ازBackground Worker هستش من یک برنامه براتون آماده کردم که تقریبا کامل هستش هم بصورت همزمان کار می کنه هم بصورت غیر همزمان هر جایی هم مشکلی بود بگین توضیح بدم.

FastCode
یک شنبه 24 مرداد 1389, 20:41 عصر
شاید به کارت بیاد:
http://stackoverflow.com/questions/182112

ostovarit
دوشنبه 08 شهریور 1389, 14:19 عصر
http://www.barnamenevis.org/forum/showpost.php?p=1043600&postcount=525

در این نمونه یک ماسک ساخته شده و در زمان انجام عملیات روی فرم انداخته میشه ( طبق تصاویر) ولی همچنان سیستم تا پایان عملیات هنگ میکنه ... من میخواستم از بک گراند ورکر استفاده کنم که با ارور زیر مواجه شدم :

Cross-thread operation not valid: Control 'Pnl_Container' accessed from a thread other than the thread it was created on.

کدی که در ایونت do Work نوشتم اینه:



ShowMask("Sending ...");
ِ//do somthing
HideMask();

backgroundWorker1.CancelAsync();
this.Cursor = Cursors.Default;
وقتی به متد ShowMask میره ارور نمایش داده میشه!
آیا در این ایونت امکان اجرای متدی نیست؟ من کد متد ماسک رو داخل خود ایونت هم نوشتم باز ارور داد!
مفهوم ارور بالا چیه و راه حلش؟

hamid.shekasteh
دوشنبه 08 شهریور 1389, 14:45 عصر
وقتی به متد ShowMask میره ارور نمایش داده میشه!
آیا در این ایونت امکان اجرای متدی نیست؟ من کد متد ماسک رو داخل خود ایونت هم نوشتم باز ارور داد!
مفهوم ارور بالا چیه و راه حلش؟

وقتی با ترد ها کار می کنید(backgroundWorker در پشت صحنه با ترد ها کار میکنه) نمی تونید منابعی رو که در اختیار سایر ترد هاست تغییر بدهید اینجا احتمالا شما یه تغییر روی کنترل 'Pnl_Container' که در اختیار UI هست و در کنترل ترد مربوط به backgroundWorker1 نیست در وسط کارهایی که در ترد backgroundWorker انجام میشه ، انجام دادید.

راه حل اینه که خاصیت WorkerReportsProgress را true کنید و بعد از رویداد ProgressChanged استفاده کنید.

ostovarit
دوشنبه 08 شهریور 1389, 15:20 عصر
وقتی با ترد ها کار می کنید(backgroundWorker در پشت صحنه با ترد ها کار میکنه) نمی تونید منابعی رو که در اختیار سایر ترد هاست تغییر بدهید اینجا احتمالا شما یه تغییر روی کنترل 'Pnl_Container' که در اختیار UI هست و در کنترل ترد مربوط به backgroundWorker1 نیست در وسط کارهایی که در ترد backgroundWorker انجام میشه ، انجام دادید.

راه حل اینه که خاصیت WorkerReportsProgress را true کنید و بعد از رویداد ProgressChanged استفاده کنید.


عمل میکنه ولی سیستم هنگه!
نمونه ای میشه لطف کنید که من متوجه شم چکار باید انجام داد؟

با تشکر

ostovarit
دوشنبه 08 شهریور 1389, 16:13 عصر
برای حل مشکلم اومدم تمام کد هایی که مربوط به متد هایی خارج از ایونت DoWork بود رو اوردم داخل ایونت و مقادیر رو در یک استرینگ ریختم و از متغییر ها در کد داخل ایونت استفاده کردم که نیازی به صدا زدن متدی خارج از بلاک ایونت نباشد ...

مشکلم حل شد ولی این روش درسته؟!

hamid.shekasteh
سه شنبه 09 شهریور 1389, 12:29 عصر
فکر می کنم که یه سربار اضافی به وجود آوردید ، فکر کنید که اگر بخوهید اونو تغییر بدین یا ارتقاش بدین بازم جواب بده مثلا فکر کنید که می خواهید درصد پیشرفت عملیات رو توی PeogressBar نمایش بدین(ظاهرا می خواین که فقط یه نوشته هنگام پروسه سنگینتون نمایش داده بشه).
این جا هست که باید از ReportProgress استفاده کنید.

نمی دونم مشکل جناب خانی حل شده یا نه من سریع برنامه ای که برای دیباگ در پست شماره 9 همین تاپیک گذاشته بودن رو بررسی و تصحیح کردم، دوستان ببینید و نظر بدین.توی این کد از رویداد RunWorkerCompleted استفاده کردم
ان شا الله یه نمونه کاملتر رو می ذارم.

ostovarit
دوشنبه 15 شهریور 1389, 12:33 عصر
فکر می کنم که یه سربار اضافی به وجود آوردید ، فکر کنید که اگر بخوهید اونو تغییر بدین یا ارتقاش بدین بازم جواب بده مثلا فکر کنید که می خواهید درصد پیشرفت عملیات رو توی PeogressBar نمایش بدین(ظاهرا می خواین که فقط یه نوشته هنگام پروسه سنگینتون نمایش داده بشه).
این جا هست که باید از ReportProgress استفاده کنید.

نمی دونم مشکل جناب خانی حل شده یا نه من سریع برنامه ای که برای دیباگ در پست شماره 9 همین تاپیک گذاشته بودن رو بررسی و تصحیح کردم، دوستان ببینید و نظر بدین.توی این کد از رویداد RunWorkerCompleted استفاده کردم
ان شا الله یه نمونه کاملتر رو می ذارم.

با سلام مجدد و تشکر از راهنمایی های خوبی که تا الان کردید...

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

در فرم لود خط زیر رو اضافه کردم که در نتیجه کد درست انجام میشه و اروری نمیده :


Control.CheckForIllegalCrossThreadCalls = false;
این کد چکار میکنه ؟ آیا این روش اصولی هست ؟
وقتی در زمانم کار بک گراند ورکر فرم رو میبندیم نیازی هست که در ایونت close فرم عملیات در حال انجام رو cancel کنیم یا اتوماتیک کنسل میشود ؟ ( فرم رو بستیم اما برنامه هنوز باز است)

hamid.shekasteh
سه شنبه 16 شهریور 1389, 14:10 عصر
در فرم لود خط زیر رو اضافه کردم که در نتیجه کد درست انجام میشه و اروری نمیده :

کد:
Control.CheckForIllegalCrossThreadCalls = false;
این کد چکار میکنه ؟ آیا این روش اصولی هست ؟


با سلام
در مورد CheckForIllegalCrossThreadCalls من هنوز با اون کار نکردم اما پیزی که از Summary خود VS پیداست ظاهرا این false کردن این پروپرتی باعث میشه خطاهایی که در مورد thread های ناصحیح (wrong thread) ، call نشه.
این کد رو کجا دیدید؟ اعتبار سایت و نویسنده و موردی که این کد توصیه شده رو در نظر بگیرید...


وقتی در زمانم کار بک گراند ورکر فرم رو میبندیم نیازی هست که در ایونت close فرم عملیات در حال انجام رو cancel کنیم یا اتوماتیک کنسل میشود ؟ ( فرم رو بستیم اما برنامه هنوز باز است)


در مورد cancel کردن یا نکردن تصور کنید که thread مربوط به BackgroundWorker در حال اجراست، فرم رو می بندید (برنامه در حال اجراست)ظاهرا هم خطایی نیست ، اما اگه بلا فاصله دکمه close برای فرم اصلی زده شد و برنامه پایان یافت چی؟باز هم wrong thread.

دقت کنید که برای RunWorkerCompleted 3 حالت وجود دارد:
1- کار مورد نظر(متد DoWork) به طور کامل انجام شود.
2- عملیات calcel شود.
3- خطایی رخ دهد.

به نظر منcancel کنید.

ostovarit
سه شنبه 16 شهریور 1389, 19:54 عصر
با سلام
در مورد CheckForIllegalCrossThreadCalls من هنوز با اون کار نکردم اما پیزی که از Summary خود VS پیداست ظاهرا این false کردن این پروپرتی باعث میشه خطاهایی که در مورد thread های ناصحیح (wrong thread) ، call نشه.
این کد رو کجا دیدید؟ اعتبار سایت و نویسنده و موردی که این کد توصیه شده رو در نظر بگیرید...


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

در مورد CheckForIllegalCrossThreadCalls من یک بریک پونت گذاشتم و انجام کارا رو دنبال کردم حرف شما صحیح هست exception وجود داره ولی نشون داده نمیشه ... و با کمال تعجب نرم افزار کارش رو به خوبی و درست انجام میده !

الان مشکلی نیست ولی من میترسم که نکته ای باشه که ندیده باشم ...

دوستان دیگر چیزی در مورد این Property میدونن بگن ما هم روشن بشیم ...

با تشکر

omidniyazi
چهارشنبه 27 بهمن 1389, 18:32 عصر
چرا انقدر جواب رو م پیچونید جواب خیلی ساده است.
progressbar1.maximum=dategridview1.rows.count
progressbar1.value=dategridview1.countrow