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

نام تاپیک: چگونگی عدم استفاده از method در ایجاد یه thread

  1. #1

    چگونگی عدم استفاده از method در ایجاد یه thread

    سلام دوستان

    من 3 تا کلاس دارم که این 3 تا کلاس رو می خواهم Parallel اجرا کنم .
    در هر سه ی این کلاس ها یه تابع Public هست با این تعریف :


    Public int Find(int [,] Board)

    کاره این تابع اینه که یه سری کارهایی رو روی آرایه Board انجام می ده و نتیجه رو بر می گردونه .

    من برای اینکه بتونم این سه تابع از سه تا کلاس رو موازی کنم به صورت کد زیر از thread استفاده می کنم .


    class1 newOBJ = new class1();
    Thread thread1 = new Thread ( new ThreadStart (newOBJ.Find(AA);


    حتما می دونید که به کد بالا error میده و می گه که نیاز مند یه method ه .
    ولی من برای استفاده از این کلاس ها حتما باید از این تابع استفاده کنم ، حتما باید آرایه ورودی رو به تابع بفرستم و هم خروجی تابع رو بگیرم .

    و مشکل دوم اینه که وقتی من Thread مربوط به هرکدوم از کلاس ها رو که Start می کنم ، Stop یا Suspend یا Resume یا ... دسته خودم که کی انجام بدم ، ولی در این برنامه باید یه Thread زمانی متوقف بشه که تابع Find (که تعریفشو بالا آوردم ) مقداری رو Return کنه ؛ حالا من چه طور باید کدی بنویسم که این کار رو انجام بده ؟








    .

  2. #2
    VIP آواتار رضا عربلو
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    تهران
    پست
    1,597

    نقل قول: چگونگی عدم استفاده از method در ایجاد یه thread

    به جای ThreadStart از ParametrizedThreadStart استفاده کنید.
    اگر Net. نمی دانید وارد نشوید.

  3. #3
    VIP آواتار raravaice
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    Tehran
    سن
    40
    پست
    1,944

    نقل قول: چگونگی عدم استفاده از method در ایجاد یه thread

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

    موفق باشید

  4. #4

    نقل قول: چگونگی عدم استفاده از method در ایجاد یه thread

    دوستان ممنون از راهنمایی هایتون .

    دوستان ، با این روش هایی که شما فرمودین مشکل ایجاد و شروع Thread حل میشه .
    ولی من یه مشکله دیگه هم داشتم و اون اینه که باید Thread زمانی Stop بشه ، که Find مقداری رو برگردونده .
    یعنی thread Start میشه و تا زمانی که Find مقداری برنگردونده thread در حال اجرا است و وقتی که Find مقداری برگردوند Thread Stop میشه .
    این کار رو چه طور انجام بدم ؟






    .

  5. #5
    VIP آواتار رضا عربلو
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    تهران
    پست
    1,597

    نقل قول: چگونگی عدم استفاده از method در ایجاد یه thread

    احتیاجی نیست که Thread استاپ بشه. هنگامیکه اجرای متد به پایان رسید (return)، دیگه thread استاپ شده و کاندیدی برای garbage collection است. شما کافیکه که از متدتون return کنید.
    اگر Net. نمی دانید وارد نشوید.

  6. #6

    نقل قول: چگونگی عدم استفاده از method در ایجاد یه thread

    نقل قول نوشته شده توسط رضا عربلو مشاهده تاپیک
    به جای ThreadStart از ParametrizedThreadStart استفاده کنید.

    منظور شما به این صورته ؟



    EngineKQ KingQueen = newEngineKQ();

    Thread ThreadKQ =
    newThread(newParameterizedThreadStart(KingQueen.FindBestMove(33, Board)));




    به این کد خطای Method name expected رو میده !!!






    .

  7. #7
    VIP آواتار رضا عربلو
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    تهران
    پست
    1,597

    نقل قول: چگونگی عدم استفاده از method در ایجاد یه thread

    نام متد را بدون پارامتر در هنگام تعریف thread بیاور.
    EngineKQ KingQueen = new EngineKQ();
    Thread ThreadKQ = new Thread(new ParameterizedThreadStart(KingQueen.FindBestMove));
    ThreadKQ.Start(33, Board);
    یک مثال ساده :http://www.yoda.arachsys.com/csharp/...rameters.shtml
    اگر Net. نمی دانید وارد نشوید.

  8. #8

    نقل قول: چگونگی عدم استفاده از method در ایجاد یه thread

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

    No over load for "FindBestMove" matches delegate "System.Threading.ParameterizedThreadStart

    No over load for method "Start" takes 2 argument







    .


  9. #9

    نقل قول: چگونگی عدم استفاده از method در ایجاد یه thread

    من به اون Link هم که شما لطف کرده بودین گذاشته بودین هم رفتم .
    اونجا ( خط آخر ) این مورد و خودش اشاره کرده که مربوط به error دومی که VisualStudio به من داد و بالا براتون نوشتم

    but only accepts a single parameter and isn't type-safe

    یعنی با این حساب من نمی تونم دوتا پارامتر رو با هم بفرستم ، اینو میشه کاریش کرد یعنی پارامتر اول رو با یه تابع دیگه استفاده می کنم و پارامتر دوم رو با یه تابع دیگه .
    ولی من منظور نویسنده اون لینک و از is not type-safe متوجه نشد ، یعنی چی که safe-type نیست ؟

    اونجا 2 تا روش ذکر شده بود ، به نظر من روش دوم ( روش ParameterizedThreadStart ) با توجه به اینکه توسط .Net ارائه شده بهتر باشه .
    نظر شما چیه ؟






    .

  10. #10

    نقل قول: چگونگی عدم استفاده از method در ایجاد یه thread

    نقل قول نوشته شده توسط رضا عربلو مشاهده تاپیک
    احتیاجی نیست که Thread استاپ بشه. هنگامیکه اجرای متد به پایان رسید (return)، دیگه thread استاپ شده


    class EngineKP
    {
    public
    int FindBestMove()
    {
    if (Board[0, 0] == 9)
    return 8888888;
    else

    return Engine();
    }
    }


    in an other Class :
    EngineKPKnightPawn = newEngineKP();
    ThreadThreadKP = newThread(newThreadStart(KnightPawn.FindBestMove));





    خطایی که میده اینه wrong return type

    با این حساب فقط می تونم void return بگیرم !!!
    چه طوری می تونم int return بگیرم ؟







    .
    آخرین ویرایش به وسیله hamed jalili : سه شنبه 28 خرداد 1387 در 13:09 عصر

  11. #11
    VIP آواتار رضا عربلو
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    تهران
    پست
    1,597

    نقل قول: چگونگی عدم استفاده از method در ایجاد یه thread

    اگر می خواهید int باز گردانید بایستی از delegete استفاده کنید و با فراخوانی متدهای BeginInvoke و EndInvoke انرا بصورت Async اجرا کنید.
    اینجا را ببینید:
    http://www.ondotnet.com/pub/a/dotnet...delegates.html
    http://msdn.microsoft.com/en-us/libr...17(VS.71).aspx
    اگر Net. نمی دانید وارد نشوید.

  12. #12

    نقل قول: چگونگی عدم استفاده از method در ایجاد یه thread

    نقل قول نوشته شده توسط رضا عربلو مشاهده تاپیک
    اگر می خواهید int باز گردانید بایستی از delegete استفاده کنید و با فراخوانی متدهای BeginInvoke و EndInvoke انرا بصورت Async اجرا کنید.
    اینجا را ببینید:
    http://www.ondotnet.com/pub/a/dotnet...delegates.html
    http://msdn.microsoft.com/en-us/libr...17(VS.71).aspx

    دوست عزیز ممنون از راهنماییتون
    ولی یه مشکلی هست ، اونم اینه که من تا حالا از Delegete استفاده نکردم از کتاب How to program C#‎ - Deitel هم در مورد Delegete خوندم اونجا با مثال Bubble Sort توضیح داده ولی متاسفانه من که چیزی متوجه نشدم .
    از لینک هایی که شما زحمتشونو کشیدن هم چیزی متوجه نشدم .
    MSDN که خدا خیرش بده ، تا حالا نشده چیزی ازش متوجه بشم ، از بس پیچیده توضیح میده .
    و اون یکی لینک هم به همین صورت ، اونم به خاطره اینه که من از C#‎ تا به حال به این صورت استفاده نکردم . منظورم Delegete و thread و Asynchronously و ... به خاطر این همه چیز اونجا برام گنگ ه .

    اگه امکانش براتون هست ، یه مختصر که وقت خودتون رو هم نگیره راهنماییم کنید یا اگه راه ساده تری هست ممنون میشم راهنمایی کنید .







    .

  13. #13
    VIP آواتار رضا عربلو
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    تهران
    پست
    1,597

    نقل قول: چگونگی عدم استفاده از method در ایجاد یه thread

    توضیح را شرمنده ام. چ.ن مثنوی هفتاد من کاغذ است. ولی برای شما یک مثال ساده گذاشته ام تا با کمی جستجو در msdn بتوانید به راحتی کار کنید.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace ConsoleApplication1
    {
    class Program
    {
    delegate int Mydelegate(int x, int y);
    static int add(int x, int y)
    {
    return x + y;
    }

    //این متد هنگامیکه اجرای دلگت به پایان رسید فراخوانده می شود.
    static void AddCompleted(IAsyncResult iar)
    {
    System.Runtime.Remoting.Messaging.AsyncResult ar = (System.Runtime.Remoting.Messaging.AsyncResult)iar ;
    Mydelegate md = (Mydelegate)ar.AsyncDelegate;
    Console.WriteLine(md.EndInvoke(iar));
    }
    static void Main(string[] args)
    {
    Mydelegate md = new Mydelegate(add);
    md.BeginInvoke(10, 20, new AsyncCallback(AddCompleted), null);
    Console.ReadLine();
    }
    }
    }

    اگر Net. نمی دانید وارد نشوید.

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

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