лабараторная работа. Теория_к_лабораторным. 1. Применение параллельных вычислений
Скачать 0.7 Mb.
|
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 |