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

نام تاپیک: اجرای همزمان چند ترد

  1. #1
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    دیار کریمان
    پست
    1,008

    Post اجرای همزمان چند ترد

    سلام
    چندین تابع طراحی شده که باید همزمان اجرا شن
    به این صورت تردها طراحی کردم اما همزمان انجام نمی شن و بصورت پشت سر هم اجرا میشن
    لطفا کد ببینید
                t_3 = newThread(anjam_3);
    t_3.IsBackground = true;
    t_3.Start();



    t_3_2 = newThread(anjam_3_2);
    t_3_2.IsBackground = true;
    t_3_2.Start();



    t_3_3 = newThread(anjam_3_3);
    t_3_3.IsBackground = true;
    t_3_3.Start();


    تشکر

  2. #2

    نقل قول: اجرای همزمان چند ترد

    اینها به صورت همزمان اجرا میشوند(البته از دید کاربر)
    یک احتمال وجود دارد که توابع خیلی زود کارشون تموم میشن و شما احساس میکنید پشت سر هم اجرا میشوند

  3. #3
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    دیار کریمان
    پست
    1,008

    نقل قول: اجرای همزمان چند ترد

    تشکر
    هر تابع در تکست باکس های متفاوت اعدادی نمایش میده (شمارنده) و کاملا مشخص که به ترتیب انجام میشن
    در توابع از تایمر استفاده شده

  4. #4
    کاربر دائمی
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    پست
    1,629

    نقل قول: اجرای همزمان چند ترد

    سلام
    بدون دیدن کد، سخت می‌شه حدس زد که مشکل جیه. یکی از اتفاق‌هایی که باعث ‌می‌شه 3 تا Thead همزمان اجرا نشن این هست که
    اولین ترد یک شیء رو قفل کنه و بقیه منتظرش بمونن. شاید هم مشکل از تابع نمایش خروجی باشه که درست نمایش نمی‌ده.
    اما کدی که تو پست خودتون گذاشتین اشکالی نداره. جای دیگه باید دنبال مشکل گشت.

    صبا صبوحی

  5. #5
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    دیار کریمان
    پست
    1,008

    نقل قول: اجرای همزمان چند ترد

    نقل قول نوشته شده توسط SabaSabouhi مشاهده تاپیک
    سلام
    بدون دیدن کد، سخت می‌شه حدس زد که مشکل جیه. یکی از اتفاق‌هایی که باعث ‌می‌شه 3 تا Thead همزمان اجرا نشن این هست که
    اولین ترد یک شیء رو قفل کنه و بقیه منتظرش بمونن. شاید هم مشکل از تابع نمایش خروجی باشه که درست نمایش نمی‌ده.
    اما کدی که تو پست خودتون گذاشتین اشکالی نداره. جای دیگه باید دنبال مشکل گشت.

    صبا صبوحی
    سلام
    هر تابع به شي مختص خودش دسترسي داره (اشيا مشترك نيست)
    فقط موردي كه هست براي دسترسي به اشيا روي فرم از invoke‌استفاده كردم چون دفعات دسترسي در تابع مذكور زياد بود اكثر كدها داخل invoke‌ حتي دستور وقفه
    براي همين گاها رفتارهاي متناقض ديده ميشه (در ترتيب اجرا سه تابع)!

  6. #6
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    دیار کریمان
    پست
    1,008

    نقل قول: اجرای همزمان چند ترد

    با خروج دستور وقفه از تابع invoke‌مورد حل شد

    اما مطلب ديگه اي پيش اومد
    مي خوام برنامه تا پايان انجام موفقيت آميز اين سه ترد كار ديگه اي انجام نده يا اصطلاحا منتظر پايان اين تردها بماند
    از 3 فلگ استفاده كردم كه در پايان توابع true مي شوند
    اما اين دستور انجام نمي شود
     
    //پس از اتمام مراحس سه وارد مرحله چهار شود و انها را نیز به صورت موازی انجام دهد
    if (flag_3 == true && flag_3_2 == true && flag_3_3 == true)
    {


    t_4 = new Thread(anjam_movazi_marhale_4);
    t_4.IsBackground = true;
    t_4.Start();


    t_4_2 = new Thread(anjam_movazi_marhale_4_2);
    t_4_2.IsBackground = true;
    t_4_2.Start();

    }

    if (flag_4 == true && flag_4_2 == true)
    {


    تشكر

  7. #7
    کاربر دائمی
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    پست
    1,629

    نقل قول: اجرای همزمان چند ترد

    سلام
    از EventWaitHandle استفاده کن. البته به ازای هر کدوم از Threadها یکی باید استفاده کنی.
    تو برنامه اصلی برای هر سه Wait کن، و پیش از تموم شدن هر کدوم از Threadها Set کن.
    البته راه‌های دیگه هم داره. مثلاً تو یه حلقه فعال بودن Threadها رو چک کنی که کلی cpu time می‌گیره.

    صبا صبوحی

  8. #8
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    دیار کریمان
    پست
    1,008

    نقل قول: اجرای همزمان چند ترد

    نقل قول نوشته شده توسط SabaSabouhi مشاهده تاپیک
    سلام
    از EventWaitHandle استفاده کن. البته به ازای هر کدوم از Threadها یکی باید استفاده کنی.
    تو برنامه اصلی برای هر سه Wait کن، و پیش از تموم شدن هر کدوم از Threadها Set کن.
    البته راه‌های دیگه هم داره. مثلاً تو یه حلقه فعال بودن Threadها رو چک کنی که کلی cpu time می‌گیره.

    صبا صبوحی
    سلام
    وقت بخیر
    ممنونم واسه جوابهاتون
    اما بنده دقیقا نمیدونم این کد کجا و چجوری باید استفاده کرد
    تشکر

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

    Red face نقل قول: اجرای همزمان چند ترد

    سلام .
    در مورد مشکل اولتون یعنی عدم همزمانی تردها همان طور که خودتون گفتید به علت invoke و دسترسی به منبعی که باعث lock شدن می شود تردها همزمان اجرا نمیشودن .
    و اما مشکل دوم یعنی انجام موفقیت آمیز 3 ترد ...؟!
    مطلب اول در مورد موفقیت آمیز بودن : با این روشی که شما کد نوشتید پی بردن به موفقیت آمیز بودن کار سختیه بنظر میاد و بهتر وارد این بحث نشیم . ولی در مورد اینکه تا 3 ترد کارشان تمام نشده کار دیگری انجام نشود یه راه غیر اصولی هست و اون هم استفاده از دستور :

    Lock
    {
    .
    ...
    }


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

    به عنون مثال :

    class Program
    {
    static void func1()
    {
    try
    {
    Console.WriteLine("enter th1");

    for (int i = 1; i < 100; i++)
    {
    Thread.Sleep(100);
    Console.WriteLine("th1" + "--->" + i);
    }

    }
    Console.WriteLine("exit th1");
    }

    static void func2()
    {
    Console.WriteLine("enter th2");

    for (int i = 1; i < 100; i++)
    {
    Thread.Sleep(100);
    Console.WriteLine("th2"+"--->"+i);
    }
    Console.WriteLine("exit th2");

    }

    static void func3()
    {
    Console.WriteLine("enter th3");

    for (int i = 1; i < 10; i++)
    {
    Thread.Sleep(100);
    Console.WriteLine("th3" + "--->" + i);
    }
    Console.WriteLine("exit th3");

    }
    static readonly object _object = new object();
    static void Main(string[] args)
    {
    Thread th1 = new Thread(new ThreadStart(func1));
    Thread th2 = new Thread(new ThreadStart(func2));
    lock (_object)
    {
    Console.WriteLine("enter main thread ");

    th1.Start();


    th2.Start();
    Console.ReadKey();
    }
    Thread th3 = new Thread(new ThreadStart(func3));
    th3.Start();
    Console.ReadKey();


    }
    }



    تا زمانی که ما دسترسی به کنسول را قفل کرده ایم فقط ترد 1 و ترد 2 انجام می شود و بعد از اتمام آن ترد 3 انجام می شود . البته الویت انجام ترد 1 و 2 را خودش برحسب ترد های آزاد در سیستم انجام میدهد .
    موفق باشید .

  10. #10
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    دیار کریمان
    پست
    1,008

    نقل قول: اجرای همزمان چند ترد

    سلام
    واسه تفهیم بیشتر یه نمونه کد گذاشتم

    مشگل اینجاست تا پایان کار ، دستورات منتظر خواهند ماند اما عمل رفرش لیبل ها نمایش داده نمی شود !!!!
    دوستان لطف میکنن ببین
    نظرشرون بدن
    تشکر
    فایل های ضمیمه فایل های ضمیمه

  11. #11
    کاربر دائمی
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    پست
    1,629

    نقل قول: اجرای همزمان چند ترد

    سلام
    راستش نمی‌دونم چطوری تو چند خلاصه بگم که کافی باشه. مطمئن هستم که اگه جستجو کنی جواب‌های کاملی پیدا می‌کنی.
    اما خلاصه اینه:
    1. تو کد اصلی به ازای هر کدوم از Threadها یه متغیر از جنس EventWaitHandle رو new می‌کنی.
    2. با ایجاد هر Thread متغیر متناظرش رو بهش بده و Thread رو Start کن.
    3. تو همون کد اصلی پس از ایجاد و شروع کردن کلیه Threadها متد WaitOne رو برای تمام EventWaitHandle فراخوانی کن.
    4. تو هر Thread در پایان کار برای EventWaitHandle مربوطه، متد Set رو فراخوانی کن.

    این یک راه حل اصولی نیست، اما کار شما رو راه می‌اندازه.
    صبا صبوحی

    پانوشت: اگه وقتم اجازه بده شاید روش کار با Threadها رو با مثال بنویسم و بگذارم اینجا.

  12. #12
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    دیار کریمان
    پست
    1,008

    نقل قول: اجرای همزمان چند ترد

    نقل قول نوشته شده توسط SabaSabouhi مشاهده تاپیک
    سلام
    راستش نمی‌دونم چطوری تو چند خلاصه بگم که کافی باشه. مطمئن هستم که اگه جستجو کنی جواب‌های کاملی پیدا می‌کنی.
    اما خلاصه اینه:
    1. تو کد اصلی به ازای هر کدوم از Threadها یه متغیر از جنس EventWaitHandle رو new می‌کنی.
    2. با ایجاد هر Thread متغیر متناظرش رو بهش بده و Thread رو Start کن.
    3. تو همون کد اصلی پس از ایجاد و شروع کردن کلیه Threadها متد WaitOne رو برای تمام EventWaitHandle فراخوانی کن.
    4. تو هر Thread در پایان کار برای EventWaitHandle مربوطه، متد Set رو فراخوانی کن.

    این یک راه حل اصولی نیست، اما کار شما رو راه می‌اندازه.
    صبا صبوحی

    پانوشت: اگه وقتم اجازه بده شاید روش کار با Threadها رو با مثال بنویسم و بگذارم اینجا.
    سلام
    تشکر
    بنده نمونه کدی نوشتم
    بر پایه همین توضیحات شما که
    اما مورد جدیدی به وجود آمده
    لطفا نمونه کد پست قبل بینید
    تشکر

  13. #13
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    دیار کریمان
    پست
    1,008

    نقل قول: اجرای همزمان چند ترد

    سلام
    ممنون میشم اگه دوستان اون نمونه کد دانلود و اجرا کنن
    و بگن چرا ویژوال استدیو نمی تونه متن داخل لیبل همزمان با اجرای ترد رفرش کنه !!!!!
    تشکر

  14. #14
    کاربر دائمی
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    پست
    1,629

    نقل قول: اجرای همزمان چند ترد

    سلام
    اشکال کار شما اینه که روند عادی برنامه رو با wait کردن فلج کردی.
    تو یه فرم ویندوزی نباید مستقیماً wait کنی.
    تو کد دکمه‌ی خودت بجای فراخوانی متد این کار رو بکن:

    var thread = new Thread( anjam_movazi );
    thread.Start();



    مشکلت حل می‌شه. و خواهش می‌کنم سعی کن تو نام‌گذاری بجای PINGLISH از واژه‌های انگلیسی استفاده کنی.
    در غیر این صورت فقط خودت مشتری کار خودت خواهی بود. شاید اولش کمی سخت باشه، اما ارزشش رو داره.

    صبا صبوحی

  15. #15
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    دیار کریمان
    پست
    1,008

    نقل قول: اجرای همزمان چند ترد

    سلام
    واسه وقتي كه گذاشتين يه دنيا ممنون

    //
    از اونجا كه اين يك پروژه كوچك دانشجويي بود و تمام سعي هم بر اين بود كه به كد نويسي مبتدي نزديك باشد از عبارت فينگليش استفاده شده بود

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

  1. اجرای همزمان چند Emulator
    نوشته شده توسط srfarzad در بخش Android Studio
    پاسخ: 7
    آخرین پست: شنبه 01 بهمن 1390, 00:02 صبح
  2. اجرای همزمان چند دستور
    نوشته شده توسط omid-vbAuto در بخش VB.NET
    پاسخ: 12
    آخرین پست: پنج شنبه 23 دی 1389, 22:03 عصر
  3. جلوگیری از اجرای همزمان چند نسخه از نرم افزار
    نوشته شده توسط mohammadjp در بخش برنامه نویسی در 6 VB
    پاسخ: 2
    آخرین پست: پنج شنبه 02 دی 1389, 18:29 عصر
  4. سوال: اجرای همزمان چند تابع در ++C
    نوشته شده توسط arshadtehrani در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 2
    آخرین پست: شنبه 22 خرداد 1389, 00:38 صبح

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

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