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

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

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

void TFormTaskSolve::setTask(TTask** _tsk) { // формирование постановки задачи

TTask* tsk; tsk = *_tsk; String s; double d, t;

double t0, tk, h; int n = 0;

n = nCSpinEdit->Value; s = t0Edit->Text;

t0 = charToDouble(s.c_str()); s = tkEdit->Text;

tk = charToDouble(s.c_str()); s = hEdit->Text;

h = charToDouble(s.c_str()); if (tsk != NULL)

delete tsk;

tsk = new TTask(n,t0,tk,h); *_tsk = tsk;

for (int i=0; i<n; i++) {

s = x0_StringGrid->Cells[1][i+1]; d = charToDouble(s.c_str()); tsk->setElemX0(i,d);

for (int j=0; j<n; j++) {

s = A_StringGrid->Cells[j+1][i+1]; d = charToDouble(s.c_str()); tsk->setElemA(i,j,d);

}

}

tsk = NULL;

}

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

Листинг 9. Исходный код функции отображения на экранной форме результатов решения задачи (файл TFormTaskSolve.cpp)

void TFormTaskSolve::viewResultSolveTask()

{ // отображение результатов решения задачи

TaskResultTabSheet->TabVisible = true; TaskPageControl->ActivePageIndex = 3; String s;

double t, d;

int N = tsk->getN(); DataResultStringGrid->RowCount = N + 1; int ns = ResultChart->SeriesCount();

int n = tsk->getSizeX(); for (int i=0; i<n; i++) {

ResultChart->Series[i]->Clear(); s = i+1;

s = "x[" + s; s += "]";

ResultChart->Series[i]->Title = s;

}

for (int k=0; k<N; k++) { t = tsk->getElemAt(k);

DataResultStringGrid->Cells[0][k+1] = t; for (int i=0; i<n; i++) {

d = tsk->getElemAx(i,k); DataResultStringGrid->Cells[i+1][k+1] = d; ResultChart->Series[i]->AddXY(t,d,"",0);

}

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

11

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

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

}

for (int i=0; i<n; i++) { ResultChart->Series[i]->Repaint();

}

}

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

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

#ifndef FrmTaskSolveH #define FrmTaskSolveH

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

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

#include "..\class\TTask.h" //---------------------------------------------------------------------------

class TFormTaskSolve : public TForm

{

__published: // IDE-managed Components

// здесь - объявления, внесенные средой С++ Builder вручную не изменять !!!

private: // User declarations

void

setTask(TTask** _tsk);

void

viewResultSolveTask();

int startSolveTime;

int endSolveTime;

TTask *tsk;

public:

// User declarations

__fastcall TFormTaskSolve(TComponent* Owner); };

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

extern PACKAGE TFormTaskSolve *FormTaskSolve; //---------------------------------------------------------------------------

#endif

Листинг 11. Модифицированный начальный фрагмент заголовочного файла класса TTask (файл TTask.h)

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

#ifndef TTaskH #define TTaskH

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

#ifdef __DLL__

#define DLL_EXP_TTask __declspec(dllexport) #else

#define DLL_EXP_TTask __declspec(dllimport) #endif

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

class DLL_EXP_TTask TTask

{ // остальной текст без изменений

Листинг 12. Головной файл библиотеки MFSclass.dll

#include <vcl.h> #include <windows.h> #pragma hdrstop

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

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

#pragma argsused

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)

{

return 1;

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

12

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

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

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

}

Листинг 13. Модифицированный заголовочный файл функционального программного модуля (файл MFSmodule.h)

#ifndef MFSmoduleH #define MFSmoduleH #include "..\classDll\TTask.h"

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

#ifdef __DLL__

#define DLL_EXP_MFSmodule __declspec(dllexport) #else

#define DLL_EXP_MFSmodule __declspec(dllimport) #endif //-------------------------------------------------------------------------

extern "C" int DLL_EXP_MFSmodule __stdcall MFSmodule(TTask *tsk); extern "C" int MFSyFunc(TTask *tsk, double *x, double *dx);

extern "C" int MFSintegral(TTask *tsk, double *x, double *dx, double *dx1, double h); #endif

