
- •Курсовая работа
- •Содержание
- •Задание
- •1 Описание общего алгоритма и интерфейса программы
- •1.1 Описание общего алгоритма
- •1.2 Интерфейса программы
- •2 Описание методов решения и алгоритмов задач, реализуемых каждым потоком
- •2.1 Метод заполнения массива случайными числами
- •2.2 Метод вычисления минимальных и максимальных значений
- •2.3 Метод вычисления отклонений каждого значения от среднего арифметического
- •3 Описание методов создания, уничтожения и синхронизации потоков, примененных в программе
- •3.1 Создание потоков
- •3.2 Синхронизация потоков
- •3.3 Завершение потоков
- •4 Листинг программы
- •Заключение
- •Список использованной литературы
2.3 Метод вычисления отклонений каждого значения от среднего арифметического
Для вычисления отклонений всех чисел выполним следующие действия:
Находим среднее арифметическое;
Для вычисления отклонение из данного набора чисел вычитаем среднее арифметическое.
Среднее арифметическое нескольких величин — это отношение суммы величин к их количеству.
Среднее арифметическое находится по формуле
|
(2) |
|
(3) |
Пример 2. Дан массив A = {-359, 126, 803, 913, -716};
Найти отклонений всех чисел от среднего арифметического.
Решение:
Сумма чисел в массиве (2):
Вычисление отклонения (3):
|
|
|
|
|
Блок схема 2 - Вычисление отклонений каждого значения от среднего арифметического
3 Описание методов создания, уничтожения и синхронизации потоков, примененных в программе
3.1 Создание потоков
Для создания многопоточных приложений в C++Builder реализован абстрактный класс TThread.
TThread - абстрактный класс, который допускает создание отдельных потоков выполняющихся в приложении.
Создайте потомка класса TThread, чтобы представить выполняемый поток в многопоточном приложении.
Каждый новый экземпляр потомка TThread - новый поток выполнения. Множество экземпляров, полученные от класса TThread , делает C++Builder многопоточным приложением.
__fastcall TMyThread::TMyThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------
// B метод объекта Execute(), вставьте код, который должен выполняться, когда поток выполняется.
void __fastcall TMyThread::Execute()
{
//---- Place thread code here ----
}
//----------------------------------------------------------------------
Для получения безопасного доступа к управлению свойствами и методами VCL-объектов в потоке предусмотрен метод Synchronize()
//---------------------------------------------------------------------------
void __fastcall ThreadLenghtLine::Execute()
{
FreeOnTerminate = true; // освободить занятую потоком память по окончании его работы
int ColN = N/6;
while (true){
sum = 0;
WaitForSingleObject(FMain->g_BusyEvent[1], INFINITE); //ждём разрешение на обработку
ResetEvent(FMain->g_BusyEvent[1]); //запрещаем переформирование массива
ResetEvent(FMain->g_BusyEvent[0]); //запрещаем переформирование массива
for (int i = 0; i<ColN*6;) { //считаем длину
sum += CalcLengthLine(FMain->A[i++], FMain->A[i++], FMain->A[i++], FMain->A[i++], FMain->A[i++], FMain->A[i++]);
}
count++;
if(Terminated) break; // прекратить извне поток
Synchronize(&Mon); //блокирует одновременный доступ к компоненту нескольких потоков
Sleep(T*1000);
}
}
//---------------------------------------------------------------------------
void __fastcall ThreadLenghtLine::Mon()
{
FLenghtLine->RELenghtLine->Lines->Add(IntToStr(count) + ") " + FloatToStr(sum));
SetEvent(FMain->g_BusyEvent[0]); //разрешаем параллельную обработку
SetEvent(FMain->g_BusyEvent[1]); //разрешаем параллельную обработку
}
3.2 Синхронизация потоков
Синхронизации потоков основывается на использовании событий (event). Объект типа событие может принимать одно из двух состояний: активное или пассивное. Когда событие находится в активном состоянии, его видят многие потоки одновременно. В результате такой объект можно использовать для управления работой сразу многих потоков. В библиотеке VCL события представлены классом TEvent.
Метод CreatEvents(): Создает объект класса TEvent, представляющий объект события.
Метод ResetEvent(): Переводит объект события в пассивное состояние.
Метод SetEvent() : Переводит объект события в активное состояние.
WaitForSingleObject(): Заставляет ждать, пока другой поток или процесс не пошлют сигнал об активизации объекта событие.