Консультация № 185395
09.02.2012, 16:40
79.00 руб.
0 1 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Прошу помочь.Есть готовая программа(готовый код).Хочу знать, что значит каждая строка кода. Для написания курсовой работы. По возможности прошу построить блок-схему программы.Заранее ОГРОМНОЕ СПАСИБО!!!
Используется программа: Эмуляция планировщика процессов с использованием волокон. Алгоритм "случайный выбор".

Приложение:
using namespace std;

char bufRus[256];

char* Rus(const char* text)
{
CharToOem(text, bufRus);
return bufRus;
}
static LPVOID fiberEnd;
static LPVOID fiberCtl;
static LPVOID fiber[ FIBERS ];
static void shedule( BOOL fDontEnd )
{
int n, current;
if ( !fDontEnd ) { /* волокно надо завершить */
fiberEnd = GetCurrentFiber();
SwitchToFiber(fiberCtl );
}
/* выбираем следующее волокно для выполнения */
for ( n = 0; n < FIBERS; n++ ) {
if ( fiber[n] && fiber[n] != GetCurrentFiber() ) break;
}
if ( n >= FIBERS ) return; /* нет других готовых волокон*/
SwitchToFiber( fiber[rand()%3] );
}
VOID CALLBACK Proc( PVOID lpParameter, int id )
{
int i;
for ( i = 0; i < 100; i++ ) {
cout <<Rus("Волокно ")<<id<<endl;
Sleep( 1000 );
shedule( TRUE ); /* выполнение продолжается */
}
shedule( FALSE ); /* волокно завершается */
}
VOID CALLBACK FiberProc( PVOID lpParameter )
{
Proc(lpParameter,1);
}
VOID CALLBACK FiberProc2( PVOID lpParameter )
{
Proc(lpParameter,2);
}
VOID CALLBACK FiberProc3( PVOID lpParameter )
{
Proc(lpParameter,3);
}
int main()
{
int i;
fiberCtl = ConvertThreadToFiber( NULL );
fiberEnd = NULL;
fiber[0] = CreateFiber( 10000, FiberProc, NULL );
fiber[1] = CreateFiber( 10000, FiberProc2, NULL );
fiber[2] = CreateFiber( 10000, FiberProc3, NULL );
for ( i = 0; i < FIBERS;) {
SwitchToFiber( fiber[rand()%FIBERS] );
if ( fiberEnd ) {
DeleteFiber(fiberEnd );
for ( i = 0; i < FIBERS; i++ ) {
if ( fiber[i] == fiberEnd ) fiber[i] = NULL;
}
fiberEnd = NULL;
}
for ( i = 0; i < FIBERS; i++ ) if ( fiber[i] ) break;
}
ConvertFiberToThread();
return 0;
}

Обсуждение

Неизвестный
10.02.2012, 09:39
общий
это ответ
Здравствуйте, Bien Tendu!
Ниже представлен код с комментариями
[code lang=php h=200]//Используем пространство имён STL
using namespace std;

//Выделяем массив символов длинной 256
char bufRus[256];

//Функция, которая получает константный указатель на символ и
//возвращает указатель на символ
char* Rus(const char* text)
{
//Переводит строку символов text в тип Oem и строку bufRus
CharToOem(text, bufRus);
return bufRus;
}

//Выделяем статический указатель на адресс в памяти
static LPVOID fiberEnd;
//Выделяем статический указатель на адресс в памяти
static LPVOID fiberCtl;
//Выделяем массив статических указателей на адресса в памяти размеров FIBERS
static LPVOID fiber[ FIBERS ];