Листинг 14. Модифицированный начальный фрагмент файла реализации функционального программного модуля (файл

MFSmodule.cpp)

#pragma hdrstop #include "MFSmodule.h"

#pragma package(smart_init) //-------------------------------------------------------------------------

int DLL_EXP_MFSmodule __stdcall MFSmodule(TTask *tsk)

{

int iRet = -1;

// здесь остальной программный код функционального модуля без изменений

Листинг 15. Головной файл библиотеки динамической загрузки

MFSfunc.dll

#include <vcl.h> #include <windows.h>

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

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

#pragma hdrstop //-------------------------------------------------------------------------

#pragma argsused

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)

{

return 1;

}

Листинг 16. Заголовочный файл функции динамического вызова функционального программного модуля (файл solveTask.h)

#ifndef solveTaskH #define solveTaskH

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

extern "C" int solveTask(TTask** _tsk); #endif

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

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

13

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

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

#pragma hdrstop #include <vcl.h> #include "solveTask.h" #include <SysInit.hpp>

#pragma package(smart_init) //-------------------------------------------------------------------------

int solveTask(TTask** _tsk) { // решение задачи

TTask* tsk; tsk = *_tsk;

// подключение библиотеки динамической загрузки

HINSTANCE dllInstance = NULL; // адрес DLL try { // подключение DLL

dllInstance = LoadLibrary("MFSfunc.dll");

}

catch (...) {

Application->MessageBox("Имя библиотеки: MFSfunc.dll", "Ошибка загрузки DLL",MB_OK);

}

// определение адреса функционального программного модуля int (__stdcall *pFM) (TTask *tsk); // указатель на модуль

pFM = NULL;

if (dllInstance != NULL) { // DLL уже подключена - загрузка модуля pFM = (int (__stdcall *)(TTask *tsk))

GetProcAddress(dllInstance,"MFSmodule");

}

// вызов функционального программного модуля int iRet = -1;

if (pFM != NULL) { iRet = (*pFM)(tsk); if (iRet < 0) {

Application->MessageBox("Имя программного модуля: MFSmodule",

"Ошибка выполнения функционального программного модуля",MB_OK);

}

}

else {

Application->MessageBox("Имя программного модуля: MFSmodule",

"Ошибка вызова функционального программного модуля",MB_OK);

}

if (dllInstance != NULL) { // DLL подключена int ret = FreeLibrary(dllInstance);

if (ret != 1)

Application->MessageBox("Имя библиотеки: MFSfunc.dll",

"Ошибка выгрузки DLL",MB_OK);

}

pFM = NULL; dllInstance = NULL; tsk = NULL;

return iRet;

}

Листинг 18. Модифицированная функция обработки щелчка на кнопке "Решение задачи" экранной формы (файл TFormTaskSolve.cpp)

void __fastcall TFormTaskSolve::SolveBitBtnClick(TObject *Sender)

{

LexTabSheet->TabVisible = false; TaskResultTabSheet->TabVisible = false; TaskTextTabSheet->TabVisible = false; TaskTextMemo->Visible = false; startSolveTime = GetTickCount();

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

14

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

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

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

RunProgressBar->Visible = true; RunProgressBar->Position = 0; RunProgressBar->StepIt();

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

RunProgressBar->StepIt();

int iRet = solveTask(&tsk); // решение задачи RunProgressBar->StepIt();

endSolveTime = GetTickCount();

int iSolveTime = endSolveTime - startSolveTime; TimeSolveEdit->Text = iSolveTime;

if (iRet == 0) { viewResultSolveTask(); RunProgressBar->StepIt();

}

RunProgressBar->Visible = false;

}

Листинг 19. Заголовочный файл класса 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 **ppTask;

};

#endif

Листинг 20. Файл реализации класса 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;

ppTask

= NULL;

FreeOnTerminate

= true;

Priority

= tpLowest;

}

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

void __fastcall TSolveThread::Execute()

{

Synchronize(DoVisualStep);

}

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

15

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

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

 

 

 

void __fastcall TSolveThread::DoVisualStep()

 

 

 

