Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик
Статус: Академик
Рейтинг: 9472
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Академик
Рейтинг: 3842
∙ повысить рейтинг »
CradleA
Статус: Бакалавр
Рейтинг: 2592
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1723
Дата выхода:12.02.2012, 17:00
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:210 / 129
Вопросов / ответов:1 / 1

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


Консультация # 185395:

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

Дата отправки: 09.02.2012, 16:40
Вопрос задал: Bien Tendu (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Алексей К. (2-й класс):

Здравствуйте, Bien Tendu!
Ниже представлен код с комментариями

Код (PHP):
//Используем пространство имён 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;
}

Консультировал: Алексей К. (2-й класс)
Дата отправки: 10.02.2012, 09:39

5
нет комментария
-----
Дата оценки: 10.02.2012, 16:58

Рейтинг ответа:

НЕ одобряю +1 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное