Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
27
Добавлен:
12.02.2015
Размер:
1.01 Mб
Скачать

Создание распределенной системы решения задач

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

Создание библиотеки динамической загрузки включает следующие этапы:

1.Создание статически подключаемой библиотеки, содержащей класс TTask.

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

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

2.5.1.Создание статически подключаемой библиотеки для класса TTask

Вначале необходимо выполнить модификацию заголовочного файла класса. Модификация направлена на создание возможности использования единственного заголовочного файла TTask.h класса TTask как в проекте создания библиотеки, так и в проектах использования класса из библиотеки. На листинге 11 внесенные по отношению к листингу 3 изменения выделены красным цветом.

Разместим файлы модифицированного класса в папке classDll. Пусть имя создаваемой библиотеки для класса TTask будет

MFSclass.dll.

В группу проектов MFSsswProjectGroup нашего тестового приложения добавим новый проект библиотеки с таким именем и разместим его в папке prjClassDll. Включим в него файлы класса TTask (см. рисунок 8). В головной файл проекта включим ссылки на заголовочные файлы класса TTask (см. листинг 12). Построим библиотеку, используя пункты меню Project → Build MFSclass. При этом будут созданы файлы библиотеки импорта MFSclass.lib и собственно библиотеки MFSclass.dll, которую необходимо разместить в общедоступном для операционной системы месте либо просто перенести в папку нашего тестового приложения, что и сделаем в нашем примере.

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

11

 

Системное программное обеспечение

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Рисунок 8. Состав проекта создания библиотеки динамической загрузки

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

Вначале необходимо выполнить модификацию заголовочного файла функционального программного модуля. Модификация направлена на создание возможности использования единственного варианта объявления функционального программного модуля в проекте создания библиотеки динамической загрузки, позволяющего осуществлять динамический вызов модуля в различных приложениях. Модифицированный исходный текст функционального программного модуля, размещенный в папке FuncModuleDll, приведен на листингах 13 - 14.

Пусть имя создаваемой библиотеки динамической загрузки будет

MFSfunc.dll.

В группу проектов MFSsswProjectGroup нашего тестового приложения добавим новый проект библиотеки динамической загрузки с таким именем. Включим в него заголовочный файл класса TTask, библиотеку импорта MFSclass.lib, а также и файлы функционального программного модуля (см. рисунок 9). В головной файл проекта включим ссылки на заголовочные файлы класса TTask и функционального программного модуля (см. листинг 15). Внесенные изменения отмечены красным цветом. Построим библиотеку, используя пункты меню Project → Build MFSfunc. При этом будет создан файл собственно библиотеки MFSfunc.dll, которую необходимо разместить в общедоступном для операционной системы месте либо просто перенести в папку нашего тестового приложения, что и сделаем в нашем примере.

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

12

М.Ф.Степанов

Создание распределенной системы решения задач

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

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

2.6.1.Тестирование библиотеки динамической загрузки

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

Внесем в проект приложения TaskSolve следующие изменения:

¾Удалим из проекта TaskSolve файлы класса TTask и функционального программного модуля.

¾Включим в проект TaskSolve модифицированный заголовочный файл класса TTask и библиотеку импорта MFSclass.lib.

¾Включим в проект TaskSolve модифицированный заголовочный файл функционального программного модуля.

¾Установим в заголовочном файле экранной формы обращение к

модифицированному заголовочному файлу класса TTask:

#include "..\classDll\TTask.h"

¾Создадим вспомогательную функцию solveTask(), предназначенную для вызова функционального программного модуля из библиотеки (см. листинги 16 - 17).

¾Модифицируем функцию обработки щелчка на кнопке экранной формы в соответствии с листингом 18.

Изменения отмечены красным цветом.

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

13

 

Системное программное обеспечение

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

2.6.2.Создание отдельного потока команд (нити) для вызова функционального программного модуля

Для снабжения приложения возможностью работы с дополнительными потоками команд (нитями) необходимо создать специальный класс, порождаемый от класса TThread.

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

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

Врассматриваемом случае это может быть, например, TSolveThread (см. листинги 19 и 20).

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

solveTask().

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

Экранную форму приложения снабдим компонентами (кнопками) для управления функциональным потоком команд ("старт", "стоп", "продолжение", "прекращение"). Исходные коды функций для указанных кнопок приведены на листингах 21 – 24.

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

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

Поскольку указатель на экземпляр класса TSolveThread используется в нескольких функциях класса экранной формы приложения, то его следует объявить в заголовочном файле, модифицированный текст которого приведен на листинге 26. Изменения отмечены красным цветом.

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

14

М.Ф.Степанов

Создание распределенной системы решения задач

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Модифицированная экранная форма приложения TaskSolve примет вид, представленный на рис. 10.

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

TaskSolve.

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

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

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

15

 

Системное программное обеспечение

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

16

М.Ф.Степанов

Создание распределенной системы решения задач

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

17

 

Системное программное обеспечение

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

Исходными данными в данной задаче являются параметры дифференциального уравнения (матрица A ), начальные условия x0 ,

интервал анализа [t0,tk ], шаг интегрирования h .

