Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа.docx
Скачиваний:
21
Добавлен:
30.03.2015
Размер:
395.12 Кб
Скачать

2.3 Метод вычисления отклонений каждого значения от среднего арифметического

Для вычисления отклонений всех чисел выполним следующие действия:

  1. Находим среднее арифметическое;

  2. Для вычисления отклонение из данного набора чисел вычитаем среднее арифметическое.

Среднее арифметическое нескольких величин — это отношение суммы величин к их количеству.

Среднее арифметическое находится по формуле

(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(): Заставляет ждать, пока другой поток или процесс не пошлют сигнал об активизации объекта событие.