PDA

View Full Version : استفاده از ProgressBar در BackgroundWorker سطح (مبتدی)



milad-engineer
پنج شنبه 17 اسفند 1391, 20:07 عصر
با سلام
من یک فعالیت کپی را در Background worker انجام میدهم و مقدار PRogress bar رو به این صورت قرار میدهم

pbrCopyProgress.Value = e.ProgressPercentage;

ولی کار نمیکنه
لطفا راهنماییم کنید

با تشکر

pedram.11
پنج شنبه 17 اسفند 1391, 20:19 عصر
توی BackgroundWorker عملیات توی یک ترد دیگه انجام میشه برای همین نمیتونید از ترد دیگه به کنترل های ترد دیگه دسترسی داشته باشید، برای حل مشکل از کد زیر استفاده کنید:
توی فضای خالی:
delegate void intHandler(int Value);
void SetProgressValue(int Value)
{
if (InvokeRequired)
BeginInvoke(new intHandler(SetProgressValue), new object[] { Value });
else
pbrCopyProgress.Value = Value;
}
و هرجا که میخواید مقدار پروگرس بار رو تغییر بدید:
SetProgressValue(e.ProgressPercentage);

milad-engineer
پنج شنبه 17 اسفند 1391, 21:08 عصر
با تشکر فراوان
میشه یه توضیح در مورد قسمت اول کدی که نوشتی بدی...

milad-engineer
پنج شنبه 17 اسفند 1391, 21:19 عصر
و یک چیز دیگه
قسمت دوم کد رو در
private void bwCopy_ProgressChanged(object sender, ProgressChangedEventArgs e)

گذاشتم ولی تغییری در Progressbar ایجاد نمیشه

ممنون میشم اگر راهنمیی کنید.

pedram.11
پنج شنبه 17 اسفند 1391, 21:31 عصر
قسمت اول یک متد هست که کارش تغییر دادن مقدار pbrCopyProgress هست، توی این متد بررسی میشه(InvokeRequired) اگه صدا زننده ی این متد از ترد دیگری بود این مقدار True میشه، delegate void intHandler هم شیئی هست که متد SetProgressValue با پارامتر Value به اون ارسال میشه و بعد از اون این delegate دوباره همون متد رو فراخوانی میکنه با این تفاوت که مرجع متد همون مرجع اصلی میشه؛ در ابنصورت سطح دسترسی به کنترل فراهم میشه و در اینصورت میتونید تغییرات رو مشاهده کنید؛ امیدوارم متوجه شده باشد

pedram.11
پنج شنبه 17 اسفند 1391, 21:35 عصر
این کد رو امتحان کنید:
pbrCopyProgress.Invoke(new Action(() => { pbrCopyProgress.Value = Value; }));

milad-engineer
جمعه 18 اسفند 1391, 10:17 صبح
امتحان کردم
باز هم نشون نداد

اگر میشه یک کد قرار بدهید که مقدارPRogress برای Backgroundworker رو نشان دهد (کد عمومی )

the king
جمعه 18 اسفند 1391, 15:09 عصر
امتحان کردم
باز هم نشون نداد

اگر میشه یک کد قرار بدهید که مقدارPRogress برای Backgroundworker رو نشان دهد (کد عمومی )


private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 100; i++)
{
System.Threading.Thread.Sleep(100);
backgroundWorker1.ReportProgress(i);
}
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}


رجوع شود به :
سوال: BackGround Worker (http://barnamenevis.org/showthread.php?353379)

milad-engineer
شنبه 19 اسفند 1391, 12:55 عصر
ممنون از جوابتون
ولی من در بک گراند ورکر از یک کلاس برای کپی فایل ها استفاده میکنم و میخواهم درصد کپی فایل ها رو نشون بده و نمیتونم از حلقه For استفاده کنم...

لطفا راهنمایی کنید.

the king
شنبه 19 اسفند 1391, 20:56 عصر
ممنون از جوابتون
ولی من در بک گراند ورکر از یک کلاس برای کپی فایل ها استفاده میکنم و میخواهم درصد کپی فایل ها رو نشون بده و نمیتونم از حلقه For استفاده کنم...

لطفا راهنمایی کنید.

الزاما حلقه For نیست، می تونه حلقه While باشه اما به هر حال حلقه رو لازم داره.
عملیات کپی فایل تون رو خودتون پیاده سازی کرده اید یا روال کپی فایل رو با متدی مثل System.IO.File.Copy انجام می دهید؟
باید خودتون پیاده سازی اش کنید تا روی پیشرفت عملیات تسلط داشته باشید. یک کلاس CopyClass ساختم که روال کپی کردن
و گزارش دادن درصد پیشرفت رو خودش مدیریت می کنه و شما فقط باید یک نمونه اش رو پایین فرم قرار دهید.
هم قابلیت Cancel کردن داره و هم نیازی به BackgroundWorker یا Thread مجزا ندارید، خودش BackgroundWorker داره.

101172

moeinih
چهارشنبه 08 خرداد 1392, 12:02 عصر
با سلام
من عینا از همین روش استفاده کردم چون توی پروژم دارم یکسری اطلاعات رو از دیتابیس روی هاست میخونم که طول میکشه بخاطر همین اونو تو بک گراند ورکر گذاشتم سیستم در حال اجرای دستورات بک گراند ورکر هنگ نمیکنه ولی مشکلم اینه که وقتی دو تا تابع مختلف که تو دوتا بک گراند ورکر مجزا هستند اجرا میشه ارور میده
لطفا راهنمایی کنید

svhasvha
چهارشنبه 08 خرداد 1392, 13:44 عصر
سلام
http://barnamenevis.org/showthread.php?400809-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B3%D8%A7%D8%AF%D9%87-%D9%88%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-progressBar&p=1780134#post1780134