PDA

View Full Version : مثال خیلی ساده از BackgroudWorker



mahmood3d
چهارشنبه 28 مرداد 1388, 13:49 عصر
سلام دوستان

توی این سایت مطالب زیادی در زمینه ترد ها و بک گراند ورکر ارائه شده ولی کسانی مثل من هر چقدر به کدها نگاه می کنند چیزی حالیشون نمیشه چون قبلا با اینها کار نکردن. البته مثال های زیادی هم هست ولی توضیح داده نشده که هر خط کد چکاری انجام می دهد.
از دوستان گرامی اگه میشه یک نمونه کوچکی از BackgroudWorker رو اینجا قرار بدند که این کارها داخل پروژه انجام بشه که فکر کنم تمام مباحث رو دربر می گیره:
1- یک حلقه 1 تا 1000 داخل برنامه اجرا بشه.
2- بین هر قدم حلقه برنامه 1 ثانیه منتظر بمونه.
3- هر مرحله از کار در یک لیبل نشون داده بشه.
4- در هر مرحله یک عبارت مثلا " عدد X اضافه شد" به لیست باکس اضافه بشه.
5- مراحل کار بوسیله یک پروگرس بار نشون داده بشه.
6- امکان نگه داشتن برنامه (Pause) داشته باشه.
7- امکان ادامه دادن به برنامه بعد از نگه داشتن وجود داشته باشه.
8- امکان کنسل کردن پردازش رو داشته باشه.

چون من اکثر مطالبی که توی سایت بود رو مطالعه کردم که این نمونه برنامه می تونه کار 99% کاربرایی که با این ابزار مشکل دارند رو حل کنه.
لطفا در طول برنامه کار هر خط از کد رو هم توضیح بدین تا فهم برنامه راحت باشه.

قبلا از راهنمایی های شما عزیزان ممنونم.

Sajjad.Aghapour
چهارشنبه 28 مرداد 1388, 17:49 عصر
اینو همین طوری نوشتم.دیگه بقیش با خودتون.در ضمن...


یعنی نوشتن این تکه کد انقدر سخته که 10 نفر تا حالا بازدید داشته و کسی جواب نداده ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

اکثر دوستان به دلیل تکراری بودن مطلب جواب نمیدن...
موفق باشید...
..

mahmood3d
چهارشنبه 28 مرداد 1388, 18:57 عصر
اینو همین طوری نوشتم.دیگه بقیش با خودتون.در ضمن...

اکثر دوستان به دلیل تکراری بودن مطلب جواب نمیدن...
موفق باشید...
..

دستتون درد نکنه.
این مواردی که اینجا نوشتم که می خوام این برنام هانجام بده در واقع به خاطر این بود که توی سایت گشته بودم و تمام مواردی که دوستان از BackgroundWorker انتظار داشتند رو براتون لیست کردم تا یک نمونه ساده ولی کامل باشه تا هر کسی خواست بتونه استفاده کنه.
خیلی ممنون شما هم زحمت کشیدید و این برنامه رو نوشتید. ولی باز این تکه کدها توضیح ندارن. من خودم تک تک کدها رو چک می کنم و توضیحات براش می نویسم و جاهایی که بلد نبودم رو می پرسم تا یک نمونه کامل همراه با توضیحات توی این سایت موجود باشه تا دوستان دیگه هم استفاده کنند.
:چشمک:

mahmood3d
چهارشنبه 28 مرداد 1388, 19:07 عصر
آقا من کد ها رو دارم چک می کنم ولی راستشو بخواین خیلی از چیزهاش رو متوجه نمیشم.:خجالت:
اگه کسی می تونه برای هر یک از کد ها یک توضیحات به برنامه اضافه کنه و دوباره آپلود کنه.
در ضمن تو بخش هدر برنامه چند تا نیم اسپیس اضافه شده بود که برنامه نمی تونست تشخیص بده که از نیم اسپیس org بود. برای اجرای برنامه مجبور شدم اون بخش ها رو حذف کنم. این 3 تا نیم اسپیس برای چیه؟
در ضمن اگه بخوایم که وقتی برنامه بسته شد پردازش هم از بین بره باید چه کاری انجام بدیم؟
البته به نظر من باید تو قسمت Unload فرم باید دستور backgroundWorker1.CancelAsync(); رو نوشت ولی فرم Unload نداره. این کد رو باید توی بخش Leave فرم بنویسیم؟

