Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа по ТВП. Александр.docx
Скачиваний:
15
Добавлен:
22.01.2016
Размер:
1.32 Mб
Скачать

2.3.2 Программный код приложения «Стол»

for(inti= 0;i<count;i++)

{

//создание процессов «Философ»

pInfo[i] = new PROCESS_INFORMATION();

Sleep(500);

bool retValue = CreateProcess(null, CommandLine,

ref pSec, ref tSec, false, 0, IntPtr.Zero, null, ref sInfo, out pInfo[i]);

}

del_Monitoring = new Del_clientFunction(Monitoring); //Запуск процесса мониторинга статусов философов

hThread = StartThread(del_Monitoring);

//Основной код для работы с философами

while (true)

{

for (int i = 0; i < Philosophers; i++)

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

WaitForSingleObject(PhilMutex[i], 30);//захват мьютекса для доступа к состоянию

fixed (uint* adr_state = &state)

{ReleaseSemaphore(SemathorStates[i], 1, adr_state); };

WaitForSingleObject(SemathorStates[i], 1 );

//считывание состояния

switch (state)

{

case 1: // если ест

if (predstate[i] == 1) break; //если до этого ел, то //выходим из цикла

for (int j = 0; j < Philosophers / 2; j++) //ищем свободное //место

{

if (placesFlag[j] == true)

{

placesFlag[j] = false; //занимаем место

myPlace[i] =j; //философ запоминает свое место

predstate[i] = 1; //предыдущее состояние //устанавливаем "ем"

break;

}

}

break;

case 2: //если гуляет

if (predstate[i] == 2) break; //если до этого гулял, выходим из цикла

if (predstate[i] == 1) //если раньше ел

{

placesFlag[myPlace[i]] = true; //освобождаем свое место

predstate[i] = 2; //предыдущее состояние устанавливаем "гуляю"

break;

}

break;

case 3: //если состояние "голодный и гуляю"

if(predstate[i] == 3)break;

{

predstate[i] = 3; // предыдущее состояние устанавлием "голоден и гуляю"

}

break;

}

ReleaseMutex(PhilMutex[i]);

}

}

}

//уничтожение процессов

public void Terminate()

{

for (int i = 0; i < Philosophers; i++)

TerminateProcess(pInfo[i].hProcess, 0);

TerminateProcess(GetCurrentProcess(), 0);

}