PDA

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



hamed jalili
چهارشنبه 22 خرداد 1387, 12:49 عصر
سلام دوستان

من 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 کنه ؛ حالا من چه طور باید کدی بنویسم که این کار رو انجام بده ؟








.

رضا عربلو
چهارشنبه 22 خرداد 1387, 17:27 عصر
به جای ThreadStart از ParametrizedThreadStart استفاده کنید.

raravaice
چهارشنبه 22 خرداد 1387, 17:34 عصر
یه راه دیگه اینکه پارامتر Board رو از آرگومان در بیار به صورت یه پراپرتی تو کلاس بنویسش و بعد از نمونه سازی از کلاس مقدارت رو بهش بده بعد Find رو بدون آرگومان صدا بزن.

موفق باشید

hamed jalili
چهارشنبه 22 خرداد 1387, 18:54 عصر
دوستان ممنون از راهنمایی هایتون .

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






.

رضا عربلو
چهارشنبه 22 خرداد 1387, 20:06 عصر
احتیاجی نیست که Thread استاپ بشه. هنگامیکه اجرای متد به پایان رسید (return)، دیگه thread استاپ شده و کاندیدی برای garbage collection است. شما کافیکه که از متدتون return کنید.

hamed jalili
پنج شنبه 23 خرداد 1387, 12:40 عصر
به جای ThreadStart از ParametrizedThreadStart استفاده کنید.


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




EngineKQ KingQueen = newEngineKQ();


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





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







.

رضا عربلو
پنج شنبه 23 خرداد 1387, 18:28 عصر
نام متد را بدون پارامتر در هنگام تعریف thread بیاور.


EngineKQ KingQueen = new EngineKQ();
Thread ThreadKQ = new Thread(new ParameterizedThreadStart(KingQueen.FindBestMove));
ThreadKQ.Start(33, Board);


یک مثال ساده :http://www.yoda.arachsys.com/csharp/threads/parameters.shtml

hamed jalili
جمعه 24 خرداد 1387, 09:59 صبح
نام متد را بدون پارامتر در هنگام تعریف thread بیاور.


دوست عزیز ممنون از راهنماییتون
برای کد شما این خطا ها رو داد که من متوجه نمیشم چیه ؟!


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

No over load for method "Start" takes 2 argument









.

hamed jalili
جمعه 24 خرداد 1387, 10:28 صبح
من به اون Link هم که شما لطف کرده بودین گذاشته بودین هم رفتم .
اونجا ( خط آخر ) این مورد و خودش اشاره کرده که مربوط به error دومی که VisualStudio به من داد و بالا براتون نوشتم


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



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


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







.

hamed jalili
سه شنبه 28 خرداد 1387, 12:57 عصر
احتیاجی نیست که 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 بگیرم ؟









.

رضا عربلو
سه شنبه 28 خرداد 1387, 17:29 عصر
اگر می خواهید int باز گردانید بایستی از delegete استفاده کنید و با فراخوانی متدهای BeginInvoke و EndInvoke انرا بصورت Async اجرا کنید.
اینجا را ببینید:
http://www.ondotnet.com/pub/a/dotnet/2003/02/24/asyncdelegates.html
http://msdn.microsoft.com/en-us/library/aa735617(VS.71).aspx

hamed jalili
سه شنبه 28 خرداد 1387, 18:47 عصر
اگر می خواهید int باز گردانید بایستی از delegete استفاده کنید و با فراخوانی متدهای BeginInvoke و EndInvoke انرا بصورت Async اجرا کنید.
اینجا را ببینید:
http://www.ondotnet.com/pub/a/dotnet/2003/02/24/asyncdelegates.html
http://msdn.microsoft.com/en-us/library/aa735617(VS.71).aspx


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

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







.

رضا عربلو
سه شنبه 28 خرداد 1387, 19:45 عصر
توضیح را شرمنده ام. چ.ن مثنوی هفتاد من کاغذ است. ولی برای شما یک مثال ساده گذاشته ام تا با کمی جستجو در 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();
}
}
}