Скачиваний:
56
Добавлен:
11.02.2014
Размер:
629.43 Кб
Скачать

МЕТОДИКА РАБОТЫ

Проведение работы требует соответствующих:

технического обеспечения, в роли которого выступает рабочая станция компьютерной сети кафедры;

программного обеспечения, в роли которого выступает C++ Builder;

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

Содержание учебной части работы составляют:

разработка класса языка С++, осуществляющего выполнение функционального программного модуля в специальном потоке команд (нити);

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

Изложение методики выполнения работы проводится на конкретном примере.

Рассмотрим процесс разработки системы обработки информации, функциональной задачей которой является решение дифференциального

уравнения вида:

x = Ax , x R

n

,

A R

n

×R

n

 

&

 

 

 

 

 

 

при начальных условиях

x(t0 ) = x0

 

 

 

 

 

 

на временном отрезке

t [t0 ,tk ].

 

 

 

 

 

 

Входе выполнение предыдущих лабораторных работ были созданы:

функциональный программный модуль, решающий заданную задачу обработки информации;

библиотека динамической загрузки, содержащая функциональный программный модуль;

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

Для снабжения приложения возможностью работы с дополнитель-

ными потоками команд (нитями) необходимо создать специальный класс, порождаемый от класса TThread. В нем необходимо реализовать метод Execute(), в котором собственно и должен размещаться программный код нити. При этом действия нити, разделяющие некоторые объекты с главной нитью приложения, должны быть синхронизированы. Для этого вызов функции, содержащей программный код критической секции должен осуществляться с помощью метода Synchronize() класса TThread.

21

Необходимо также предусмотреть возможность завершения работы потока команд нити при вызове функции Terminate() родительского класса TThread. В рассматриваемом примере всё это может быть, например, реализовано в виде класса TSolveThread (см. листинги 1 и 2).

Листинг 1. Заголовочный файл класса TSolveThread (файл

TSolveThread.h)

#ifndef TSolveThreadH #define TSolveThreadH #include <Classes.hpp> #include <ComCtrls.hpp> #include "TTask.h"

//------------------------------------------------------------------------

class TSolveThread : public TThread

{

private:

TProgressBar *fPrBar;

void __fastcall TSolveThread::DoVisualStep(); protected:

void __fastcall Execute(); public:

__fastcall TSolveThread(TProgressBar *_PrBar); TTask *tsk;

};

#endif

Листинг 2. Файл реализации класса TSolveThread (файл

TSolveThread.cpp)

#include <vcl.h> #pragma hdrstop

#include "TSolveThread.h" #include "solveTask.h" #pragma package(smart_init)

//------------------------------------------------------------------------

__fastcall TSolveThread::TSolveThread(TProgressBar *_PrBar) : TThread(true)

{

fPrBar = _PrBar; tsk = NULL;

FreeOnTerminate = true;

}

void __fastcall TSolveThread::Execute()

{

Synchronize(DoVisualStep);

}

void __fastcall TSolveThread::DoVisualStep()

{

int iLexemCount; try {

if (!Terminated) {

int iRet = solveTask(&tsk);

if (fPrBar != NULL) fPrBar->StepIt();

}

}

__finally { fPrBar = NULL;

tsk

= NULL;

}

 

}

Собственно динамический вызов функционального программного модуля в этом случае осуществляется в функции solveTask().

22

Для контроля хода решения функциональной задачи снабдим экранную форму приложения индикатором (компонент TProgressBar), передвижением ползунка которого будет управлять создаваемый поток команд (нить).

Экранную форму приложения снабдим компонентами (кнопками) для управления функциональным потоком команд ("Старт", "Стоп", "Продолжить", "Прекратить"), как это показано на рис. 7.

Для исследования эффективности решения задачи с использованием специального потока команд (нити) и без него снабдим экранную форму приложениякомпонентами, вкоторыхбудемотображатьвремярешениязадачи.

Исходные коды функций обработки щелчков мышью для указанных кнопок приведены на листингах 3 – 6.

Листинг 3. Функция кнопки "Старт" (файл TFormTaskSolve.cpp)

void __fastcall TFormTaskSolve::StartSolveBitBtnClick(TObject *Sender)

{

setTask(&tsk); // формирование постановки задачи if (tsk != NULL) {

StartSolveBitBtn->Visible = false; startSolveTime = GetTickCount(); RunProgressBar->Visible = true; RunProgressBar->Position = 0; RunProgressBar->Brush->Color = clGreen; RunProgressBar->Repaint(); RunProgressBar->StepIt();

if (pSolveThread == NULL) {

pSolveThread = new TSolveThread(RunProgressBar); pSolveThread->OnTerminate = SolveThreadDone; // вызывается по окончании pSolveThread->ppTask = &tsk;

pSolveThread->Resume(); StopSolveBitBtn->Visible = true; CancelSolveBitBtn->Visible = true;

}

}

}

Листинг 4. Функция кнопки "Стоп" (файл TFormTaskSolve.cpp)

void __fastcall TFormTaskSolve::StopSolveBitBtnClick(TObject *Sender)

{

if (pSolveThread != NULL) { pSolveThread->Suspend(); StopSolveBitBtn->Visible = false; ContinueSolveBitBtn->Visible = true; CancelSolveBitBtn->Visible = false;

}

}

Листинг 5. Функция кнопки "Продолжение"

void __fastcall TFormTaskSolve::ContinueSolveBitBtnClick(TObject *Sender)

{

if (pSolveThread != NULL) {

if (pSolveThread->Suspended) { pSolveThread->Resume(); StopSolveBitBtn->Visible = true; CancelSolveBitBtn->Visible = true; ContinueSolveBitBtn->Visible = false;

}

}

}