//Статическая функция, которая получает параметр типа BOOL и ничего не возвращает
static void shedule( BOOL fDontEnd )
{
//Определение двух переменных типа int
int n, current;

//Если значение равно false (0), то
if ( !fDontEnd ) { /* волокно надо завершить */
//Получаем адресс запущеного волокна
fiberEnd = GetCurrentFiber();
//Сохраняем состояние текущего волокна и переключаемся на волокно, указанное адресом fiberCtl
SwitchToFiber(fiberCtl );
}
/* выбираем следующее волокно для выполнения */
for ( n = 0; n < FIBERS; n++ ) {
//Проверка, чтобы адрес волокна не был равен адрессу запущенного волокна
if ( fiber[n] && fiber[n] != GetCurrentFiber() ) break;
}
//Если значение больше FIBERS
if ( n >= FIBERS ) return; /* нет других готовых волокон*/
//Сохраняем состояние текущего волокна и переключаемся на волокно, указанное адресом fiber[rand()%3]
SwitchToFiber( fiber[rand()%3] );
}
//Функция типа VOID CALLBACK с параметрами адресс lpParameter и int id
VOID CALLBACK Proc( PVOID lpParameter, int id )
{
//Обьявляем параметр типа int
int i;

for ( i = 0; i < 100; i++ ) {
//Выводим на экран слово и хначение id
cout <<Rus("Волокно ")<<id<<endl;
//Задержка на секунду
Sleep( 1000 );
//Вызываем функцию
shedule( TRUE ); /* выполнение продолжается */
}
//Вызываем функцию
shedule( FALSE ); /* волокно завершается */
}
//Функция типа VOID CALLBACK с параметром типа PVOID
VOID CALLBACK FiberProc( PVOID lpParameter )
{
//Запускаем функцию
Proc(lpParameter,1);
}
//Функция типа VOID CALLBACK с параметром типа PVOID
VOID CALLBACK FiberProc2( PVOID lpParameter )
{
//Запускаем функцию
Proc(lpParameter,2);
}
//Функция типа VOID CALLBACK с параметром типа PVOID
VOID CALLBACK FiberProc3( PVOID lpParameter )
{
//Запускаем функцию
Proc(lpParameter,3);
}

//Основная функция
int main()
{
//Определяем переменную типа int
int i;

//получаем адресс текущего потока с нулдевого дареса
//Инициализация волокна
fiberCtl = ConvertThreadToFiber( NULL );
//Адресс волокна NULL
fiberEnd = NULL;
//Создаём волокно первое-расзмер стека процесса
//FiberProc - адресс волокнаб
//NULL - аргумент, передаваемый волокну
fiber[0] = CreateFiber( 10000, FiberProc, NULL );
//Создаём волокно первое-расзмер стека процесса
//FiberProc2 - адресс волокнаб
//NULL - аргумент, передаваемый волокну
fiber[1] = CreateFiber( 10000, FiberProc2, NULL );
//Создаём волокно первое-расзмер стека процесса
//FiberProc3 - адресс волокнаб
//NULL - аргумент, передаваемый волокну
fiber[2] = CreateFiber( 10000, FiberProc3, NULL );
//Значение i меняется от 0 до FIBERS
for ( i = 0; i < FIBERS;) {
//Сохраняем состояние текущего волокна и переключаемся на волокно, указанное адресом fiber[rand()%3]
SwitchToFiber( fiber[rand()%FIBERS] );
//Если fiberEnd !=NULL
if ( fiberEnd ) {
//Удаляем волокно fiberEnd
DeleteFiber(fiberEnd );
//Значение i меняется от 0 до FIBERS
for ( i = 0; i < FIBERS; i++ ) {
//Если значение текущего значения массива равно fiberEnd,то
//Текущее значение массива приравниваем NULL
if ( fiber[i] == fiberEnd ) fiber[i] = NULL;
}
//Приравнием значение fiberEnd NULL
fiberEnd = NULL;
}
//Для каждого i от 0 до значения FIBERS
//Проверяем что fiber[i]!= NULL
for ( i = 0; i < FIBERS; i++ ) if ( fiber[i] ) break;
}
//Переводит текущее волокно в поток
ConvertFiberToThread();

//Возвращем 0
return 0;
}
[/code]
5
Форма ответа