PDA

View Full Version : سوال: مشکلی در Start و Stop کردن thread



hamed jalili
دوشنبه 03 تیر 1387, 11:57 صبح
سلام دوستان

این کد رو ملاحضه کنید :




Engine2 Engine2 = newEngine2();
Thread Thread2 = newThread(newThreadStart(Engine2.FindBestMove));
Thread2.Name = "Thread2";
Thread2.Start();


if(Thread2.ThreadState == ThreadState.Stopped)
{
Engine2Result = Engine2.Result();
Thread2.Start();

}






به این کد زمانی که خط آخر آن یعنی Thread2.Start فراخونی میشه این error رو میده :
thread is running or terminated ; it can not be reastarted


وقتی trace می کنم ، thread در این مرحله دارای Alive = false ه
چه می تونم این thread رو دوباره Start کنم ؟










.

رضا عربلو
دوشنبه 03 تیر 1387, 18:39 عصر
احتمالاً این دو قطعه کدتان یعنی خطوط 1 الی 4 و 4 الی 8 در دو قسمت مختلف برنامه تان می باشد.
همانطور که پیغام خطا نان می دهد thread شما یا در حال انجام کار است و یا terminate شده است. در اینصورت شما نمی توانید آن thread را استارت کنید. اگر thread تان terminate شده است بایستی یک thread جدید ایجاد کنید و دوباره روز از نو روزی از نو ...

hamed jalili
دوشنبه 03 تیر 1387, 20:48 عصر
نه این خط ها در یه جای برنامه هستند ، البته Engine ها 3 تا هستند و از این کد ها 3 تا هست که پشت سر هم هستند ،
وقتی thread1 در حال اجرا است ، Thread2 running ه وقتی thread1 Stop میشه اون وقت thread2 چک میشه که اگه Stop شده باید دوباره با یک سری پارامتر های جدید Start بشه که اون مشکل پیش می آید

راستی اگه من بخواهم thread جدید ایجاد کنم که نمیشه ، چون سه تا thread هست که اینا باید 17 تا کار انجام بدن که به صورت 3 تا 3 موازی عمل می کنند .

حتما باید Thread قبل Start بشه در غیر این صورت نمیشه کاری کرد .
از کتاب Dietel خوندم که یه Thread زمانی که Stop میشه به این معنیه که Complete شده ، Complete شدن یه Thread به معنیه Terminate شدن اونه ؟








.

hamed jalili
دوشنبه 03 تیر 1387, 20:54 عصر
کل کد این قسمت رو به صورت کامل براتون اینجا آوردم ، که کاملا پشت سر هم هستند
ملاحضه بفرمایید .




int Engine1Result = 0,
Engine2Result = 0,
Engine3Result = 0;

Engine1 Engine1 = newEngine1();
Thread Thread1 = newThread(newThreadStart(Engine1.FindBestMove));
Thread1.Name = "Thread1";

Engine2 Engine2 = newEngine2();
Thread Thread2 = newThread(newThreadStart(Engine2.FindBestMove));
Thread2.Name = "Thread2";

Engine3 Engine3 = newEngine3();
Thread Thread3 = newThread(newThreadStart(Engine3.FindBestMove));
Thread3.Name = "Thread3";

Thread1.Start();
Thread2.Start();
Thread3.Start();


Again:

if (ProcessControl < 17 &&
Thread1.ThreadState == ThreadState.Stopped)
{
Engine1Result = Engine1.Result();
Thread1.Start();
}

if (ProcessControl < 17 &&
Thread2.ThreadState == ThreadState.Stopped)
{
Engine2Result = Engine2.Result();
Thread2.Start();
}

if (ProcessControl < 17 &&
Thread3.ThreadState == ThreadState.Stopped)
{
Engine3Result = Engine3.Result();
Thread3.Start();
}

if (ProcessControl > 16 &&
Thread1.ThreadState == ThreadState.Stopped &&
Thread2.ThreadState == ThreadState.Stopped &&
Thread3.ThreadState == ThreadState.Stopped)
goto End;
else
goto Again;

End:
return"Best result is :" + Convert.ToString(max);

رضا عربلو
دوشنبه 03 تیر 1387, 22:12 عصر
اگر می خواهید thread تان را برای لحظه ای متوقف کنید و دوباره به آن ادامه دهید بهتر است از Suspend و Resume استفاده کنید. البته بایستی مراقب باشید چون suspend کردن یک thread ممکن است عواقب غیر قابل پیش بینی داشته باشد و Dead Lock ایجاد کند. به قول مایکروسافت این دو متد منسوخ شده اند و بهتر است از Mutex و Event و .. استفاده کننید

در ضمن اگر به این لینک http://msdn.microsoft.com/en-us/library/system.threading.threadstate.aspx مراجعه کنید می بینید که یک thread تنها در صورتی در وضعیت stopped است که یا متد abort فراخوانده شده باشد و یا terminate شده باشد.

hamed jalili
چهارشنبه 05 تیر 1387, 00:26 صبح
ببینید دوست عزیز ،
در کدی که من بالا قرار دادم ، این Thread ها زمانی Stop میشن که کار تابع ی که فراخوانی می کنند تموم بشه یا به عبارتی terminate بشه ، ولی بعد از اینکه terminate میشه دوباره باید Start بشه .

من در وسط کار ه یه thread که نمی خواهم اونو متوقف کنم که بعدا بخواهم کارشو از سر بگیرم ، بعد از اینکه کارش تموم شد و عملا Stop شد ، می خواهم کارشو با یک سری ورودی های متفاوت از سر بگیرم .






.

رضا عربلو
چهارشنبه 05 تیر 1387, 17:38 عصر
هنگامیکه Thread کارش تموم شد و STop شد Terminate می شود و نمیشه دوباره آن را Start کرد.

hamed jalili
چهارشنبه 05 تیر 1387, 21:26 عصر
خوب با همون نام هم که نمیشه یه thread دوباره ساخت !
پس باید چی کار کرد ؟
من که نمی تونم 16 تا thread درست کنم و دو نه دونه اونارو Start کنم ، اونوقت با توجه به وجود 3 تا کلاس برای thread ها 100% باید با ناحیه های بحرانی هم دست و پنجه نرم کنم که با توجه به 2000 خط کد در هر کلاس این کار تقریبا بعیده !!!!!
راهی به نظر شما و سایر دوستان نمی رسه ؟






.