Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебное пособие 800564

.pdf
Скачиваний:
3
Добавлен:
01.05.2022
Размер:
5.57 Mб
Скачать

button3.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