Главная страница

лабараторная работа. Теория_к_лабораторным. 1. Применение параллельных вычислений


Скачать 0.7 Mb.
Название1. Применение параллельных вычислений
Анкорлабараторная работа
Дата24.10.2021
Размер0.7 Mb.
Формат файлаdoc
Имя файлаТеория_к_лабораторным.doc
ТипДокументы
#254886
страница8 из 9
1   2   3   4   5   6   7   8   9
i = 0; i < _ThreadsCount; i++)

{

//Расчет величины ускорения в зависимости от выбранного режима управления потоками

//при помощи событий

int _acceleration = 0;

if (m_IsAutoEvent)

_acceleration = 100 + _rnd.Next(100);

else

_acceleration = 10 + _rnd.Next(10);

//Класс ThreadRaceCompetitor описывает 'участника гонки',

//содержит 'технические параметры гонщика'

//и определяет логику ускорения и переключения передач

ThreadRaceCompetitor _competitor;

_competitor = new ThreadRaceCompetitor(i, 100, 1, _acceleration);

Thread _Thread = new Thread(new ParameterizedThreadStart(ThreadDispatchingProc));

//Все создаваемые потоки - фоновые и завершаются вместе с основным приложением

_Thread.IsBackground = true;

//Старт: ThreadDispatchingProc(_competitor)

_Thread.Start(_competitor);

//Добавляем созданный поток в список потоков

m_Threads.Add(_Thread);

}

//...

//<исходный код частично отсутствует>

//...

}

//Прохождение трассы отдельным участником

private void ThreadDispatchingProc(object state)

{

ThreadRaceCompetitor _competitor = (ThreadRaceCompetitor)state;

ProgressBar _bar = m_ThreadDispatchingBars[_competitor.Index];

//Основной цикл

while (_bar.Value < _bar.Maximum)

{

//Остановка по требованию события

if (m_IsAutoEvent)

m_AutoEvent.WaitOne();

else

m_ManualEvent.WaitOne();

//'жмем на газ'...

_competitor.Accelerate();

int _newValue = _bar.Value + _competitor.Speed;

//Обновление элементов управления в потоке пользовательского интерфейса

//В качестве параметра передаем экземпляр Delegate, параметризованного лямбда - выражением.

_bar.Invoke(new MethodInvoker(() =>

{

if (_newValue < _bar.Maximum)

_bar.Value = _newValue;

else

_bar.Value = _bar.Maximum;

}));

Thread.Sleep(100);

//Вхождение в зону семафора 1

if (_bar.Value > 2000
1   2   3   4   5   6   7   8   9


написать администратору сайта