Системное программирование / SSW_kw_Appendix
.pdfСоздание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
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 |
М.Ф.Степанов |