PDA

View Full Version : Threads, Events & Mutexes در سی شارپ ، قسمت چهارم



Vahid_Nasiri
سه شنبه 25 آذر 1382, 23:54 عصر
مثال هجدهم :


using System.Threading;

public class yyy
{
public void abc()
{
for ( int i = 0; i<=10;i++)
{
System.Console.Write(i + " ");
Thread.Sleep(1);
}
}

public void pqr()
{
for ( int i = 0; i<=10;i++)
{
System.Console.Write(i+ "...");
Thread.Sleep(1);
}
}
}

public class zzz
{
public static void Main()
{
yyy a = new yyy();
Thread t = new Thread(new ThreadStart(a.abc));
Thread t1 = new Thread(new ThreadStart(a.pqr));
System.Console.WriteLine(t.Priority);
t.Priority = ThreadPriority.Highest;
t1.Priority = ThreadPriority.Lowest;
t.Start();
t1.Start();
}
}

Output
Normal
0 1 2 3 4 0...5 1...6 2...7 3...8 4...9 5...10 6...7...8...9...10...


در مورد طول time-slice اختصاص داده شده به یک thread و یا سایر تردها نیز می توان تصمیم گیری کرد. این مورد با تنظیم خاصیت Priority (حق تقدم) قابل حصول است. به صورت پیش فرض سطح حق تقدم مساوی 2 است. بنابراین خروجی برنامه ی بالا در ابتدا Normal می باشد. تمام تردها با این سطح حق تقدم آغاز می شوند. ThreadPriority enum دارای 5 مقدار می باشد:


• 0 - Zero
• 1 - BelowNormal
• 2 - Normal
• 3 - AboveNormal
• 4 - Highest

در برنامه ی فوق حق تقدم ترد t به بالاترین حد ممکن و حق تقدم ترد t1 به کمترین حد ممکن تنظیم شده است. بنابراین ترد t زمان بیشتری برای تکمیل کارش نسبت به ترد t1 خواهد داشت و حلقه ی for خودش را قبل از خاتمه ی ترد t1 به پایان می رساند.



مثال نوزدهم :


using System.Threading;

public class yyy
{
public void abc()
{
try
{
System.Console.WriteLine("in abc");
for ( ; ; ) ;
}
catch ( System.Exception e)
{
System.Console.WriteLine("in abc Exception " +e.ToString() );
}
finally
{
System.Console.WriteLine("in abc Finally");
}
}
}

public class zzz
{
public static void Main()
{
yyy a = new yyy();
Thread t = new Thread(new ThreadStart(a.abc));
t.Start();
Thread.Sleep(10);
t.Abort();

System.Console.ReadLine();
}
}


Output
in abc
in abc Exception System.Threading.ThreadAbortException: Thread was being aborted.
at yyy.abc()
in abc Finally


Abort نمودن یک ترد هنگامیکه مشغول اجرای کدی می باشد سبب ایجاد یک Exception خواهد شد و کد به قسمت catch و finally منتقل می گردد. یک ترد پس از انتقال به این قسمت ها خاتمه می یابد.



مثال بیستم :



using System.Threading;

public class yyy
{
public void abc()
{
try
{
System.Console.WriteLine("in abc");
for ( ; ; ) ;
}
catch ( System.Exception e)
{
System.Console.WriteLine("in abc Exception " +e.ToString() );
}
finally
{
System.Console.WriteLine("in abc Finally");
}
}
}

public class zzz
{
public static void Main()
{
yyy a = new yyy();
Thread t = new Thread(new ThreadStart(a.abc));
t.Abort();
t.Start();
}
}

Output
(no output)

Abort نمودن یک ترد قبل از شروع به اجرای کد ، هیچگونه Exception ایی را سبب نخواهد شد. زیرا ترد در مرحله ی مرگ (!) به سر می برد. بنابراین هرگز کدی در abc فراخوانی نمی گردد.



مثال بیست و یکم :


using System.Threading;
public class yyy
{
public void abc()
{
for (int i = 1 ; i<= 10 ; i++ )
{
System.Console.Write(i + " " );
Thread.Sleep(1);
}
}
}

public class zzz
{
public static void Main()
{
yyy a = new yyy();
Thread t = new Thread(new ThreadStart(a.abc));
t.Start();
Thread.Sleep(10);
t.Suspend();
System.Console.WriteLine("\n After Suspend");
Thread.Sleep(10);
System.Console.WriteLine("Before Resume");
t.Resume();
}
}


Output
1
After Suspend
Before Resume
2 3 4 5 6 7 8 9 10


ما مجاز به تعلیق (Suspend) اجرای یک ترد در هر زمانی هستیم. در مثال فوق ترد برای مدت زمانی اجرا و سپس به حالت تعلیق در آورده شده است. سپس فرمان از سرگیری مجدد (Resume) صادر گردیده است . لازم به ذکر است که تعلیق مجدد تردی که در حال تعلیق به سر می برد ، خطایی را ایجاد نخواهد کرد زیرا تعیلق مجدد بر آن اثری ندارد. یک Resume برای undo کردن میلیون ها suspend کافی است.



مثال بیست و دوم:


using System.Threading;

public class yyy
{
public void abc()
{
for ( int i = 0; i<=3;i++)
{
Thread t2 = Thread.CurrentThread;
System.Console.Write(i + " " + t2.GetHashCode() + " ");
Thread.Sleep(1);
}
}
}

public class zzz
{
public static void Main()
{
yyy a = new yyy();
Thread t = new Thread(new ThreadStart(a.abc));
Thread t1 = new Thread(new ThreadStart(a.abc));
t.Start();
t1.Start();
}
}

Output
0 2 0 3 1 2 1 3 2 2 2 3 3 2 3 3

به هر ترد به صورت ذاتی و درونی یک عدد نسبت داده می شود. به این عدد HashCode گفته می شود. Hashing پروسه ی نسبت دهی یک عدد به یک هویت است ، بطوریکه بتوان آنرا به سادگی در یک لیست طولانی مشخص کرد. این عدد برای ردگیری تعداد زیادی از تردها مفید است.

SSP_Software_team
چهارشنبه 26 آذر 1382, 00:41 صبح
ممنون :wink:

برنامه نویس جوان
چهارشنبه 26 آذر 1382, 14:45 عصر
سلام

با اجازه شما من این مقالات شما رو می نویسم چون خیلی جالبند.

ایرادی که نداره؟

ممنون

Vahid_Nasiri
چهارشنبه 26 آذر 1382, 19:22 عصر
منظور شما از نوشتن چیست؟

SSP_Software_team
پنج شنبه 27 آذر 1382, 01:06 صبح
:shock: :shock: :shock:

kablayi
جمعه 23 بهمن 1383, 06:33 صبح
:تشویق: :موفق:

bahman.net
جمعه 08 اردیبهشت 1385, 02:03 صبح
دستت درد نکنه