Входной язык должен быть проблемно-ориентированным и предоставлять удобные средства для описания исходных данных задачи. Например, наподобие входного языка системы МАТЛАБ:

n=3;

A=[0 1 0; 0 0 1; -1,5 -2,6 -3.7]; x0=[-1,9;0;0];

t0=-1,1; tk=+10,5; h=0,01;

Семантика обозначений переменных здесь задана в соответствии с задачей.

2.8.Построение и исследование грамматики входного языка

Анализ входного языка включает несколько этапов:

лексический анализ,

синтаксический анализ,

семантический анализ,

подготовка к генерации,

генерация выходного текста.

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

Для этапа лексического анализа разработаем правоассоциативную регулярную грамматику, правила которой имеют вид

S::=t|tN, t VT, S,N VN.

Язык содержит 5 типов предложений, которые могут следовать в заданном порядке. Элементы массивов являются действительными числами со знаком. В учебных целях, для простоты, полагаем, что действительные числа представляются в формате с фиксированной точкой (запятой). При этом дробная часть может быть опущена вместе с разделительной точной (запятой). Знак "+" (плюс) может быть опущен. В этом случае считается, что число положительное. Элементы массивов перечисляются через пробел по строкам, которые разделяются точкой с запятой.

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

18

М.Ф.Степанов

Создание распределенной системы решения задач

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Данный язык может быть задан, например, грамматикой

G1(VT,VN,P, <задача>),

где <задача> - начальный символ грамматики,

VT = {n|A|x|t|k|h|0|1|2|3|4|5|6|7|8|9|.|+|-|[|]|;|,|=| } – словарь терминальных символов, где " " – обозначает пробел,

VN = {<задача> | <размерность> | <значение размерности> | <матрица А> | <элементы матрицы А> | <все элементы матрицы А> | <элемент матрицы А> | <дробь элемента матрицы А> | <x0> | <все элементы x0> | <элемент x0> | <дробь элемента x0> | <t0> | <значение t0> | <дробь значения t0> | <tk> | <значение tk> | <дробь значения tk> | <h> | <значение h> | <дробь значения h> | <остаток задачи1> |<остаток задачи2> | <остаток задачи3> | <остаток задачи4> | <остаток задачи5> | <остаток задачи6> | <остаток задачи7> | <остаток задачи8> | <остаток задачи9> | <остаток задачи10> | <остаток задачи11> | <остаток задачи12> | <остаток задачи13> | <остаток задачи14> | <Успех>} – словарь нетерминальных символов,

P – правила подстановки:

<задача>::=n<размерность> <размерность>::= =<значение размерности>

<значение размерности>::=0<значение размерности> | 1<значение размерности> | 2<значение размерности> | 3<значение размерности> | 4<значение размерности> | 5<значение размерности> | 6<значение размерности> | 7<значение размерности> | 8<значение размерности> | 9<значение размерности> | ;<остаток задачи1>

<остаток задачи1>::=A<матрица А> | '\r'<остаток задачи1> | '\n'<остаток задачи1> <матрица А>::= =<элементы матрицы А> <элементы матрицы А>::=[<строка элементов матрицы А>

<строка элементов матрицы А>::= <элемент матрицы А> | -<элемент матрицы А> | +<элемент матрицы А> | 0<элемент матрицы А> | 1<элемент матрицы А> | 2<элемент матрицы А> | 3<элемент матрицы А> | 4<элемент матрицы А> | 5<элемент матрицы А> | 6<элемент матрицы А> | 7<элемент матрицы А> | 8<элемент матрицы А> | 9<элемент матрицы А> | ;<строка элементов матрицы А> | ]<остаток задачи2>

<элемент матрицы А>::= 0<элемент матрицы А> | 1<элемент матрицы А> | 2<элемент матрицы А> | 3<элемент матрицы А> | 4<элемент матрицы А> | 5<элемент матрицы А> | 6<элемент матрицы А> | 7<элемент матрицы А> | 8<элемент матрицы А> | 9<элемент матрицы А> |.<дробь элемента матрицы А> |,<дробь элемента матрицы А> | <строка элементов матрицы А> | ;<строка элементов матрицы А> | ]<остаток задачи2>

<дробь элемента матрицы А> ::= 0<дробь элемента матрицы А> | 1<дробь элемента матрицы А> | 2<дробь элемента матрицы А> | 3<дробь элемента матрицы А> | 4<дробь элемента матрицы А> | 5<дробь элемента матрицы А> | 6<дробь элемента матрицы А> | 7<дробь элемента матрицы А> | 8<дробь элемента матрицы А> | 9<дробь элемента матрицы А> | - <элемент матрицы А> | +<элемент матрицы А> | ;<строка элементов матрицы А> | <строка элементов матрицы А> | ]<остаток задачи2>

<остаток задачи2>::=;<остаток задачи3> <остаток задачи3>::=x<остаток задачи4> <остаток задачи4>::=0<остаток задачи5> <остаток задачи5>::= =<x0> <x0>::=[<строка элементов x0>

<строка элементов x0>::= <элемент x0> | -<элемент x0> | +<элемент x0> | 0<элемент x0> | 1<элемент x0> | 2<элемент x0> | 3<элемент x0> | 4<элемент x0> | 5<элемент x0> | 6<элемент x0> | 7<элемент x0> | 8<элемент x0> | 9<элемент x0> | ;<все элементы x0> | ]<остаток задачи 6>

<элемент x0>::= 0<элемент x0> | 1<элемент x0> | 2<элемент x0> | 3<элемент x0> | 4<элемент x0> | 5<элемент x0> | 6<элемент x0> | 7<элемент x0> | 8<элемент x0> | 9<элемент x0> |

.<дробь элемента x0> | ,<дробь элемента x0> | <строка элементов x0> | ;<строка элементов

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

19

 

Системное программное обеспечение

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

x0> | ]<остаток задачи 6>

<дробь элемента x0>::=0<дробь элемента x0> | 1<дробь элемента x0> | 2<дробь элемента x0> | 3<дробь элемента x0> | 4<дробь элемента x0> | 5<дробь элемента x0> | 6<дробь элемента x0> | 7<дробь элемента x0> | 8<дробь элемента x0> | 9<дробь элемента x0> | -<элемент x0> | +<элемент x0> | <строка элементов x0> | ;<строка элементов x0> | ]<остаток задачи 6>

<остаток задачи 6>::=;<остаток задачи 7> <остаток задачи 7>::=t<остаток задачи 8> <остаток задачи 8>::=0<остаток задачи 9> <остаток задачи 9>::= =<t0>

<t0>::= <значение t0> | -<значение t0> | +<значение t0> | 0<значение t0> | 1<значение t0> | 2<значение t0> | 3<значение t0> | 4<значение t0> | 5<значение t0> | 6<значение t0> | 7<значение t0> | 8<значение t0> | 9<значение t0>

<значение t0>::= <значение t0> | 0<значение t0> | 1<значение t0> | 2<значение t0> | 3<значение t0> | 4<значение t0> | 5<значение t0> | 6<значение t0> | 7<значение t0> | 8<значение t0> | 9<значение t0> | .<дробь значения t0> | ,<дробь значения t0> | ;<остаток задачи 10>

<дробь значения t0> ::= 0<дробь значения t0> | 1<дробь значения t0> | 2<дробь значения t0> | 3<дробь значения t0> | 4<дробь значения t0> | 5<дробь значения t0> | 6<дробь значения t0> | 7<дробь значения t0> | 8<дробь значения t0> | 9<дробь значения t0> | ;<остаток задачи 10>

<остаток задачи 10>::=t<остаток задачи 11> <остаток задачи 11>::=k<остаток задачи 12> <остаток задачи 12>::= =<tk>

<tk>::= <значение tk> | -<значение tk> | +<значение tk> | 0<значение tk> | 1<значение tk> | 2<значение tk> | 3<значение tk> | 4<значение tk> | 5<значение tk> | 6<значение tk> | 7<значение tk> | 8<значение tk> | 9<значение tk>

<значение tk>::= <значение tk> | 0<значение tk> | 1<значение tk> | 2<значение tk> | 3<значение tk> | 4<значение tk> | 5<значение tk> | 6<значение tk> | 7<значение tk> | 8<значение tk> | 9<значение tk> | .<дробь значения tk> | ,<дробь значения tk> | ;<остаток задачи 13>

<дробь значения tk> ::= 0<дробь значения tk> | 1<дробь значения tk> | 2<дробь значения tk> | 3<дробь значения tk> | 4<дробь значения tk> | 5<дробь значения tk> | 6<дробь значения tk> | 7<дробь значения tk> | 8<дробь значения tk> | 9<дробь значения tk> | ;<остаток задачи 13>

<остаток задачи 13>::=h<остаток задачи 14> <остаток задачи 14>::= =<h>

<h>::= <значение h> | -<значение h> | +<значение h> | 0<значение h> | 1<значение h> | 2<значение h> | 3<значение h> | 4<значение h> | 5<значение h> | 6<значение h> | 7<значение h> | 8<значение h> | 9<значение h>

<значение h>::= <значение h> | 0<значение h> | 1<значение h> | 2<значение h> | 3<значение h> | 4<значение h> | 5<значение h> | 6<значение h> | 7<значение h> | 8<значение h> | 9<значение h> | .<дробь значения h> | ,<дробь значения h> | ;<Успех>

<дробь значения h> ::= 0<дробь значения h> | 1<дробь значения h> | 2<дробь значения h> | 3<дробь значения h> | 4<дробь значения h> | 5<дробь значения h> | 6<дробь значения h> | 7<дробь значения h> | 8<дробь значения h> | 9<дробь значения h> | ;<Успех>

Анализ построенной грамматики показывает, что все правила подстановки имеют вид

S::=t|tN, t VT, S,N VN,

а, следовательно, удовлетворяют требованиям, предъявляемым к грамматикам 3-го типа, т.е. грамматика относится к типу регулярных грамматик.

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

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

20

М.Ф.Степанов

Соседние файлы в папке Системное программирование