نمایش نتایج 1 تا 10 از 10

نام تاپیک: برنامه های چند نخی و backgroundWorkers

  1. #1
    کاربر دائمی
    تاریخ عضویت
    مهر 1386
    محل زندگی
    تبریز
    پست
    159

    Post برنامه های چند نخی و backgroundWorkers

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

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

  2. #2
    کاربر تازه وارد آواتار Editali
    تاریخ عضویت
    تیر 1386
    محل زندگی
    تهران
    پست
    72

    نقل قول: برنامه های چند نخی و backgroundWorkers

    فکر خوبیه.

    BackgroundWorker:

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

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

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

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

  3. #3

    نقل قول: برنامه های چند نخی و backgroundWorkers

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

  4. #4
    VIP آواتار Sajjad.Aghapour
    تاریخ عضویت
    مهر 1386
    محل زندگی
    اهل کاشانم .. روزگارم بد نیست
    پست
    1,265

    نقل قول: برنامه های چند نخی و backgroundWorkers

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

    نمی دونم قصد این تاپیک آموزش هست یا چیز دیگه.چون گفتن اینکه نشان دادن پیشرفت عملیات بستگی به پیاده سازی داره.برای مثال نمایش میزان پیشرفت دانلود یک فایل از اینترنت و لود دیتا از دی بی با هم دیگه فرق می کنه.....
    Close your eyes, take a deep breath, click your heels three times, and say, "There's no better thing than Inversion of Control and Dependency Injection, generic specialization, the decorator pattern, chains of responsibilities, and extensible software."

  5. #5
    کاربر تازه وارد آواتار Editali
    تاریخ عضویت
    تیر 1386
    محل زندگی
    تهران
    پست
    72

    نقل قول: برنامه های چند نخی و backgroundWorkers

    یه نمونه از کاربرد نخها:

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

  6. #6
    VIP آواتار Sajjad.Aghapour
    تاریخ عضویت
    مهر 1386
    محل زندگی
    اهل کاشانم .. روزگارم بد نیست
    پست
    1,265

    نقل قول: برنامه های چند نخی و backgroundWorkers

    یه نمونه از کاربرد نخها:
    یکی از تصورهای اشتباه در مورد نخ ها هم می تونه همین باشه که به هر حلقه ای رسیدیم اون رو در یه نخ پیاده کنیم.کاربرد زیاد نخ در برنامه نه تنها یه مزیت حساب نمیشه بلکه اصلا پیشنهاد نمیشه.....
    ..
    دوست عزیز این کاری که شما کردی توی مسنجرت رو میشه با یه کلاس حلش کرد.لزومی نداره که listener رو به دلیل اینکه در یه حلقه بی نهایت استفاده میشه در یه نخ جدا پیاده سازیش کنی.......
    Close your eyes, take a deep breath, click your heels three times, and say, "There's no better thing than Inversion of Control and Dependency Injection, generic specialization, the decorator pattern, chains of responsibilities, and extensible software."

  7. #7
    کاربر تازه وارد آواتار Editali
    تاریخ عضویت
    تیر 1386
    محل زندگی
    تهران
    پست
    72

    نقل قول: برنامه های چند نخی و backgroundWorkers

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

  8. #8
    کاربر دائمی
    تاریخ عضویت
    مهر 1386
    محل زندگی
    تبریز
    پست
    159

    نقل قول: برنامه های چند نخی و backgroundWorkers

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

    backgroundworker Bk = new backgroundworker();

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

    bk.DoWork += new DoWorkEventHandler(function1);

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

  9. #9
    کاربر تازه وارد آواتار Editali
    تاریخ عضویت
    تیر 1386
    محل زندگی
    تهران
    پست
    72

    نقل قول: برنامه های چند نخی و backgroundWorkers

    نقل قول نوشته شده توسط rnm123 مشاهده تاپیک
    اما اینکه دوست عزیز 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();
    }

  10. #10
    کاربر دائمی
    تاریخ عضویت
    مهر 1386
    محل زندگی
    تبریز
    پست
    159

    نقل قول: برنامه های چند نخی و backgroundWorkers

    نقل قول نوشته شده توسط Editali مشاهده تاپیک
    دوست عزیز بهتره اینو امتحان کنی و ببینی که در این حالت نمیتونی نخ رو به حالت Interrupt ببری و حتما باید دستور یا حلقه جاری به پایان برسه و یا نخ Abort یا Suspend بشه.
    [/ltr]
    دوست عزیز حرف شما را کاملا قبول دارم. بنده این مورد راتست کردم و متعجب هم شدم. راستی عزیز گرامی چرا ما را بیشتر از معلومات خودتان بهره مند نمی کنی؟
    واقعا دلم میخواد در این زمینه بیشتم بدونم
    باز هم متشکرم

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •