PDA

نسخه کامل مشاهده نسخه کامل : پر شدن progressbar در حین انجام یک پروسه طولانی



persian_arian
26-01-2012, 11:10
سلام بر دوستان
من یک پروسه ای دارم که طولانی است و می خوام در حین انجام این پروسه یکprogressbar پر بشه و وقتی کامل پر شد این پروسه کامل انجام شده باشد و اطلاعات را توی grid بریزه . توی اینترنت search کردم backgroundworker را پیدا کردم . اما در رویداد dowork نمی تونم داده ای را به متغیری انتساب بدم برای حل این مشکل چه راه حل هایی را پیشنهاد می کنید؟
البته برای اختصاص داده به grid باید از e.result استفاده کرد .
در بعضی از مواقع هم از invoke و beginInvoke و EndInvoke , requireInvoke استفاده کردند که اصلا سر در نیاوردم اگر کسی در مورد این توابع چیزی می دونه کمی نوضیح بده ممنون میشم

senaps
26-01-2012, 12:48
بک ورکر چه ارتباطی داره به پراگرس بار؟!!!

شما یه پراگرس بار بفرست تو فرم و برنامه نویسیش رو انجام بده!!البته اگر بلدی!! اگر هم بلد نیستی که اون یه موضوع دیگس و بگو تا برات کد بذاریم!!!!!
البته من هنوز دقیقا نفهمیدم شما داری چیکار میکنی!

persian_arian
27-01-2012, 22:46
بک ورکر چه ارتباطی داره به پراگرس بار؟!!!

شما یه پراگرس بار بفرست تو فرم و برنامه نویسیش رو انجام بده!!البته اگر بلدی!! اگر هم بلد نیستی که اون یه موضوع دیگس و بگو تا برات کد بذاریم!!!!!
البته من هنوز دقیقا نفهمیدم شما داری چیکار میکنی!


دوست عزیز اگر کدی داری بگذار اما ربط backgroundworker با progressbar
backgroundworker چند تا رویداد داره یکیش DoWork است که پروسه ای را که طولانی است را توش می گذاری یک رویداد دیگه ای داره به نام
ProgressChangedکه داخلش می تونی با استفاده از
e.ProgressPercentage مقدار progressbar را set کنی و در رویداد
RunWorkerCompletedوقتی پروسه ات تموم شد کاری را که می خوای انجام بدی (دقیقا همون کاری که من می خوام ،در حین انجام کار در dowork ، مقدار progressbar در رویداد ProgressChanged مقدار دهی میشه ) من این کار را تست کردم درست کار می کنه فقط یک مشکلی است که در DoWork نمی تونیم به اشیا فرممون دسترسی داشته باشیم
توی پروژه اصلیم یک حلقه دارم که توش grid پر میشه اما من نمی تونم به grid دسترسی داشته باشم بهم خطا میده
من بهترین راه را می خوام اگر کسی راه حل بهتری داره راهنماییم کنه
البته توی سایت های خارجی این راه حل را پیشنهاد کرده بودند

_H2_
28-01-2012, 00:20
سلام
در کل برای این قبیل کارها باید از چند ریسمانی (backgroundworker یا thread یا ...) استفاده کنید.

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

در مورد اول، این مسئله به کد خودتان باز میگردد، شما باید معیاری برای حجم عملیات انجام شده و حجم عملیات باقی مانده داشته باشید.
بطور معمول کارهای زمان بر دارای حلقه (while و for و foreach و...) داخلی هستند که باعث شده عملیات کند شود.
شما باید بتوانید تعداد کل اجرا حلقه و تعداد اجرا شده فعلی حلقه را داشته باشید تا بتوانید معیاری برای درصد سپری شده و درصد باقیمانده تولید کنید.

در مورد دوم، برای ارتباط با یک کنترل از داخل یک ریسمان باید از دستور begininvoke استفاده کنید.
ولی اگر از backgroundworker برای کارتان استفاده میکنید رای گزارش درصد پیشرفت کار، این کلاس به نوعی مجهز به کدی مشابه begininvoke است.
یعنی شما میتوانید از شی backgroundworker تان در زمان عملیات متد ReportProgress را اجرا کنید، (این متد مشابه عملیات begininvoke عمل میکند) که موجب به وجود آمدن رویداد ProgressChanged میشود، سپس شما میتوانید در این رویداد کنترل progressbar خودتان بروز کنید.

برای آشنایی بیشتر با مسائل چند ریسمانی و مطالب پیرامون آن میتوانید مروری روی تاپیک های زیر داشته باشید:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

شب خوش.