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

نام تاپیک: ایجاد نخ یا ورکرهای تودرتو

  1. #1
    کاربر دائمی آواتار رامین مرادی
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    آذربایجان
    پست
    1,961

    Question ایجاد نخ یا ورکرهای تودرتو

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


    //start main code
    {
    //Run Worker1
    }




    //worker1 method
    {
    for (int i = 0; i < 254; i++)
    {
    //my code
    if (Result == "OK")
    {
    //Run Worker2(Arguman->Result)
    }
    }
    }


    //worker2 method
    {
    //my code
    //Result+=this method result
    }
    //Worker1 Complate method
    {
    Consol.WriteLine("Result");
    }



    الگوریتم کاریم تقریبا به صورت بالا هست. آیا واقعا همچین چیزی امکانش هست؟
    اون حلقه رو باید بیرون از ورکر 1 بنویسم؟

  2. #2

    نقل قول: ایجاد نخ یا ورکرهای تودرتو

    اینطور نمیشه نظر داد. کد کامل بگذارید.

  3. #3
    کاربر دائمی آواتار رامین مرادی
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    آذربایجان
    پست
    1,961

    نقل قول: ایجاد نخ یا ورکرهای تودرتو

    نقل قول نوشته شده توسط Mahmoud.Afrad مشاهده تاپیک
    اینطور نمیشه نظر داد. کد کامل بگذارید.
    این کد رو ببینید الان این کد پوشه ای به تعداد ورودی ایجاد میکنه و در داخل هر پوشه صد پوشه جدید درست میکنه.



    private void button1_Click(object sender, EventArgs e)
    {
    int i=int.Parse(textBox1.Text);
    progressBar1.Maximum = i-1;
    progressBar2.Maximum = 99;
    backgroundWorker1.RunWorkerAsync(i);
    }
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
    int i = int.Parse(textBox1.Text);
    for (int j = 0; j < i; j++)
    {
    Directory.CreateDirectory("D:\\TestWork"+j.ToStrin g());
    backgroundWorker2.RunWorkerAsync(j);
    backgroundWorker1.ReportProgress(j);
    }
    }


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


    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    progressBar1.Value = 0;

    }


    private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
    {
    int j=int.Parse(e.Argument.ToString());
    for (int i = 0; i < 100; i++)
    {
    Directory.CreateDirectory("D:\\TestWork" + j.ToString()+""+i.ToString());
    backgroundWorker2.ReportProgress(i);
    }

    }


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


    private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    progressBar2.Value = 0;
    }



    حالا این دوتا تداخل ایجاد میکنن. و کار دومی تموم نشده اولی دوباره دومی رو دوباره فراخوانی میکنه که خطای مشغول بودن میده.
    آخرین ویرایش به وسیله رامین مرادی : سه شنبه 22 آبان 1397 در 15:41 عصر

  4. #4

    نقل قول: ایجاد نخ یا ورکرهای تودرتو

    سلام
    خب توی این کد شما دقیقا چه لزومی به استفاده از ورکر دوم هست؟ کار ورکر دوم رو داخل حلقه ورکر اول هم میشه انجام داد کدتون خواناتر و تمیزتر هم میشه و دیگه نیازی به این همه ایونت نخواهد بود. اما دلیلتون چیه که از دوتا ورکر استفاده میکنین؟ (مگه اینکه کار اصلی ای که میخواین انجام بدین به سادگی ایجاد کردن پوشه نباشه)

  5. #5
    کاربر دائمی آواتار رامین مرادی
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    آذربایجان
    پست
    1,961

    نقل قول: ایجاد نخ یا ورکرهای تودرتو

    نقل قول نوشته شده توسط mr.sirwan مشاهده تاپیک
    سلام
    خب توی این کد شما دقیقا چه لزومی به استفاده از ورکر دوم هست؟ کار ورکر دوم رو داخل حلقه ورکر اول هم میشه انجام داد کدتون خواناتر و تمیزتر هم میشه و دیگه نیازی به این همه ایونت نخواهد بود. اما دلیلتون چیه که از دوتا ورکر استفاده میکنین؟ (مگه اینکه کار اصلی ای که میخواین انجام بدین به سادگی ایجاد کردن پوشه نباشه)
    بله درسته میشه داخل همون ورکر یک انجام داد ولی خب حجم کاری که انجام میگیره زیاده و بنابر دسترسی به منابعی که سرعت پایینی دارن نمیخوام سیستم هنگ بکنه .همجنین وقتی داخل ورکر یک اینکار انجام میشه سیستم کامل هنگ میکنه تا اتمام کار و خروجی رو یکباره چاپ میکنه.ولی با استفاده از دوتا ورکر همچین مشکلی پیش نمیاد.

  6. #6

    نقل قول: ایجاد نخ یا ورکرهای تودرتو

    به احتمال قریب به یقین به دفعات UI را درگیر میکنید و یا فاصله تغییر در UI کم هست به همین دلیل رابط کاربری هنگ میکند.

  7. #7
    کاربر دائمی آواتار رامین مرادی
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    آذربایجان
    پست
    1,961

    نقل قول: ایجاد نخ یا ورکرهای تودرتو

    نقل قول نوشته شده توسط Mahmoud.Afrad مشاهده تاپیک
    به احتمال قریب به یقین به دفعات UI را درگیر میکنید و یا فاصله تغییر در UI کم هست به همین دلیل رابط کاربری هنگ میکند.
    UI رو بله یکی دوبار داخل ورکر یک فراخوانی میکنم. حالا ممنون میشم اگه راه حلی دارید برا این مورد بگید. از اینکه نمیتونم سورس اصلی رو اینجا بزارم پوزش میطلبم
    ورکر یک یک حلقه ای رو آغاز میکنه
    فعالیتشو انجام میده
    مقدار بدست اومده رو به ورکر دو پاس میده
    ورکر دو حلقه ای رو اجرا میکنه و نتیجه رو داخل یه متغییر ذخیره میکنه
    ورکر یک نتیجه خودش و نتیجه موجود تو متغییر رو میخونه و در دیتاگرید ثبت میکنه.و میره گام دیگه ای از حلقه رو اجرا کنه.

    این کل فعالیتیه که انجام میشه. اگه راه حل دیگه ای دارید ممنون میشم راهنماییم کنید. فقط مسئله اصلی اینه برنامه هنگ نکنه(جلوی سایر فعالیت هارو بگیره مشکلی نیست اما نباید هنگ بکنه)

  8. #8

    نقل قول: ایجاد نخ یا ورکرهای تودرتو

    متد ReportProgress رو داخل حلقه ها فراخوانی میکنید؟ تعداد تکرار حلقه ها چندتاست؟
    اگر ورکر1 صبر میکنه تا ورکر2 کارش تمام بشه این یعنی نیازی به ورکر2 نیست و بایست کدها در ورکر1 ادغام بشوند.

  9. #9
    کاربر دائمی آواتار رامین مرادی
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    آذربایجان
    پست
    1,961

    نقل قول: ایجاد نخ یا ورکرهای تودرتو

    نقل قول نوشته شده توسط Mahmoud.Afrad مشاهده تاپیک
    متد ReportProgress رو داخل حلقه ها فراخوانی میکنید؟ تعداد تکرار حلقه ها چندتاست؟
    اگر ورکر1 صبر میکنه تا ورکر2 کارش تمام بشه این یعنی نیازی به ورکر2 نیست و بایست کدها در ورکر1 ادغام بشوند.
    آره داخل حلقه فراخوانی میکنم.
    تعداد حلقه ورکر یک از 1 تا 254 میتونه باشه.
    حلقه ورکر دو میتونه از 1 تا مثلا 6000 تا هم باشه.
    وقتی میارم داخل حلقه یک متسفانه بعد از انجام همه به یکباره خروجی میده.نه اینکه مرحله به مرحله.

  10. #10

    نقل قول: ایجاد نخ یا ورکرهای تودرتو

    نقل قول نوشته شده توسط رامین مرادی مشاهده تاپیک
    آره داخل حلقه فراخوانی میکنم.
    تعداد حلقه ورکر یک از 1 تا 254 میتونه باشه.
    حلقه ورکر دو میتونه از 1 تا مثلا 6000 تا هم باشه.
    وقتی میارم داخل حلقه یک متسفانه بعد از انجام همه به یکباره خروجی میده.نه اینکه مرحله به مرحله.
    مقدار ماکزیمم progressBar ها را بذارید 100 باشه.
    یک متغیر به عنوان «درصد پیشرفت قبلی» نیاز دارید تا درصد پیشرفت جدید را با اون مقایسه کنید.
    قبل از فراخوانی متد ReportProgress درصد پیشرفت را محاسبه کنید. مثلا اگر تعداد نهایتا 6000 باشه کافیه شمارنده حلقه را تقسیم بر 6000 بعد حاصل رو ضرب در 100 کنید . نتیجه را با «درصد پیشرفت قبلی» مقایسه کنید، اگر متفاوت بود به عنوان پارامتر به ReportProgress ارسال کنید.
    با این کار فقط زمانی UI درگیر میشه که درصد پیشرفت تغییر کند.

تاپیک های مشابه

  1. پاسخ: 2
    آخرین پست: چهارشنبه 14 تیر 1396, 14:17 عصر
  2. سوال: چطور می توانم منوی تو در تو ایجاد کنم
    نوشته شده توسط refaraji در بخش ASP.NET Web Forms
    پاسخ: 0
    آخرین پست: سه شنبه 22 مهر 1393, 22:10 عصر
  3. سوال: چگونه می توانم از دستور Where تو در تو استفاده کنم بعلاوه اینکه یکی از فیلدها هم جمع زده شود؟
    نوشته شده توسط drahmadtaraffoo در بخش بانک های اطلاعاتی در Delphi
    پاسخ: 4
    آخرین پست: دوشنبه 12 اردیبهشت 1390, 17:47 عصر
  4. پاسخ: 2
    آخرین پست: پنج شنبه 11 آذر 1389, 14:36 عصر
  5. من چگونه می توانم تایید هویت تودرتو را پیاده سازی کنم
    نوشته شده توسط asgari2005 در بخش ASP.NET Web Forms
    پاسخ: 1
    آخرین پست: دوشنبه 16 خرداد 1384, 18:55 عصر

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

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