PDA

View Full Version : سوال: نوشتن backgroundworker برای اجرای یک حلقه for



sajadzare
یک شنبه 20 مرداد 1392, 17:31 عصر
سلام. من زیاد جستجو کردم هم توی این سایت هم سایتهای خارجی ولی یه آموزش خوب پیدا نکردم که متوجه مفهوم backgroundworker بشم . ببینید دوستان من یه حلقه for دارم که توی این حلقه عملیات زیادی انجام میشه و زمانی که این حلقه شروع به کار میکنه نرم افزار من در حالت قفل میمونه و هیچگونه عملیاتی دیگه با فرم نمیشه کرد تا زمانیکه حلقه به پایان برسه. من توی این فرم یه دکمه دیگه هم دارم که اونم یه حلقه فور دیگه داره برای اجرا.... من میخوام دو تا کار بکنم هم زمان بتونم این دو تا حلقه رو اجرا کنم یعنی بتونم هر وقت خواستم در حالیکه حلقه اول در حال اجراست به فرمم دسترسی داشته باشم و حلقه دوم هم بتونم اجرا کنم. در واقع میخوام فرمم هنگ نکنه. من احساس میکنم multi threading به دردم نمیخوره اگه بتونین با backgroundworker بگین چیکار کنم ممنون میشم. اگه من بیام برای هر حلقه یه تابع تعریف کنم و اون تابع رو به متد _doWork بدم بتونم جواب بگیرم ولی نمیدونم اصول کار چجوریه .

esafb52
یک شنبه 20 مرداد 1392, 18:03 عصر
در امضا جناب استاد جمشیدی یه آموزش خوبbackgroundworker هست دانلودش کن

mousa1992
یک شنبه 20 مرداد 1392, 18:04 عصر
سلام
backgroundworker در واقع میاد پیاده سازی multi threading رو راحت میکنه
نمونه پیوست شده رو بررسی کنین و ازش نمونه بگیرید
شما میتونید توی رویداد DoWork حلقه هاتونو بنویسید

موفق باشید

sajadzare
یک شنبه 20 مرداد 1392, 22:39 عصر
ببینید دوستان. من سه تا تکست باکس روی فرم دارم و یه باتن. من وقتی باتن رو کلیک میکنم اول میاد و ورود صحیح اطلاعات توی این سه تا تکست باکس رو بررسی میکنه بعد در صورت صحیح بودن فرمت ورودی ها حلقه مورد نظر اجرا میشه. و درون حلقه هم اطلاعات به فرم ارسال میشه که مثلا 1 نامه ارسال شد 2 نامه ارسال شد و همین طور تا اتمام کامل حلقه. من وقتی میام حلقه رو میزارم توی متد dowork به قسمتهایی که مربوط به فرم میشه مثل چک کردن تکست باکسها یا ارسال اطلاعات به فرم ارور میده که اینها توی یه thread دیگه هستند که همون UI باشه. این یه مشکل..... مشکل دومم اینه که توی بدنه حلقه من اجرای مرورگر رو دارم که وقتی به این قسمت هم میرسه ارور میده که
The CurrentThread needs to have it's ApartmentState set to ApartmentState.STA to be able to automate Internet Explorer

چطور میتونم این مشکلات رو حل کنم

mousa1992
یک شنبه 20 مرداد 1392, 22:54 عصر
برا چک کردن فرمت های ورودی که نیاز به حلقه نیست ؛ زمانی که باتن رو کلیک میکنی همونجا چک میکنی که اگه درست بود اطلاعات رو پاس بده در غیر این صورت ... و یا اگه دوس نداشتی تو رویداد textChanged این کارو انجام بده و برا دسترسی به ترد اصلی برنامه باید اطلاعاتی که بدست میاری توی رویداد DoWork رو بفرستی به متد ProgressChanged و از اونجا میتونی تغییراتو روی فرمت اعمال کنی ، که اگه ی بار دیگه پروژه نمونه رو با دقت بیشتر بررسی کنی متوجه این موضوع و روش انجام کار میشی و اما در مورد مرورگرتون چیزی نمیدونم تابحال نیازم نشده باهاش کار نکردم
اصلا این ترد رو برا چه عملیاتی نیاز داری ؟

sajadzare
یک شنبه 20 مرداد 1392, 23:29 عصر
من حلقه رو برای چک کردن نذاشتم قبل از شروع حلقه یه if گذاشتم که اگه تکست باکسها خالی نبودند شروع کنه . حلقه من این طوره که میاد مرورگر اکسپلورر رو باز میکنه یه سایت رو باز میکنه و یه عملیاتی رو توی اون سایت انجام میده و سایت رو می بنده و دوباره حلقه تکرار میشه تا زمانی که به تعداد دلخواهی که ما تعریف کردیم مثلا 20 بار اینکار انجام بشه و هربار که عملیات انجام میشه یه پیغام توی فرم اصلیم با یه لیبل نمایش میده که مثلا 1 نامه با موفقیت ارسال شد. من باز کردن سایت رو با کامپوننت WatiN انجام دادم.