Учебное пособие 800564
.pdfbutton3.Enabled = false; |
//Блокируем кнопку button3 |
button4.Enabled = false; |
//Блокируем кнопку button4 |
pause = 100; |
//Указываем длительность паузы |
trackBar1.Value = 3; //Указываем значение для trackbar1, //изменяющий приоритет первого потока
trackBar2.Value = 3; //Указываем значение для trackbar2, //изменяющий приоритет второго потока
trackBar3.Value = 3; //Указываем значение для trackbar3, //изменяющий приоритет третьего потока
trackBar4.Value = 1; //Указываем значение для trackbar4, //изменяющий длительность паузы
}
5)Добавим функцию f1 для расчета решета Эратосфена private void f1(int n1)
{
listBox1.Items.Clear();
List<ulong> arr_1 = new List<ulong>(); ulong i = 2;
while (arr_1.Count < n1)
{
if (arr_1.Count == 0)
{
arr_1.Add(2); listBox1.Items.Add(i);
s.WaitOne(); |
//Блокируем текущий поток до освобо- |
//ждения семафора |
|
writeTextBox(1); |
//Записываем в richTextBox1 номер |
//потока |
|
s.Release(1); |
//Освобождаем семафор |
Thread.Sleep(pause); //Блокируем текущий поток на за- //данное количество миллисекунд
i = 3;
71
continue;
}
bool temp = false;
for (int k = 0; k < arr_1.Count; k++)
{
if (i % arr_1[k] == 0)
{
temp = true;
}
}
if (!temp)
{
arr_1.Add(i); listBox1.Items.Add(i);
s.WaitOne(); |
//Блокируем текущий поток до освобо- |
//ждения семафора |
|
writeTextBox(1); |
//Записываем в richTextBox1 номер |
//потока |
|
s.Release(1); |
//Освобождаем семафор |
Thread.Sleep(pause); //Блокируем текущий поток на //заданное количество миллисекунд
}
i++;
}
button2.Enabled = false;
button2.Text = "Поток №1 не запущен";
}
6)Добавим функцию f2 для расчета чисел Фибоначчи private void f2(int n2)
{
listBox2.Items.Clear();
List<ulong> arr_2 = new List<ulong>();
72
for (int i = 0; i < n2; i++)
{
if (arr_2.Count == 0 || arr_2.Count == 1)
{
arr_2.Add(1); listBox2.Items.Add(i);
s.WaitOne(); |
//Блокируем текущий поток до |
//освобождения семафора |
|
writeTextBox(2); |
//Записываем в richTextBox1 номер |
//потока |
|
s.Release(1); |
//Освобождаем семафор |
Thread.Sleep(pause); //Блокируем текущий поток на //заданное количество миллисекунд
continue;
}
else
{
arr_2.Add(arr_2[arr_2.Count - 1] + arr_2[arr_2.Count - 2]); listBox2.Items.Add(i);
s.WaitOne(); |
//Блокируем текущий поток до |
//освобождения семафора |
|
writeTextBox(2); |
//Записываем в richTextBox1 номер |
//потока |
|
s.Release(1); |
//Освобождаем семафор |
Thread.Sleep(pause); //Блокируем текущий поток на //заданное количество миллисекунд
}
}
button3.Enabled = false;
button3.Text = "Поток №2 не запущен";
}
7)Добавим функцию f3 для расчета факториала
73
private void f3(int n3)
{
listBox3.Items.Clear();
List<ulong> arr_3 = new List<ulong>(); for (int i = 1; i <= n3; i++)
{
if (arr_3.Count == 0)
{
arr_3.Add((ulong)i); listBox3.Items.Add(arr_3[i-1]);
s.WaitOne(); |
//Блокируем текущий поток до |
//освобождения семафора |
|
writeTextBox(3); |
//Записываем в richTextBox1 номер |
//потока |
|
s.Release(1); |
//Освобождаем семафор |
Thread.Sleep(pause); //Блокируем текущий поток на
//заданное количество миллисекунд
}
else
{
arr_3.Add(arr_3[arr_3.Count - 1] * (ulong)i); listBox3.Items.Add(arr_3[i-1]);
s.WaitOne(); |
//Блокируем текущий поток до |
//освобождения семафора |
|
writeTextBox(3); |
//Записываем в richTextBox1 номер |
//потока |
|
s.Release(1); |
//Освобождаем семафор |
Thread.Sleep(pause); //Блокируем текущий поток на //заданное количество миллисекунд
}
}
button4.Enabled = false;
button4.Text = "Поток №3 не запущен"; 74
}
8)Добавим функцию writeTextBox для вывода номера потока в richTextBox1
public void writeTextBox(int r)
{
switch (r) |
|
{ |
|
case 1: richTextBox1.SelectionColor = Color.Yellow; |
|
//Задаем цвет для первого потока |
|
break; |
|
case 2: richTextBox1.SelectionColor = Color.Red; |
//Задаем |
//цвет для второго потока |
|
break; |
|
case 3: richTextBox1.SelectionColor = Color.Blue; |
//Задаем |
//цвет для третьего потока |
|
break; |
|
} |
|
richTextBox1.AppendText(r + "\n"); //Выводим номер потока //в richTextBox1
}
9)Добавим функцию button1_Click, обрабатывающую событие нажатия на кнопку button1
private void button1_Click(object sender, EventArgs e)
{
richTextBox1.Text = ""; int n1;
try
{
n1 = Int32.Parse(textBox1.Text); //Считываем параметр для
//расчета решета Эратосфена
}
75
catch
{
n1 = 0;
textBox1.Text = n1.ToString();
}
int n2; try
{
n2 = Int32.Parse(textBox2.Text); //Считываем параметр для
//расчета чисел Фибоначчи
}
catch
{
n2 = 0;
textBox2.Text = n2.ToString();
}
int n3; try
{
n3 = Int32.Parse(textBox3.Text); //Считываем параметр для
//расчета факториала
}
catch
{
n3 = 0;
textBox3.Text = n3.ToString();
}
if (!first) //Если не первый запуск потоков
{
s.WaitOne(); |
//Ждем свободный семафор |
Thread_1.Abort(); |
//Завершаем поток |
Thread_2.Abort(); |
//Завершаем поток |
Thread_3.Abort(); |
//Завершаем поток |
|
76 |
}
t1 = delegate { f1(n1); }; //Связываем делегат t1 с функцией f1 t2 = delegate { f2(n2); }; //Связываем делегат t2 с функцией f2 t3 = delegate { f3(n3); }; //Связываем делегат t3 с функцией f3 s = new Semaphore(1, 1); //Создание семафора с начальным и //максимальным количеством запросов для семафора, которое //может быть обеспечено одновременно
Thread_1 = new Thread(t1); //Создаем первый поток Thread_2 = new Thread(t2); //Создаем второй поток Thread_3 = new Thread(t3); //Создаем третий поток Thread_1.Name = "Thread1"; //Указываем имя для потока Thread_2.Name = "Thread2"; //Указываем имя для потока Thread_3.Name = "Thread3"; //Указываем имя для потока Thread_1.Priority = (ThreadPriority)Enum.Parse(typeof
(ThreadPriority), Convert.ToString(trackBar1.Value - 1)); //Устанавливаем приоритет для потока
Thread_2.Priority = (ThreadPriority)Enum.Parse(typeof (ThreadPriority), Convert.ToString(trackBar2.Value - 1));
//Устанавливаем приоритет для потока Thread_3.Priority = (ThreadPriority)Enum.Parse(typeof
(ThreadPriority), Convert.ToString(trackBar3.Value - 1)); //Устанавливаем приоритет для потока
Thread_1.Start(); //Запускаем поток Thread_2.Start(); //Запускаем поток Thread_3.Start(); //Запускаем поток button2.Text = "Остановить поток №1"; button3.Text = "Остановить поток №2"; button4.Text = "Остановить поток №3"; button2.Enabled = Thread_1.IsAlive; button3.Enabled = Thread_2.IsAlive; button4.Enabled = Thread_3.IsAlive;
}
77
10)Добавим функцию button2_Click, обрабатывающую событие нажатия на кнопку button2
private void button2_Click(object sender, EventArgs e)
{
if (!Thread_1.IsAlive) //Если первый поток не запущен
{
s.WaitOne(); //Ждем освобождения семафора Thread_1 = new Thread(t1);
Thread_1.Name = "Thread1"; Thread_1.Start(); //Запускаем поток
Thread_1.Priority = (ThreadPriority)Enum.Parse(typeof (ThreadPriority), Convert.ToString(trackBar1.Value - 1));
button2.Text = "Остановить поток №1";
s.Release(1); |
//Освобождаем семафор |
} |
|
else |
//иначе |
{ |
|
s.WaitOne(); |
//Ждем освобождения семафора |
Thread_1.Abort(); //Завершаем поток button2.Text = "Начать заново поток №1"; s.Release(1); //Освобождаем семафор
}
}
11)Добавим функцию button3_Click, обрабатывающую событие нажатия на кнопку button3
private void button3_Click(object sender, EventArgs e)
{
if (!Thread_2.IsAlive) //Если второй поток не запущен
{
s.WaitOne(); //Ждем освобождения семафора Thread_2 = new Thread(t2);
78
Thread_2.Name = "Thread1"; Thread_2.Start(); //Запускаем поток
Thread_2.Priority = (ThreadPriority)Enum.Parse(typeof (ThreadPriority), Convert.ToString(trackBar2.Value - 1));
button3.Text = "Остановить поток №2";
s.Release(1); |
//Освобождаем семафор |
} |
|
else |
//иначе |
{ |
|
s.WaitOne(); |
//Ждем освобождения семафора |
Thread_2.Abort(); //Завершаем поток button3.Text = "Начать заново поток №2";
s.Release(1); |
//Освобождаем семафор |
} |
|
} |
|
12)Добавим функцию button4_Click, обрабатывающую событие нажатия на кнопку button4
private void button4_Click(object sender, EventArgs e)
{
if (!Thread_3.IsAlive) //Если третий поток не запущен
{ |
|
s.WaitOne(); |
//Ждем освобождения семафора |
Thread_3 = new Thread(t3); Thread_3.Name = "Thread3"; Thread_3.Start(); //Запускаем поток
Thread_3.Priority = (ThreadPriority)Enum.Parse(typeof (ThreadPriority), Convert.ToString(trackBar3.Value - 1));
button4.Text = "Остановить поток №3";
s.Release(1); |
//Освобождаем семафор |
} |
|
else |
//иначе |
|
79 |
{ |
|
s.WaitOne(); |
//Ждем освобождения семафора |
Thread_3.Abort(); //Завершаем поток button4.Text = "Начать заново поток №3";
s.Release(1); |
//Освобождаем семафор |
} |
|
} |
|
13)Добавим функцию button5_Click, обрабатывающую событие нажатия на кнопку button5
private void button5_Click(object sender, EventArgs e)
{
s.WaitOne(); //Ждем освобождения семафора Environment.Exit(1); //Завершаем приложение
}
14)Добавим функции, обрабатывающие события передвижения trackBar-ов
private void trackBar1_Scroll(object sender, EventArgs e)
{
if (Thread_1.IsAlive) Thread_1.Priority = (ThreadPriority) Enum.Parse(typeof(ThreadPriority), Convert.ToString (trackBar1.Value - 1));
}
private void trackBar2_Scroll(object sender, EventArgs e)
{
if (Thread_2.IsAlive) Thread_2.Priority = (ThreadPriority)Enum.Parse(typeof(ThreadPriority), Convert.ToString(trackBar2.Value - 1));
}
private void trackBar3_Scroll(object sender, EventArgs e)
{
if (Thread_3.IsAlive) Thread_3.Priority = (ThreadPriority)
80