Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2011, 14:07   #1
ШеФФ
Пользователь
 
Регистрация: 16.03.2011
Сообщений: 13
По умолчанию C++ Карусель(Round Robin)

Всем доброго времени суток!
Имеется задание: реализовать дисциплину планирования потоков "Карусель" через WinAPI. Использовать таймеры и события.
Не могу четко себе представить схему работы программы=( Прошу помощи у более опытного народа. И если можно, то наброски кода по этому делу. Буду очень благодарен.
Не забываем плюсовать репутацию, если я Вам помог.

Последний раз редактировалось ШеФФ; 13.11.2011 в 14:10.
ШеФФ вне форума Ответить с цитированием
Старый 13.11.2011, 14:31   #2
Tony Parker
Пользователь
 
Регистрация: 19.12.2010
Сообщений: 52
По умолчанию

Есть реализации на чистом С, надо только добавить таймер с событиями:

http://www.daniweb.com/software-deve...c/threads/8091

http://www.indiastudychannel.com/pro...gorithm-C.aspx
AllSuccess1.ru - каталог полезных курсов.
Tony Parker вне форума Ответить с цитированием
Старый 13.11.2011, 16:03   #3
ШеФФ
Пользователь
 
Регистрация: 16.03.2011
Сообщений: 13
По умолчанию

Вопрос в том, как именно добавить. А еще там потоки не реальные, а представлены в виде структур. А здесь нужно создать именно реальные потоки и крутить их в карусели.
Не забываем плюсовать репутацию, если я Вам помог.
ШеФФ вне форума Ответить с цитированием
Старый 14.11.2011, 18:07   #4
ШеФФ
Пользователь
 
Регистрация: 16.03.2011
Сообщений: 13
По умолчанию

Немного поразмыслив и почитав Рихтера, написал вот такой код:

Код:
#include <iostream.h>
#include <windows.h>

using namespace std;

const int n = 10;
const int TimeInt = 2;

int pars[n];

HANDLE hTimer;
LARGE_INTEGER li;

struct RR
{
	HANDLE hThread;
	RR* next;
	DWORD dwThread;
};

RR *HEAD = NULL,*TAIL = NULL;

void DelThread();

DWORD WINAPI thread(LPVOID par)
{
	int *k = (int*)par;

	for(int i = 0;i<5*n;i++)
	{
		cout<<*k;
		Sleep(1);
	}
	return 0;
}

void NewThread(int i)
{
	if (HEAD == NULL)
	{
		HEAD = new RR;
		TAIL = HEAD;
		HEAD->next = HEAD;
	}
	else
	{		
		TAIL->next = new RR;
		TAIL = TAIL->next;
		TAIL->next = HEAD;
	}
	TAIL->hThread = CreateThread(NULL,0,thread,&pars[i],CREATE_SUSPENDED,&(HEAD->dwThread));
	return;
}

void DelThread()
{
	CloseHandle(HEAD->hThread);

	if (HEAD == TAIL)
	{
		delete HEAD;
		TAIL = NULL;
	}
	else
	{
		HEAD = HEAD->next;
		delete TAIL->next;
		TAIL->next = HEAD;
	}
	
}

void main()
{
	HANDLE handles[2];

	for(int i = 0;i<n;i++)
	{
		pars[i] = i;
		NewThread(i);
	}

	hTimer = CreateWaitableTimer(NULL, FALSE, NULL); 

	li.QuadPart = -1;

	SetWaitableTimer(hTimer, &li, TimeInt, NULL, NULL, FALSE);

	handles[1] = hTimer;

	while(HEAD != NULL)
	{
		handles[0] = HEAD->hThread;
		ResumeThread(HEAD->hThread);
		DWORD dw = WaitForMultipleObjects(2,handles,FALSE, INFINITE); 
		switch(dw)
		{
		case WAIT_OBJECT_0: 
			cout<<"DELETED";
			DelThread();						    
			break;
		case WAIT_OBJECT_0+1:
			cout<<".";
			SuspendThread(HEAD->hThread);
			HEAD = HEAD->next;
			TAIL = TAIL->next;
			break;
		default: cout<<"ERROR";
			break;
		}
	}

	CloseHandle(hTimer);

	system("PAUSE");

	return;
}
Эта программа некоторое время работает, а потом "умирает" - останавливается и ничего не выводит=(
Может быть, я что-то неправильно делаю?=( Подскажите бедному неопытному студенту.
Не забываем плюсовать репутацию, если я Вам помог.
ШеФФ вне форума Ответить с цитированием
Старый 14.11.2011, 18:15   #5
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

ШеФФ

Эта программа некоторое время работает, а потом "умирает" - останавливается и ничего не выводит=(

добавь отладочный вывод в программу и проанализируй его.
Rififi вне форума Ответить с цитированием
Старый 14.11.2011, 19:06   #6
ШеФФ
Пользователь
 
Регистрация: 16.03.2011
Сообщений: 13
По умолчанию

Добавил, проанализировал.
Умирает либо на функции SuspendThread(HEAD->hThread);
либо на DWORD dw = WaitForMultipleObjects(2,handles,FA LSE, INFINITE);
Не могу понять, в чем дело=(
Не забываем плюсовать репутацию, если я Вам помог.
ШеФФ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Reverse engineering + round-trip engineering. UML. Eclipse. Jakethefish Общие вопросы по Java, Java SE, Kotlin 0 05.09.2011 20:44
Округление до целого,отличное от Round Rekky Общие вопросы Delphi 3 17.04.2009 11:47
round он же random [Smarik] Свободное общение 10 10.09.2008 22:07