Пример использования таймера




МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

ФГБОУ ВО

“ВоронежскИЙ государственнЫЙ

УНИВЕРСИТЕТ ИНЖЕНЕРНЫХ технологиЙ”

Кафедра ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ,

МОДЕЛИРОВАНИЯ И УПРАВЛЕНИЯ

______________________________________________________________

 

 

ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ И ПАРАЛЛЕЛЬНЫЕ ВЫЧИСЛЕНИЯ

В НАУЧНЫХ ИССЛЕДОВАНИХ

Методические указания

По выполнению контрольной работы

Для студентов, обучающихся по направлению подготовки

Информационные системы и технологии»,

Очно-заочной, заочной форм обучения

ВОРОНЕЖ


Цель работы:

-изучение технологии создания многопоточных систем;

-осознание необходимости и значимости параллельных вычислений;

- получение навыков разработки многопоточных приложений.

Изучение дисциплины направлено на формирование у ба­калавров следующих профессиональных компетенций:

- способность проводить моделирование процессов и си­стем (ПК-5);

- способность к проектированию базовых и прикладных информационных технологий (ПК-11).

 

Критерии оценки

Оценка «отлично» ставится студенту при разработке всех приложений, выполняющих параллельные вычисления и правильные расчеты. Код программ должен быть читаемым и содержать комментарии к основным подпрограммам и методам. Названия переменных должны отражать их сущность и назначение.

Оценка «хорошо» ставится студенту при правильно разработанных многопоточных приложениях и при наличии допущенных незначительных ошибок.

Оценка «удовлетворительно» ставится студенту при создании многопоточных приложений со значительными ошибками.

Оценка «неудовлетворительно» выставляется при отсутствии хотя бы половины правильно выполненных заданий.

Номер варианта выбирается по последней цифре шифра зачетной книжки студента для обучающихся в стенах ВГУИТ. По последней цифре студенческого билета для обучающихся по дистанционной форме обучения.

Пример оформления титульного листа контрольной работы в приложении.


КОНТРОЛЬНАЯ РАБОТА

Задание №1

Создание простых приложений с применением потоков и таймеров

Цель работы: Получить навыки разработки приложений с параллельными вычислениями.

 

Теоретические сведения о многопоточности в среде разработки Visual Studio C#

Язык C#. Основные понятия.

C# — типобезопасный, объектно-ориентированный язык, предназначенный для разработки разнообразных безопасных и мощных приложений, выполняемых в среде.NET Framework.

Типобезопасность — согласованность типов.

.NET Framework — программная платформа, основой которой является общеязыковая среда исполнения Common Language Runtime (CLR).