Sajjad.Aghapour
چهارشنبه 28 مرداد 1388, 21:00 عصر
آقا من کد ها رو دارم چک می کنم ولی راستشو بخواین خیلی از چیزهاش رو متوجه نمیشم.:خجالت:
اگه کسی می تونه برای هر یک از کد ها یک توضیحات به برنامه اضافه کنه و دوباره آپلود کنه.

خوب دیگه.شما قبل از ایجاد این تاپیک باید کمی در مورد Thread البته Thread Safety و delegate و نحوه invoke کردن اونها و اصلا نحوه کار BGWorker کمی مطلب می خوندید.....


در ضمن تو بخش هدر برنامه چند تا نیم اسپیس اضافه شده بود که برنامه نمی تونست تشخیص بده که از نیم اسپیس org بود. برای اجرای برنامه مجبور شدم اون بخش ها رو حذف کنم. این 3 تا نیم اسپیس برای چیه؟

بله اینها مربوط به چندتا کامپوننت بود که من یادم رفته بود اونها رو پاک کنم.اونها رو پاک کنید...


در ضمن اگه بخوایم که وقتی برنامه بسته شد پردازش هم از بین بره باید چه کاری انجام بدیم؟
البته به نظر من باید تو قسمت Unload فرم باید دستور backgroundWorker1.CancelAsync(); رو نوشت ولی فرم Unload نداره. این کد رو باید توی بخش Leave فرم بنویسیم؟

تو رویداد FormClosing یا FormClosed اون رو run کنید.اگه اخر شب وقت کنم کامنت هایی هم برای اون میذارم تا متوجه بشید وگرنه از دوستان دیگه بخواین....
..
فکر کنم در بخش منابع چندتا کتاب برای Threading گذاشته بودم.....
می تونید برای مطالعه چند نخی از اونها استفاده کنید...
...
موفق باشید... (*-:)
...

mahmood3d
چهارشنبه 28 مرداد 1388, 22:11 عصر
ممنون دوست عزیز
راستشو بخوای من روی پروژه ای کار می کنم که اتفاقی به مشکلی برخوردم که نیاز بود به وسیله نخ ها حل بشه برای همین الان چند روزه در مورد این مطلب توی این سایت و سایت های دیگه می گردم و به خاطر اینکه همه اکثرا فقط کد گذاشتند و توضیح ندادن بیشتر سر در گم شدم. الان می خوام به کمک شما دوستان بعد از حل مشکل پروژم مفصلا بشینم و در مورد نخ ها مطالعه بیشتری کنم چون خیلی جاها به درد می خوره. الانم چند یکی دوتا مطلب از همین سایت پیدا کردم که بخونم.
راستی یادم وفت بگم که مطالب در مورد BGWorker هم خیلی کمه و فقط در موردش کد گذاشتند. اگه میشه حداقل کدهای مربوط به این رو شرح بدین.

mahmood3d
چهارشنبه 28 مرداد 1388, 23:36 عصر
توی این برنامه ای که نوشتین حلقه این کد توجه منو به خودش جلب کرد. بخش کنترلی حلقه به این صورته :

for (int i = step; i < 1000; i++)
و متغیر step هر دفعه یکی بهش اضافه میشه.
اگه اینجوری باشه که هر دفعه مراحل از step تا 1000 تکرار میشه و دفعه بعد این مراحل یکی کم میشه. یعنی به جای اجرای 1000 مرحله چندین هزار مرحله حلقه اجرا میشه. این خودش بار اضافی روی برنامه اعمال نمی کنه؟؟؟

daniel_0247
پنج شنبه 29 مرداد 1388, 17:33 عصر
با سلام !
من یه مقاله در مورد BackGroundWorker نوشتم ، فکر می کنم بهتون کمک کنه .

دانلود -لینک مستقیم (http://www.fileden.com/files/2009/8/18/2547979/BackGroundWorker.pdf)

My Weblog = http://prohardcoding.blogfa.com

Sajjad.Aghapour
پنج شنبه 29 مرداد 1388, 19:13 عصر
اگه اینجوری باشه که هر دفعه مراحل از step تا 1000 تکرار میشه و دفعه بعد این مراحل یکی کم میشه. یعنی به جای اجرای 1000 مرحله چندین هزار مرحله حلقه اجرا میشه. این خودش بار اضافی روی برنامه اعمال نمی کنه؟؟؟

متوجه منظورتون نشدم.من فقط برای نگه داشتن مقداری که روی اون pause شده از step استفاده کردم ......
کارهای زیادی میشه کرد.مثلا در برنامه قبل من از delegate برای اضافه کردن آیتم های listBox استفاده کردم درحالیکه میشه از userState هم استفاده کرد......
کامنت هایی هم براتون گذاشتم.....

mahmood3d
پنج شنبه 29 مرداد 1388, 19:21 عصر
ممنون دوست عزیز
مقالتون به دردم خورد ولی اگه می تونید جزوتون رو کامل تر کنید و در مورد Invoke اشیاء مختلف و Delegate ها هم توضیح بدین.
البته اگه بتونید و تکه کدی که دوستمون تو چند پست قبلی اینجا گذاشتند رو تشریح کنید خیلی ممنون می شم.

mahmood3d
جمعه 30 مرداد 1388, 12:09 عصر
سلام دوستان
قبل از اینکه صحبت هام رو عرض کنم از آقا سجاد تشکر می کنم که این نمونه کوچیک رو نوشت و توضیحاتش رو هم اضافه کرد. من در مورد این برنامه ها 2 تا سؤال داشتم.
اول اینکه توی دومین برنامه که شما توضیحات رو اضافه کردین یک Delegate بود که حذف کردین. البته توی برنامه ای که از این استفاده کرده بودین مقدار i از طریق همین Delegate انتقال داده میشد که در برنامه دوم مستقیما به BGworker ارسال شد و توی لیست باکس چاپ شد. بودن یا نبودن Delegate چه فرقی توی کارکرد برنامه داره؟
دوم مربوط میشه به کدهای اجرا شده در زمان اجرا برنامه. من اینطور فهمیدم که برای اینکه در طول اجرای برنامه کدها اجرا بشن باید در داخل Progresschange شیء bgworker نوشته بشه. که من توی برنامه دومی که ارسال کردین بعد از اضافه کردن عدد به لیست یک عبارت دیگه رو هم به لیست اضافه کردم که تو برنامه تغییری دیده نشد. یعنی اون خط کدی که من نوشتم اجرا نشد ولی تو برنامه اولی که از Delegate استفاده کرده بودین یک تابع تعریف شده بود که به وسیله اون کدها اجرا میشد من تغییرات رو اعمال کردم و تو خروجی تأثیر گذاشت.
الان مشکلم اینه که برای نوشتن کد ها اون هارو باید کجا نوشت؟ تو Progresschange یا DoWork؟

Sajjad.Aghapour
جمعه 30 مرداد 1388, 13:43 عصر
نگاه کنید ...
delegate کاربرد های زیادی داره که یکیش هم همین Asyncronouse هست.وقتی شما داخل یک Thread کاری رو انجام بدید(در این جا رویداد DoWork) ،دستتون در بعضی نقاط بسته میشه مثلا دستکاری عناصر UI. شما داخل رویداد DoWork نمی تونید اعداد رو به listBox اضافه کنید پس مجبورید از غیرهمزمانی استفاده کنید...
غیر همزمانی در اینجا به دو صورت هست:
یکی اینکه از رویداد ProgressChenge که برای نشان دادن پیشرفت کار هست استفاده کنید همون طوری که در نمونه دومی من پارامترها رو از طریق UserState به این رویداد فرستادم و در اونجا ازش استفاده کردم.....
یکی هم استفاده از Delegate بود که در نمونه اول دید....

حالا اینکه میگید من کدی رو اضافه کردم و تغییرات مشاهده نشد ،نمی دونم چی کار کردید !!.......
کدتون رو بذارید تا اگه دوستان تونستن کمک کنن....
...
موفق باشید....
...