{

 

 

 

 

 

 

 

int iLexemCount;

 

 

 

 

 

 

try {

 

 

 

 

 

 

 

if (!Terminated)

{

 

 

 

 

 

int iRet = solveTask(ppTask);

// решение задачи

 

 

 

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

 

 

 

}

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

__finally {

 

 

 

 

 

 

 

fPrBar = NULL;

 

 

 

 

 

 

ppTask

= NULL;

 

 

 

 

 

}

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

Листинг

21.

Функция

кнопки

"Старт"

(файл

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;

}

}

}

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

void __fastcall TFormTaskSolve::StopSolveBitBtnClick(TObject *Sender)

{

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

}

}

Листинг 23. Функция кнопки "Продолжение" (файл

TFormTaskSolve.cpp)

void __fastcall TFormTaskSolve::ContinueSolveBitBtnClick(TObject *Sender)

{

if (pSolveThread != NULL) {

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

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

16

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

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

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

}

 

 

 

 

 

 

}

 

 

 

 

 

 

}

 

 

 

 

 

 

 

Листинг

24.

Функция

кнопки

"Прекращение"

(файл

TFormTaskSolve.cpp)

 

 

 

void __fastcall TFormTaskSolve::CancelSolveBitBtnClick(TObject *Sender)

 

{

 

 

 

 

 

 

if (pSolveThread != NULL) {

 

 

 

 

pSolveThread->Terminate();

 

 

 

 

StopSolveBitBtn->Visible = false;

 

 

 

ContinueSolveBitBtn->Visible = false;

 

 

 

CancelSolveBitBtn->Visible = false;

 

 

 

StartSolveBitBtn->Visible = true;

 

 

 

}

 

 

 

 

 

 

}

 

 

 

 

 

 

 

Листинг 25. Функция, вызываемая по окончании работы потока

команд (файл 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;

 

 

 

 

}

 

 

 

 

 

 

 

Листинг 26. Фрагмент заголовочного файла программного кода

экранной формы приложения (файл TFormTaskSolve.h)

 

#ifndef FrmTaskSolveH

 

 

 

 

 

#define FrmTaskSolveH

 

 

 

 

 

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

 

 

 

 

 

 

//

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

 

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

 

 

 

 

 

 

#include "..\class\TTask.h"

 

 

 

 

#include "..\class\TSolveThread.h"

 

 

 

 

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

 

 

 

 

 

 

class TFormTaskSolve : public TForm

 

 

 

{

 

 

 

 

 

 

__published: // IDE-managed Components

 

 

 

 

// объявления, внесенные средой С++ Builder

 

 

private: // User declarations

 

 

 

 

void

setTask(TTask** _tsk);

 

 

 

 

void

viewResultSolveTask();

 

 

 

 

int

startSolveTime;

 

 

 

 

 

int

endSolveTime;

 

 

 

 

 

TTask *tsk;

TSolveThread *pSolveThread; public: // User declarations

__fastcall TFormTaskSolve(TComponent* Owner); };

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

extern PACKAGE TFormTaskSolve *FormTaskSolve; #endif

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

17

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

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

char* TFormTaskSolve::setTextTask()

{ // формирование текстового представления постановки задачи int n = nCSpinEdit->Value;

sTaskText = "n=";

sTaskText += nCSpinEdit->Text; sTaskText += ";\r\n";

sTaskText += "A=["; for (int i=0; i<n; i++) {

for (int j=0; j<n; j++) {

sTaskText += A_StringGrid->Cells[j+1][i+1]; sTaskText += " ";

}

if (i < n-1) sTaskText += ";";

}

sTaskText += "];\r\n"; sTaskText += "x0=["; for (int i=0; i<n; i++) {

sTaskText += x0_StringGrid->Cells[1][i+1]; if (i < n-1)

sTaskText += ";";

}

sTaskText += "];\r\n"; sTaskText += "t0="; sTaskText += t0Edit->Text; sTaskText += ";\r\n"; sTaskText += "tk="; sTaskText += tkEdit->Text; sTaskText += ";\r\n"; sTaskText += "h="; sTaskText += hEdit->Text; sTaskText += ";\r\n";

// TaskTextMemo->Lines->Text = sTaskText; return sTaskText.c_str();

}