Common Language Runtime (англ. CLRобщеязыковая исполняющая среда) — исполняющая среда для байт-кода CIL (MSIL), в который компилируются программы, написанные на NET-совместимых языках программирования (C#, Managed C++,Visual Basic.NET, F# и прочие).

C# содержит традиционный набор императивных конструкций:

Присваивание

а = 5;

a += 10; или a= a + 10;

Операторы ветвления (if, switch)

`1. if (a>2) {

a = 3;

f = 30;

}

else {

a = 10;

f = 10;

}

2. – аналог оператора if

string classify = (input > 0)? "positive": "negative";

3. - оператор множественного ветвления

int a = 10;

switch (a)

{

case 1: f =3; break;

case 2: f=4;break;

default: f=14; break;

}

Циклы (do-while, for, foreach)

Оператор с постусловием

do {

//операторы

}

while (a>3)

Оператор с предусловием

while (a>3)

{

//операторы

}

Цикл со счетчиком

int [] Mas = new int [10]; // объявление и инициализация целочисленного массива

Random random = new Random (); // создание объекта для генерации случайных чисел

for (int i = 0; i < Mas.Length; i++)

{

Mas[i] = random. Next (1, 5); // возращает случайным образом целое число от 1 до 5

}

Создание двумерного массива: int [,] Mas = new int [10,10];

Оператор перечисления

foreach (var element in Mas) //var – ключевое слово, определение переменной неявного типа

{

Console.WriteLine(element);

}

Исключения (try-catch-finally)

Try

{

// попытка выполнить какую-то операцию

}

catch (Exception ex)

{

Console.WriteLine(ex.Message); //печатать текст ошибки

// попадание в этот блок при возникновении ошибки при выполнении операции

}

Finally

{

// в любом случае попадание в этот блок

}

Типы данных:

Поскольку C# строго типизированный язык. Это означает, что все операции подвергаются строгому контролю со стороны компилятора на соответствие типов, причем недопустимые операции не компилируются.

Типы значений

- целочисленный long, int, byte

- типы с плавающей запятой float, double

- символы char

- логический bool

- десятичный тип decimal

Cсылочные типы

-объекты object

- строки string

string a = “University”;

- интерфейсы

(имеет только абстрактные элементы)

- классы class

 

Многопоточность

Поток (thread) - это сущность операционной системы, набор инструкций и данных, выполняемый на процессоре.

Одним из ключевых аспектов в современном программировании является многопоточность. При помощи многопоточности можно выделить в приложении несколько потоков, которые будут выполнять различные задачи одновременно.

Процесс - набор ресурсов, исполняемый отдельным экземпляром приложения. У каждого процесса есть отдельное адресное пространство и как минимум один поток.

Следовательно, основанная на процессах многозадачность - средство, позволяющее компьютеру выполнять несколько операций (программ) одновременно. М ногозадачность предоставляет возможность, например, одновременно редактировать текст в текстовом редакторе и работать с другой запущенной программой.

Основные цели, которые преследуют программисты, используя потоки:

·позволить приложению параллельно работать над несколькими относительно независимыми задачами;

·использовать преимущества многопроцессорных систем для повышения производительности приложения.

Очевидно, что в любом случае задача, над которой работает приложение, должна обладать одним существенным свойством: ее можно разделить на несколько более или менее независимых подзадач, над которыми можно работать параллельно. Самый простой и очевидный способ организовать параллельную работу приложения над несколькими задачами – это, конечно, поручить каждую из них отдельному потоку.

Недостатки использования потоков

1 Значительное увеличение сложности программы

2 Повышенный расход ресурсов компьютера на создание и переключение между потоками.

Создание потока обходится недешево: объект ядра процесса должен быть размещен и инициализирован. Для каждого потока резервируется (и по требованию выделяется) 1 Мб адресного пространства для его стека пользовательского режима, и еще примерно 12 Кб выделяется для стека режима ядра. Создав поток, Windows сразу же вызывает функцию в каждой DLLбиблиотеке процесса, уведомляя все DLLбиблиотеки о создании нового потока. Уничтожение потока также требует затрат: каждая DLLбиблиотека в процессе получает уведомление об уничтожении потока. Затем следует очистка объекта ядра и стеки.

На однопроцессорных компьютерах в каждый момент времени может выполняться всего один поток.

Windows должна отслеживать объекты - потоки и время от времени решать, какой поток процессор будет обрабатывать следующим. А это дополнительный код, выполняющийся примерно раз в 20 мс. Остановку выполнения процессором кода одного потока и запуск на выполнение кода другого потока называют переключением контекста (context switch).

Виды потоков:

Потоки переднего плана (foreground threads) или приоритетные. По умолчанию каждый поток, создаваемый через метод Thread.Start(), автоматически становится потоком переднего плана. Данный тип потоков обеспечивают предохранение текущего приложения от завершения. Среда CLR не остановит приложение до тех пор, пока не будут завершены все приоритетные поток.

Фоновые потоки (background threads). Данный вид потоков называется также потоками-демонами, воспринимаются средой CLR как расширяемые пути выполнения, которые в любой момент времени могут игнорироваться. Таким образом, если все потоки переднего плана прекращаются, то все фоновые потоки автоматически уничтожаются при выгрузке домена приложения. Для создания фоновых потоков необходимо присвоить свойству IsBackground значение true.

В приложениях, которые имеют пользовательский интерфейс (UI), всегда есть как минимум один главный (GUI) поток, который отвечает за состояние компонентов интерфейса. Важно знать, что возможность изменять состояние представления есть только у этого, так называемого «UI-потока».

Примечание: Thread.Sleep(n) – метод для приостановки работы потока на n миллисекунд

Пример работы с потоками:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

namespace ConsoleApplicationThread

{

class Program

{

 

static void Main(string[] args)

{

Thread Threadfirst = new Thread(Write1);

Threadfirst.IsBackground = true; // создать фоновый поток

Threadfirst.Start();

 

Thread ThreadSecond = new Thread(Write2);

ThreadSecond.Start(); // по умолчанию поток переднего плана

while (true)

Console.Write("Просто так");

// Все время печатать 'Просто так'

}

static void Write1()

{

while (true)

Console.Write("Я поток номер 1");

// Все время печатать 'Я поток номер 1'

}

static void Write2()

{

while (true)

{

Console.Write("Я поток номер 2");

// Все время печатать 'Я поток номер 2'

Thread.Sleep(50) // остановиться на 50 мс

}

}

}}

Пулы потоков

Создание потоков требует времени. Если есть различные короткие задачи, подлежащие выполнению, можно создать набор потоков заранее и затем просто отправлять соответствующие запросы, когда наступает очередь для их выполнения. Для управления списком потоков предусмотрен класс ThreadPool, который по мере необходимости уменьшает и увеличивает количество потоков в пуле до максимально допустимого. Значение максимально допустимого количества потоков в пуле может изменяться. В случае двуядерного ЦП оно по умолчанию составляет 1023 рабочих потоков и 1000 потоков ввода-вывода. Можно указывать минимальное количество потоков, которые должны запускаться сразу после создания пула, и максимальное количество потоков, доступных в пуле.

Достоинства:

1. Пул потоков управляет потоками эффективно, уменьшая количество создаваемых, запускаемых и останавливаемых потоков.

2. Используя пул потоков, можно сосредоточиться на решении задачи, а не на инфраструктуре потоков приложения.

Примечание

Получение максимального числа потоков: ThreadPool.GetMaxThreads(out кол_ раб_потоков, out кол_потоков_ввода_вывода);

Установить максимальное число потоков

ThreadPool.SetMaxThreads(кол_раб_потоков, кол_потоков_ввода_вывода):

Запрос пула потоков для вызова метода:

ThreadPool.QueueUserWorkItem(Метод);

Пример использования пула потоков:

using System;

using System.Threading;

 

namespace ConsoleApplication1

{

class Program

{

static void Main()

{

int nWorkerThreads;

int nCompletionThreads;

ThreadPool.GetMaxThreads(out nWorkerThreads, out nCompletionThreads);

Console.WriteLine("Максимальное количество потоков: " + nWorkerThreads

+ "\nПотоков ввода-вывода доступно: " + nCompletionThreads);

for (int i = 0; i < 5; i++)

ThreadPool.QueueUserWorkItem(JobForAThread);

Thread.Sleep(3000);

 

Console.ReadLine();

}

 

static void JobForAThread(object state)

{

for (int i = 0; i < 3; i++)

{

Console.WriteLine("цикл {0}, выполнение внутри потока из пула {1}",

i, Thread.CurrentThread.ManagedThreadId); //идентификатор потока

Thread.Sleep(50);

}

}

}

}

 

Таймер

Таймер – это механизм, обеспечивающий выполнение заранее определенного метода с заданной периодичностью. Иными словами, речь идет о создании события после заданного интервала с возможностью создания повторяющихся событий.

Пример использования таймера

System.Timers.Timer aTimer = new System.Timers.Timer();

aTimer.Interval = 2000

aTimer.Elapsed += OnTimedEvent;

aTimer.AutoReset = true;

aTimer.Enabled = true;;

Возвращает или задает логическое значение, определяющее, должен ли объект Timer вызывать событие Elapsed один раз (false) или неоднократно (true).

private static void OnTimedEvent(Object source, ElapsedEventArgs e)

{

Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}", e.SignalTime);

}

Важно понимать, что создание 1000 таймеров не влечет за собой создание 1000 потоков. CLR создало один поток для работы с таймером ядра и несколько рабочих потоков для обработки срабатываний таймера.

Таким образом, здесь осуществляется работа с пулами потоков, которые были рассмотрены выше.


 

Задание

1. Создание многопоточного приложения, состоящего из 5 потоков, организующих бесконечный вывод чисел от N до M и временную приостановку потока на 50 мс после каждой итерации.

2. Создание приложения, которое в начале своей работы устанавливает максимальное количество рабочих потоков и потоков ввода-вывода в пуле потоков. Реализовать цикл, состоящий из K итераций, в котором происходил бы вызов метода, запрошенного из пула потоков. Данный метод выводит на экран случайное число от N до M, а также идентификатор потока.

3. Создание приложения, реализующего одновременную параллельную работу Q таймеров, каждый из которых с периодичностью раз в (N*10) мс выводит на экран случайное число от N до M и номер текущего потока.

 

Примечание. Код программы может быть выполнен на языках C#, C++, Java


 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-03-02 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: