PDA

View Full Version : گفتگو: برنامه های چند نخی و backgroundWorkers



rnm123
دوشنبه 03 فروردین 1388, 10:45 صبح
سلام به همگی .
با توجه به اهمیت موضوع چندنخی بودن برنامه و امکانات فوق العاده ای که این مهم برای برنامه ها میتواند فراهم نماید و با توجه به کمبود منابع مفید و البته جامع در این زمینه با اجازه مدیران تالار خواستم یک گفتگویی در ایممورد ایجاد کنم تا دوستانی که به این موضوع علاقه مند هستند و مطالبی هرچند مختصر و مفید در این زمینه بلد هستد با شرکت در این گفتگو زمینه ایجاد یک منبع اطلاعاتی جامع را برای ایجاد برنامه های چند نخی فراهم نمایند. از دوستانی که علاقه مند به این موضوع هستند و یا در این زمینه کار کرده اند خواهشمندم مارا یاری نمایند. بسم الله.

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

Editali
دوشنبه 03 فروردین 1388, 12:51 عصر
فکر خوبیه.

BackgroundWorker:

عملا یه نخه که به صورت یک کامپوننت دات نت درش آوردن تا کار باهاش راحت بشه.

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

مثلا اگه یه حلقه بینهایت توش اجرا بشه به راحتی نمیتونی کنسلش کنی، چون نخها ذاتا تا زمانی که دستوراتشون به پایان نرسه به هیچ دستور دیگه ای پاسخ نمیدن.

یعنی دستور جدید میره تو صف انتظار که بعد از دستور جاری اجرا بشه.
پس چون نمیتونه از حلقه بیاد بیرون دستوریم بعد از اون اجرا نمیشه.

احمد سامعی
دوشنبه 03 فروردین 1388, 13:31 عصر
سلام به همگی .
با توجه به اهمیت موضوع چندنخی بودن برنامه و امکانات فوق العاده ای که این مهم برای برنامه ها میتواند فراهم نماید و...

دوست عزيز بهتر نيست اول يك تعريف از چند نخي بودن ارائه كنيد بعد شروع آموزش بشه
(البته اين فقط يك پيشنهاد..:خجالت:)

Sajjad.Aghapour
دوشنبه 03 فروردین 1388, 14:24 عصر
دوست عزيز بهتر نيست اول يك تعريف از چند نخي بودن ارائه كنيد بعد شروع آموزش بشه

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

نمی دونم قصد این تاپیک آموزش هست یا چیز دیگه.چون گفتن اینکه نشان دادن پیشرفت عملیات بستگی به پیاده سازی داره.برای مثال نمایش میزان پیشرفت دانلود یک فایل از اینترنت و لود دیتا از دی بی با هم دیگه فرق می کنه.....

Editali
دوشنبه 03 فروردین 1388, 14:54 عصر
یه نمونه از کاربرد نخها:


از موارد استفاده نخ میشه به جاهایی اشاره کرد که یه برنامه باید چندتا کار رو همروند ( در کنار هم) انجام بده. مثلا من خودم یه مسنجر ساختم که باید به چندتا پورت گوش میداد، دیتای رسیده رو پردازش میکرد و به هرکدوم پاسخ مناسب میداد. هر کدوم از این لیسنر ها رو توی یه نخ جدا پیاده کردم. علت اینکارمم اینه که یه listener باید توی یه حلقه بی نهایت اجرا بشه و اگر بدونین برنامه تا وقتی که حلقه به پایان نرسه هیچ واکنشی به هیچ کدوم از ورودیا نمیده، پس برای اینکه برنامه هنگ نکنه هر listener رو تو یه thread جدا اجرا کردم.

Sajjad.Aghapour
دوشنبه 03 فروردین 1388, 15:58 عصر
یه نمونه از کاربرد نخها:

یکی از تصورهای اشتباه در مورد نخ ها هم می تونه همین باشه که به هر حلقه ای رسیدیم اون رو در یه نخ پیاده کنیم.کاربرد زیاد نخ در برنامه نه تنها یه مزیت حساب نمیشه بلکه اصلا پیشنهاد نمیشه.....
..
دوست عزیز این کاری که شما کردی توی مسنجرت رو میشه با یه کلاس حلش کرد.لزومی نداره که listener رو به دلیل اینکه در یه حلقه بی نهایت استفاده میشه در یه نخ جدا پیاده سازیش کنی.......

Editali
دوشنبه 03 فروردین 1388, 16:10 عصر
من این کار رو فقط توی سرورم انجام دادم، چون سرویسهای مختلفی رو باید پیاده میکردم و هر کدوم جریان مختلفی رو دنبال میکردن. به دلیل استفاده بهینه از منابع تنها راه حل این بود توی نخهای جداگانه اجراشون کنم که پرفورمنس پایین نیاد.