Листинг 28. Модифицированная функция обработки щелчка на кнопке "Решение задачи" экранной формы (файл TFormTaskSolve.cpp)

void __fastcall TFormTaskSolve::SolveBitBtnClick(TObject *Sender)

{

LexTabSheet->TabVisible = false; TaskResultTabSheet->TabVisible = false; TaskTextTabSheet->TabVisible = false; TaskTextMemo->Visible = false; startSolveTime = GetTickCount(); RunProgressBar->Visible = true; RunProgressBar->Position = 0; RunProgressBar->StepIt();

String s = setTextTask(); // формирование текстового представления постановки задачи

RunProgressBar->StepIt(); viewTextTask();

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

RunProgressBar->StepIt();

int iRet = solveTask(&tsk); // решение задачи RunProgressBar->StepIt();

endSolveTime = GetTickCount();

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

18

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

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

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

int iSolveTime = endSolveTime - startSolveTime; TimeSolveEdit->Text = iSolveTime;

if (iRet == 0) { viewResultSolveTask(); RunProgressBar->StepIt();

}

RunProgressBar->Visible = false;

}

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

void TFormTaskSolve::viewTextTask()

{ // отображение текстового представления постановки задачи

TaskTextTabSheet->TabVisible = true; TaskTextMemo->Visible = true; TaskTextMemo->Lines->Text = sTaskText;

}

Листинг 29. Класс TLexem (файл TLexem.h)

#ifndef TLexemH #define TLexemH

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

class TLexem

{

private:

char* szText; int iType; int iValue;

double dValue; unsigned int iNumStr; unsigned int iPosStr; unsigned int iPos;

public:

TLexem(); TLexem(TLexem* _pLexem);

TLexem(char* _szText, int _iType, int _iValue, double _dValue, unsigned int _iNumStr, unsigned int _iPosStr, unsigned int _iPos); ~TLexem();

void setText(char* _szText); const char* getText();

int getLenText();

void setType(int _iType); int getType();

void setIval(int _iValue); int getIval();

void setDval(double _dValue); double getDval();

void setNumStr(unsigned int _iNumStr); unsigned int getNumStr();

void setPosStr(unsigned int _iPosStr); unsigned int getPosStr();

void setPos(unsigned int _iPos); unsigned int getPos();

};

#endif

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

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

19

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

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Листинг 30. Файл реализации класса TLexem (файл TLexem.cpp)

#pragma hdrstop #include "TLexem.h" #include <string.h>

#pragma package(smart_init) //---------------------------------------------------------------------------

TLexem::TLexem()

{

szText

= 0;

iType

= 0;

iValue

= 0;

dValue = 0.0; iNumStr = 0; iPosStr = 0; iPos = 0;

}

TLexem::TLexem(TLexem* _pLexem)

{

szText = 0;

int iLen = strlen(_pLexem->getText()); szText = new char[iLen+1]; strcpy(szText,_pLexem->getText()); iType = _pLexem->getType(); iValue = _pLexem->getIval();

dValue = _pLexem->getDval(); iNumStr = _pLexem->getNumStr(); iPosStr = _pLexem->getPosStr(); iPos = _pLexem->getPos();

}

TLexem::TLexem(char* _szText, int _iType, int _iValue, double _dValue, unsigned int _iNumStr, unsigned int _iPosStr, unsigned int _iPos)

{

szText = 0;

int iLen = strlen(_szText); szText = new char[iLen+1]; strcpy(szText,_szText); iType = _iType;

iValue = _iValue; dValue = _dValue; iNumStr = _iNumStr; iPosStr = _iPosStr; iPos = _iPos;

}

TLexem::~TLexem()

{

if (szText != 0) delete[] szText;

szText = 0;

}

void TLexem::setText(char* _szText)

{

if (szText != 0) delete[] szText;

szText = 0;

int iLen = strlen(_szText); szText = new char[iLen+1]; strcpy(szText,_szText);

}

const char* TLexem::getText()

{

_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

20

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

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