using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace WaitHandleTest1
{
class ThreadPlayer
{
private string m_name; //이름
private Random m_random; //달리기속도를 다르게 하기 위한 Random
//이벤트. 맨처음에 이벤트 발생이면 true 아님 false
private ManualResetEvent m_event = new ManualResetEvent(false);
// private AutoResetEvent m_event = new AutoResetEvent(false);
public string Name
{
get { return m_name; }
}
public WaitHandle Event
{
get { return m_event; }
}
public ThreadPlayer(string name, int randomSeed)
{
m_name = name;
m_random = new Random(randomSeed);
}
public void Run()
{
for (int progress = 10; progress <= 100; progress += 5)
{
Thread.Sleep(m_random.Next(100));
}
Console.WriteLine("{0} 선수가 도착했습니다", m_name);
m_event.Set();
}
}
class Program
{
const int MaxPlayer = 30;
static void Main(string[] args)
{
Random seed = new Random();
ThreadPlayer[] players = new ThreadPlayer[MaxPlayer];
WaitHandle[] events = new WaitHandle[MaxPlayer];
for (int i = 0; i < MaxPlayer; i++)
{
ThreadPlayer player =
new ThreadPlayer((i+1).ToString()+" 번",seed.Next(1000));
events[i] = player.Event;
//선수를 쓰레드로 만든다.
Thread t = new Thread(new ThreadStart(player.Run));
t.Start();
//선수를 배열로 보관
players[i] = player;
}
int winner = WaitHandle.WaitAny(events);
Console.WriteLine(new string('-', 30));
Console.WriteLine("{0} 선수가 일등입니다.", players[winner].Name);
Console.WriteLine(new string('-', 30));
events[4].WaitOne();
Console.WriteLine(new string('-', 30));
Console.WriteLine("기다리던 {0} 선수가 들어왔네.", players[4].Name);
Console.WriteLine(new string('-', 30));
WaitHandle.WaitAll(events);
Console.WriteLine(new string('-', 30));
Console.WriteLine("다 들어왔슈");
Console.WriteLine(new string('-', 30));
foreach (ManualResetEvent evt in events)
{
evt.Reset();
}
}
}
}
'프로그래밍 > C#.net' 카테고리의 다른 글
FormBorder.None 에 간단하게 드래그이벤트 추가 코드 (0) | 2009.03.24 |
---|---|
WinService구동시 installutil문제 (2) | 2009.02.17 |
동기화 테스트 예제 (0) | 2009.01.15 |
Thread 5분연습 예제 (0) | 2009.01.15 |
[C#] ASCII로 파일입출력 하기 예제 (0) | 2009.01.15 |
댓글