23

Листинг 6. Функция кнопки "Прекращение"

void __fastcall TFormTaskSolve::CancelSolveBitBtnClick(TObject *Sender)

{

if (pSolveThread != NULL) { pSolveThread->Terminate(); StopSolveBitBtn->Visible = false; ContinueSolveBitBtn->Visible = false; CancelSolveBitBtn->Visible = false; StartSolveBitBtn->Visible = true;

}}

По окончании решения функциональной задачи необходимо осуществить отображение полученных результатов. Для этого воспользуемся функцией, вызываемой по окончании работы потока команд (нити). Ее исходный код, приведен на листинге 7.

Листинг 7. Функция, вызываемая по окончании работы потока команд (файл TFormTaskSolve.cpp)

void __fastcall TFormTaskSolve::SolveThreadDone(TObject *Sender)

{

StopSolveBitBtn->Visible = false; ContinueSolveBitBtn->Visible = false; CancelSolveBitBtn->Visible = false; StartSolveBitBtn->Visible = true; pSolveThread = NULL; viewResultSolveTask();

endSolveTime = GetTickCount();

int iSolveTime = endSolveTime - startSolveTime; TimeSolveWithThreadsEdit->Text = iSolveTime; RunProgressBar->Visible = false;

}

Модифицированный заголовочный файл экранной формы приложения приведен на листинге 8. Жирным шрифтом выделены изменения, вносимые для использования класса TSolveThread, реализующего функциональные возможности создаваемого потока команд (нити).

Листинг 8. Фрагмент заголовочного файла программного кода экранной формы приложения (файл TFormTaskSolve.h)

#ifndef FrmTaskSolveH #define FrmTaskSolveH

// здесь размещаются утверждения #include , добавленные средой С++ Builder #include "..\classDll\TTask.h"

#include "..\class\TSolveThread.h" class TFormTaskSolve : public TForm

{

 

// IDE-managed Components

__published:

// объявления, внесенные средой С++ Builder (не изменяются)

private:

 

// User declarations

void

setTask(TTask** _tsk);

void

viewResultSolveTask();

void __fastcall SolveThreadDone(TObject *Sender); int startSolveTime;

int endSolveTime; TTask *tsk;

TSolveThread

*pSolveThread;

public:

// User declarations

__fastcall TFormTaskSolve(TComponent* Owner); };

extern PACKAGE TFormTaskSolve *FormTaskSolve; #endif

24

На рис. 7 и 8 приведены экранные формы работающего приложения с исходными данными и результатами, полученными по окончании решения задачи соответственно.

Рис. 7. Экранная форма приложения для исследования решения функциональной задачи в основном и специальном потоке команд (нити)

Рис. 8. Экранная форма работающего приложения с исходными данными контрольного примера

25

Рис. 9. Экранная форма работающего приложения с результатами решения контрольного примера

26

ТРЕБОВАНИЯ БЕЗОПАСНОСТИ ТРУДА

При работе на ЭВМ должны выполняться общие правила работы с электрическими установками. Категорически запрещается работа на ЭВМ за дисплеем со снятой крышкой.

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

Данная лабораторная работа выполняется в следующей последовательности:

1.Снабдить исходное приложение средствами многонитевости.

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

3.Дополнить экранную форму приложения компонентами для отображения времени решения задачи.

4.Решить тестовую задачу с использованием дополнительной нити и без использования нитей.

5.Сравнить затраченное на решение время.

6.Выполнить п.п. 4 и 5 для различных исходных данных (увеличить время моделирования в несколько раз).

7.Сделать выводы об эффективности применения нитей при решении задач небольшой и большой вычислительной сложности.

ОТЧЕТ О РАБОТЕ

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

в которых приводятся исходные тексты программных модулей, описываются алгоритмы и программы.

Отчет допускается оформлять в соответствии с общепринятыми правилами в электронной форме в формате MS Word 97 и выше с включением необходимых исходных текстов и рисунков, иллюстрирующих с разумной детальностью ход выполнения работы и полученные результаты.

27

ЛИТЕРАТУРА

1.Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++ / Г. Буч. 2-е изд. М.: Бином, СПб.: Невский диалект, 1999. 560 с.

2.Корн Г. Справочник по математике для научных работников и инженеров / Г.Корн, Т.Корн. М.: Наука, 1977. 832 с.

3.Крылов В.И. Вычислительные методы: в 2 т. / В.И. Крылов, В.В. Бобков,

П.И. Монастырский. М.: Наука, 1976.- 304 с.; 1977.- 400 с.

4. Рейсдорф К. Borland C++ Builder

3. Освой самостоятельно /

К. Рейсдорф. М.: БИНОМ, 1999. 736 с.

 

5.Шамис В.А. С++ Builder 3. Техника визуального программирования / В.А. Шамис. М.: Нолидж, 1998. 512 с.

28

СОЗДАНИЕ И ИССЛЕДОВАНИЕ СРЕДСТВ МНОГОНИТЕВОСТИ

Методические указания к выполнению лабораторной работы

Составил СТЕПАНОВ Михаил Федорович

Рецензент А.А. Львов

Редактор Н.Н. Крылова

Лицензия ИД № 06268 от 14.11.2001

Подписано в печать __.__.2009

Формат 60 х 84 1-24

Бум. тип.

Усл.-печ. л. 2,0

Уч.-изд. л. 2,0

Тираж 100 экз.

Заказ

 

Саратовский государственный технический университет 410054, г. Саратов, ул. Политехническая, 77 Копипринтер СГТУ, 410054, г. Саратов, ул. Политехническая, 77