rnm123
دوشنبه 03 فروردین 1388, 17:35 عصر
چند نخی کردن برنامه هم خوبه و هم ایراداتی به هر حال خواهد داشت . همانطوری که هر چیزی زیادیش بده .
اما اینکه دوست عزیز editali گفتند که به راحتی نمیشه کنسلش کرد فکرمی کنم درست نیست . اتفاقا یکی از مباحث مهم در نخها همین بحث است که اگه یک عملیات زیاد طول کشید بشه اونو کنسل کرد . از دوستان خواهش می کنم اگه کسی بطور عملی حتی یه سطر کد نوشته و در این زمینه کار کرده سایر دوستان را بی نصیب نگذاره . هدف از این تاپیگ هم گفتگو در مورد این موضوع و تبادل اطلاعات و صد البته آموزش است ان شا الله.
فرض کنید شما در برنامه خود لازم یکسری اطلاعاتی را از یک بانک اطلاعاتی لود کرده و در برنامه خود نمایش دهید . فرض کنید شما لازم است در برنامه خود اطلاعات را از بانک داده ها لود کرده و چاپ بگیرید . فرض کنید کاربر شما 100صفحه اطلاعات را به چاپگر میفرستد. فرض کنید فراخوانی یک فرم شما در برنامه به علت حجیم بودن آن زیاد طول بکشد. فرض کنید شما در برنامه خود عملیات کپی را اجرا میکنید . فرض کنید شما در برنامه خود عملیات پشتیبانگیری از بانک اطلاعاتی را پیاده سازی میکنید و ... . تمامی این عملیات ها وقتگیر هستند و تا زمانی که تمام نشوند کاربر نمی تواند به برنامه دسترسی داشته باشد . در همین ویندوز فرض کنید شما 100 تا فایل را از یک درایو به درایو دیگر کپی میکنید آیا مجبور شدن به صبر کردن برای تمام شدن کپی بهتر است یا اینکه بتوانید در حین کپی مثلا به موسیقی هم گوش فرا بدهید . همین پخش فیلم های استریم از وب خودش وابسته به چند نخی بودن است و ...
اما در مورد نخ ها دوستان عزیز زحمت کشیدند یک سری توضیحاتی دادن. من هم کمی در مورد backgroundWorker میخواهم توضیح بدهم
در این مورد اولین کاری که برنامه نویس انجام میدهد تعریفیک متغیر از نوع backgroundworker است بصورت زیر:


backgroundworker Bk = new backgroundworker();

بعد میتوانید برای این متغیر یک تابع برای مشخص کردن اینکه در این نخ چه کارهایی باید انجام شود بنویسید برای این کار از متد DoWork میتوانید استفاده کنید بصورت زیر :


bk.DoWork += new DoWorkEventHandler(function1);

function هم نام تابعی است که در بالا به آن اشاره شد.
بعد میتوانید برای این متغیر یک تابه معرفی کنید که مشخص کند بعد از اتمام این نخ چه کارهایی باید انجام شود . برای این کار از متد RunWorkerCompleted درست همانند حالت فوق میتوانید استفاده نمایید .
همچنین میتوانید برای این متغیر مشخص کنید که چگونه بر میزان عملکرد خود یک واحد بیفزاید .که این میزان عملکرد متغیر را میتوانید برای تغییر progressBar استفاده نماییدو امکانات دیگر که متاسفانه بیشتر بلد نیستم. بعدا برایتان هم یک نمونه برنامه قرار میدهم که مثال خوبی از برنامه چند نخی که امکانات خوب آنرا را بصورت کاملا ساده بکار برده است
البته چون نتوانستم فایل را آپلود کنم برنامه را حالا قرار ندادم ان شا الله دفعه بعد حتما.
امیدوارم مفید واقع شود
متشکرم

Editali
چهارشنبه 05 فروردین 1388, 17:51 عصر
اما اینکه دوست عزیز editali گفتند که به راحتی نمیشه کنسلش کرد فکرمی کنم درست نیست .


دوست عزیز بهتره اینو امتحان کنی و ببینی که در این حالت نمیتونی نخ رو به حالت Interrupt ببری و حتما باید دستور یا حلقه جاری به پایان برسه و یا نخ Abort یا Suspend بشه.
جالب اینکه حتی اگر برنامه رو به حالت طبیعی ببندی بازهم تسک برنامه در حال اجرائه. (البته اگر abort نشه)


Thread t;
ThreadStart ts;

void Method()
{
while (true) ;
}

private void button1_Click(object sender, EventArgs e)
{
ts = new ThreadStart(Method);
t = new Thread(ts);
t.Start();
t.Interrupt();
}

rnm123
چهارشنبه 05 فروردین 1388, 19:25 عصر
دوست عزیز بهتره اینو امتحان کنی و ببینی که در این حالت نمیتونی نخ رو به حالت Interrupt ببری و حتما باید دستور یا حلقه جاری به پایان برسه و یا نخ Abort یا Suspend بشه.
[/ltr]
دوست عزیز حرف شما را کاملا قبول دارم. بنده این مورد راتست کردم و متعجب هم شدم. راستی عزیز گرامی چرا ما را بیشتر از معلومات خودتان بهره مند نمی کنی؟
واقعا دلم میخواد در این زمینه بیشتم بدونم
باز هم متشکرم:تشویق: