Написание программы, реализующей параллельную работу нескольких процессов

Описание основных алгоритмов, используемых в программе, реализующей параллельную работу нескольких процессов. Работа программы с параметрами: kurs.exe и text.txt. Описание основных подпрограмм, переменных, констант и типов. Обзор исходного кода программы.

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 11.12.2012
Размер файла 108,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Задание

Необходимо написать программу, реализующую параллельную работу нескольких процессов. Каждый процесс может состоять из одного или нескольких потоков. Любой из потоков, работающих в составе этих процессов, может быть приостановлен и вновь запущен некоторой определенной клавишей (можно использовать буквенные или цифровые клавиши). Нажатия клавиш обрабатывать с помощью прерывания от клавиатуры (по материалам лаб. работы №1).

Окончание работы программы должно происходить при приостановке всех потоков их ключевыми клавишами либо при нажатии клавиши ESC. При окончании работы необходимо выполнить корректное завершение, т.е. “дочитать” всю информацию из буфера каждого процесса (при его наличии), закрыть все открытые файлы и т.п. - по материалам лаб. работы №4.

Те потоки, которые выводят информацию на экран, должны использовать для этого каждый свое отдельное окно, обрамленное рамкой - экран визуально делится на несколько окон, в каждом из которых отображается один процесс.

Дополнительное информационное окно должно содержать описание управляющих клавиш и краткое сообщение о тех действиях, которые выполняются в программе: номер потока, его статус в текущий момент времени (активен, приостановлен, ожидает), другую информацию (указание величины выделенного потоку кванта времени, процент заполненности буфера и т.п.) в зависимости от конкретного потока.

Программа должна работать устойчиво, без “зависаний” и непредвиденных зрительных эффектов. В случае необходимости указания параметров при запуске программы необходимо предусмотреть и обработать все возможные ошибки (с выводом диагностики на экран).

Задачи 1, 3, 6 предполагают наличие управляющего блока, который, используя прерывания таймера, случайным образом определяет очередной активный поток и выделяет ему кванты времени (возможно, в рамках большего кванта, выделенного всему процессу). Кванты времени - как для процесса в целом, так и для его потоков - изначально задавать некоторой фиксированной величины, но предусмотреть возможность её изменения во время работы путем нажатия некоторых ключевых клавиш (для каждого из потоков предусмотреть свою клавишу) - т.е. можно, например, увеличить или уменьшить квант только потока-пpоизводителя. При этом допустимы разные варианты реализации - “общий” квант может либо меняться, либо оставаться постоянным (тогда при ускорении одного потока другой автоматически замедлится, т.к. величина его кванта уменьшится).

Потоки этого класса задач могут иметь три статуса: “активен”, “ожидает” или “приостановлен”. В процессе работы может возникнуть, например, следующая ситуация. Поток-потребитель приостановлен своей ключевой клавишей, следовательно, буфер не освобождается. Поток-производитель активен, он заполнит буфер информацией и перейдёт в состояние ожидания. Из этого состояния он сможет выйти только после того, как будет возобновлена (нажатием клавиши) работа потока-потребителя, который освободит место в буфере для помещения новой информации. В случае приостановки производителя возникнет аналогичная ситуация, только с пустым буфером. Приостановка/возобновление потока возможны в любом его состоянии - как в активном, так и в состоянии ожидания.

Задачи 2, 4, 5, 7 должны выполняться равномерно, независимо от степени загрузки системы. Для этого каждой из них необходимо получать управление через фиксированное количество “тиков” системного таймера, во время которого они выполнят какое-то свое элементарное действие (“бегущая строка” или “летающий объект” сместится на одну позицию, сменится нота в музыке…). При такой реализации скорость каждого потока будет определяться количеством “тиков” таймера между его запусками. Для уменьшения скорости такого потока достаточно после нажатия ключевой клавиши предоставлять ему управление реже, через большее число “тиков”, соответственно для ускорения такого потока - опять же после нажатия ключевой клавиши - ему предоставляется управление чаще, в пределе - на каждом “тике”. Так, “бегущая строка” должна двигаться равномерно с постоянной скоростью (если она не приостановлена ключевой клавишей) независимо от количества активных процессов в системе, музыка - тоже играть равномерно… Потоки этого класса задач могут иметь два статуса: “активен” и “приостановлен”.

Задания:

1. Два потока: первый читает информацию из файла (например, стихи или текст программы) в буфер, второй эту информацию из буфера выдаёт на экран. При заполнении окна вывода до конца его содержимое не должно обновляться полностью - вывод новой информации должен осуществляться в последнюю строку, а все остальные строки смещаться вверх (по материалам лаб. работы №4). Имя читаемого файла задавать как параметр командной строки. После окончания файла он начинает считываться заново.

2. Музыкальное сопровождение - как минимум несколько нот различной длительности, образующие мелодию. Во включённом состоянии мелодия должна играть в фоновом режиме (по материалам лаб. работы №2).

5. Вывод заголовка работы (фамилия и имя автора и название работы) в виде “бегущей строки” (по материалам лаб. работы №5). Место вывода (верхняя или нижняя строка экрана) задавать параметром командной строки.

6. Два потока: один генерирует случайные числа и выбирает в буфер те, которые являются полным квадратом, второй выводит их из буфера на экран (по материалам лаб. раб. №4).

Параметры командной строки

Программа принимает два параметра - положение заголовка (a - вверху, b - внизу) и имя файла с текстом.

Описание основных алгоритмов, используемых в программе.

Потоки программы:

· поток-производитель для чтения символов из файла, составления из них строк и записи этих строк в буфер. Запись в буфер поток продолжает, пока не истечет время, отведенное на его работу или пока буфер не будет заполнен.

· поток-потребитель для чтения строк из буфера и вывода на экран. Чтение из буфера поток продолжает, пока не истечет время, отведенное на его работу или пока буфер не станет пустым.

· поток-производитель для поиска чисел, которые являются полным квадратом, использует следующий алгоритм. Генерирует трехзначное случайное число до тех пор, пока дробная часть от корня из него не будет меньше 1е-6. Найденное число поток заносит в буфер. Запись в буфер поток продолжает, пока не истечет время, отведенное на его работу или пока буфер не будет заполнен.

· поток-потребитель для чтения чисел из буфера и вывода на экран. Чтение из буфера поток продолжает, пока не истечет время, отведенное на его работу или пока буфер не станет пустым.

Работа потоков-производителей и потоков-потребителей организована по принципу очереди. Числа на экране рядом с названиями потоков - это количество “тиков” таймера, отведенных каждому из этих потоков, и которое можно уменьшить или увеличить, используя ключевые клавиши. За одну секунду происходит 18,2 тиков таймера.

В программе кроме того имеются:

1) Бегущая строка (заголовок). Располагается в верхней или нижней строке экрана (задаётся параметром командной строки).

2) Музыкальная мелодия. Построена из частот, выбираемых случайным образом. алгоритм программа переменная константа

Движение бегущей строки и смена нот мелодии выполняются равномерно, независимо от степени загрузки системы. Скорости движения бегущей строки и смены частот мелодии можно уменьшить или увеличить, используя ключевые клавиши. Эти скорости определяются количеством “тиков” таймера между запусками движения бегущей строки и смены частот мелодии. Числа на экране - это количество “тиков” таймера, которое можно уменьшить или увеличить, используя ключевые клавиши.

Работу любого из потоков можно приостановить и снова запустить, используя ключевые клавиши.

Описание основных переменных, констант и типов.

В программе для фиксирования состояний (статусов) процессов и потоков определён следующий тип:

type Status = (Assigned, Wait, Suspended);

Константы.

Title - текст заголовка;

Buf1Len - размер буфера первого процесса;

Buf2Len - размер буфера второго процесса;

Delay1 - задержка для производителя и потребителя первого процесса;

Delay2 - задержка для производителя и потребителя второго процесса;

StrLen - длина строки окна вывода;

Kill - флаг завершения программы;

Переменные.

OldTHandler, OldKHandler - старые обработчики прерываний;

Scr - массив для прямого доступа к видеопамяти;

T - счётчик времени таймера;

Thread - состояния потоков;

FIFO1 - буфер первого процесса;

Buf2 - буфер второго процесса;

Top1, Top2 - вершины буферов;

Time - времена для потоков;

CurThread - номер текущего активного потока;

X1, Y1, X2, Y2 - координаты экрана для вывода сгенерированных чисел;

tMus - счетчик импульсов для музыки.

musSpeed - скорость смены частот мелодии.

Speed - скорость движения заголовка.

x, y - координаты расположения заголовка на экране.

impulsesCounter - счетчик импульсов для вывода заголовка.

Описание подпрограмм.

Print - процедура вывода строки на экран;

Frame - процедура рисования окна с рамкой.

FullScreen - процедура восстанавления полного размера окна экрана.

WriteTitle - процедура вывода заголовка на экран;

THandler - обработчик прерываний таймера;

PrintStatus - вывод на экран состояния заданного потока;

ChangeStatus - изменение состояния заданного потока;

Prod1, Cons1, Prod2, Cons2 - процедуры потоков потребителей и производителей;

KHandler - обработчик прерываний клавиатуры;

SetCurSize - процедура изменения размера курсора;

Initialize - инициализирует основные переменные;

KillProc - процедура завершения работы программы.

Работа программы (снимок экрана) с параметрами - kurs.exe и text.txt

Исходный код программы

program kurs;

{$M $1024, 0, 0}

uses

Crt, Dos;

type

Status = (Active, Waits, Suspended); { Состояния потока }

const

{ Текст заголовка }

Title: String = 'Львов Юрий. Операционные системы';

Buf1Len = 13; { Размер буфера первого процесса }

Buf2Len = 13; { Размер буфера второго процесса }

Delay1 = 10000; { Задержка для первого процесса }

Delay2 = 10000; { Задержка для второго процесса }

StrLen = 39; { Длина строки окна вывода }

Kill: Boolean = False; { Флаг завершения программы }

bgColor = 3;

symAttr = 16 * bgColor + 15;

var

OldTHandler, OldKHandler: Procedure; { Старые обработчики прерываний }

F: Text; { Файл с текстом }

Scr: Array[1..25, 1..80] of Record { Массив для прямого доступа к видеопамяти }

Symbol: Char;

Attr: Byte;

end Absolute $B800:$0000;

T: Word; { Счётчики времени таймера }

Thread: Array[1..6] of Status; { Состояния потоков }

LP: Byte; { Номер строки вывода потока-потребителя 1 }

FIFO1: Array[1..Buf1Len] of String; { Буфер первого процесса }

Buf2: Array[1..Buf2Len] of Longint; { Буфер второго процесса }

Top1, Top2: Word; { Вершины буферов }

Time: Array[1..4] of Byte; { времена для потоков }

CurThread: Byte; { Номер текущего активного потока }

X1, Y1, X2, Y2: Byte; { Координаты экрана для вывода сгенерированных чисел }

tMus: Word; { счетчик импульсов для музуки }

musSpeed: Integer; { скорость измен. музыки }

speed: Integer; { скорость движения заголовка }

x: Integer; { координаты расположения заголовка на экране }

y: Integer;

impulsesCounter: Word; { счетчик импульсов для вывода заголовка }

nextMove: Real; { следующее количество импульсов, при котором будем }

{ двигать заголовок }

{ Вывод строки S на экран начиная с i-го столбца, j-й строки цветом Color }

procedure Print(const S: String; const i, j: Byte; const Color: Byte);

var

k: Integer;

begin

if i + Length(S) - 1 > 80 then Exit;

for k := i to i + Length(S) - 1 do begin

Scr[j, k].Attr := Color;

Scr[j, k].Symbol := S[k - i + 1];

end;

end;

{ Рисует окно с рамкой цветом c1 и внутри цветом c2 с заголовком title.

(x1, y1) - координаты левого верхнего угла окна

(x2, y2) - координаты правого нижнего угла окна }

procedure Frame(x1, y1, x2, y2, c1, c2: Integer; title: String);

const

a = #179;

b = #191;

c = #217;

d = #192;

e = #218;

f = #196;

var

i: Integer;

begin

TextAttr := c1;

GotoXY(x1, y1);

Write(e);

for i := x1 + 1 to x2 - 1 do

Write(f);

Write(b);

for i := y1 + 1 to y2 - 1 do begin

GotoXY(x1, i);

Write(a);

GotoXY(x2, i);

Write(a);

end;

GotoXY(x1, y2);

Write(d);

for i := x1 + 1 to x2 - 1 do

Write(f);

Write(c);

GotoXY(x1 + (x2 - x1 - Length(title)) div 2, y1);

Write(title);

Window(x1 + 1, y1 + 1, x2 - 1, y2 - 1);

TextAttr := c2;

ClrScr;

end;

{ Восстанавливает полный размер окна экрана }

procedure FullScreen;

begin

Window(1, 1, 80, 25);

end;

procedure WriteTitle; { выводит заголовок на экран }

var

newX: Integer;

i: Integer;

s: String;

begin

for i := 1 to 80 do { Очистка строки, в которой движется заголовок }

Scr[y][i].Attr := 16 * bgColor + 3;

newX := x;

s := Title;

for i := 1 to Length(s) do { выводим заголовок по символам }

begin

Scr[y][newX].Symbol := s[i];

Scr[y][newX].Attr := 16 * bgColor + 1;

Inc(newX);

if newX > 80 then { если заголовок выходит за пределы экрана }

newX := 1;

end;

end;

{ Обработчик прерываний системного таймера }

{$F+}

procedure THandler; Interrupt;

begin

if Thread[1] = Active then begin

Inc(impulsesCounter);

if impulsesCounter mod speed = 0 then begin

Dec(x); { уменьшаем координату }

if x < 1 then { если заголовок выходит за пределы экрана }

x := 80;

WriteTitle;

impulsesCounter := 0;

end;

end;

if Thread[2] = Active then begin { Музыка }

Inc(tMus);

if tMus mod musSpeed = 0 then begin

tMus := 0;

Nosound;

Sound(Random(1500));

end;

end;

Inc(T);

Inline($9C);

OldTHandler;

end;

{$F-}

{ Вывод на экран состояния i-го потока }

procedure PrintStatus(const i: Byte);

var

_Y: Byte;

begin

case Thread[i] of

Active: Print('Активен ', 66, 2 + i, 16 * bgColor + LightGreen);

Waits: Print('Ожидание ', 66, 2 + i, 16 * bgColor + Yellow);

Suspended: Print('Остановлен ', 66, 2 + i, 16 * bgColor + LightRed);

end;

end;

{ Изменение состояния i-го потока }

procedure ChangeStatus(const i: Byte);

begin

case i of

1:

begin

if Thread[1] = Active then

Thread[1] := Suspended

else

Thread[1] := Active;

PrintStatus(1);

end;

2:

begin

if Thread[2] = Active then begin

Thread[2] := Suspended;

Nosound;

end

else

Thread[2] := Active;

PrintStatus(2);

end;

3:

begin

if Thread[3] <> Suspended then

Thread[3] := Suspended

else

if CurThread = 0 then Thread[3] := Active else Thread[3] := Waits;

PrintStatus(3);

end;

4:

begin

if Thread[4] <> Suspended then

Thread[4] := Suspended

else

if CurThread = 1 then Thread[4] := Active else Thread[4] := Waits;

PrintStatus(4);

end;

5:

begin

if Thread[5] <> Suspended then

Thread[5] := Suspended

else

if CurThread = 2 then Thread[5] := Active else Thread[5] := Waits;

PrintStatus(5);

end;

6:

begin

if Thread[6] <> Suspended then

Thread[6] := Suspended

else

if CurThread = 3 then Thread[6] := Active else Thread[6] := Waits;

PrintStatus(6);

end;

end;

end;

{ Поток-производитель первого процесса }

procedure Prod1;

var

i: Integer;

c: Char;

S: String;

Z: String[5];

Num: Word;

begin

if Thread[3] = Suspended then Exit;

if (Thread[3] = Waits) and (Top1 <> Buf1Len) then Thread[3] := Active;

PrintStatus(3);

T := 0;

while (T < Time[1]) and (Thread[3] <> Suspended) do begin

if Top1 = Buf1Len then begin

Thread[3] := Waits;

PrintStatus(3);

Break;

end;

i := 0;

S := '';

while not EOF(F) and (i < StrLen) do begin

Read(F, c);

if c = #13 then Break;

if c = #10 then Continue;

S := S + c;

Inc(i);

end;

while Length(S) <> StrLen do

S := S + ' ';

if EOF(F) then Reset(F);

Inc(Top1);

FIFO1[Top1] := S;

Str(Top1 / Buf1Len * 100:2:2, Z);

Print(Z + ' % ', 54, 21, symAttr);

Delay(Delay1);

end;

if Thread[3] = Active then begin

if Time[1] = 0 then

Delay(Delay1);

Print('Время вышло', 66, 5, 16 * bgColor + LightGray);

end;

end;

{ Поток-потребитель первого процесса }

procedure Cons1;

var

i, j: Integer;

S: String;

begin

if Thread[4] = Suspended then Exit;

if (Thread[4] = Waits) and (Top1 <> 0) then Thread[4] := Active;

PrintStatus(4);

T := 0;

while (T < Time[2]) and (Thread[4] <> Suspended) do begin

if Top1 = 0 then begin

Thread[4] := Waits;

PrintStatus(4);

Break;

end;

if LP = 9 then

for i := 3 to 10 do

for j := 3 to 41 do

Scr[i, j].Symbol := Scr[i + 1, j].Symbol

else

Inc(LP);

Print(FIFO1[1], 3, 2 + LP, symAttr);

Dec(Top1);

for i := 1 to Top1 do

FIFO1[i] := FIFO1[i + 1];

Str(Top1 / Buf1Len * 100:2:2, S);

Print(S + ' % ', 54, 21, symAttr);

Delay(Delay1);

end;

if Thread[4] = Active then begin

if Time[2] = 0 then

Delay(Delay1);

Print('Время вышло', 66, 6, 16 * bgColor + LightGray);

end;

end;

{ Поток-производитель второго процесса }

procedure Prod2;

var

i: Integer;

c: Char;

Z: String[8];

Num: Longint;

begin

if Thread[5] = Suspended then Exit;

if (Thread[5] = Waits) and (Top2 <> Buf2Len) then Thread[5] := Active;

PrintStatus(5);

T := 0;

while (T < Time[3]) and (Thread[5] <> Suspended) do begin

if Top2 = Buf2Len then begin

Thread[5] := Waits;

PrintStatus(5);

Break;

end;

repeat

Num := 100 + Random(900);

until Frac(Sqrt(Num)) < 1e-6;

Inc(Top2);

Buf2[Top2] := Num;

Str(Top2 / Buf2Len * 100:2:2, Z);

Print(Z + ' % ', 54, 22, symAttr);

Delay(Delay2);

end;

if Thread[5] = Active then begin

if Time[3] = 0 then

Delay(Delay2);

Print('Время вышло' , 66, 7, 16 * bgColor + LightGray);

end;

end;

{ Поток-потребитель второго процесса }

procedure Cons2;

var

i, j: Integer;

Z: String[8];

S: String;

begin

if Thread[6] = Suspended then Exit;

if (Thread[6] = Waits) and (Top2 <> 0) then Thread[6] := Active;

PrintStatus(6);

T := 0;

while (T < Time[4]) and (Thread[6] <> Suspended) do begin

if Top2 = 0 then begin

Thread[6] := Waits;

PrintStatus(6);

Break;

end;

Str(Buf2[1], S);

S := S + ' ';

if X2 + Length(S) > StrLen - 2 then begin

X2 := 0;

if Y2 = 8 then begin

for i := 15 to 22 do

for j := 3 to 41 do

Scr[i, j].Symbol := Scr[i + 1, j].Symbol;

for j := 3 to 41 do

Scr[23, j].Symbol := ' ';

end

else

Inc(Y2);

end;

Print(S, 3 + X2, 15 + Y2, symAttr);

Inc(X2, Length(S));

Dec(Top2);

for i := 1 to Top2 do

Buf2[i] := Buf2[i + 1];

Str(Top2 / Buf2Len * 100:2:2, Z);

Print(Z + ' % ', 54, 22, symAttr);

Delay(Delay2);

end;

if Thread[6] = Active then begin

if Time[4] = 0 then

Delay(Delay2);

Print('Время вышло', 66, 8, 16 * bgColor + LightGray);

end;

end;

{ Обработчик прерываний клавиатуры }

{$F+}

procedure KHandler; Interrupt;

var

s: String;

begin

case Port[$60] of

1: Kill := True; { нажата Esc }

2: if Time[1] > 0 then Dec(Time[1]); { нажата 1 }

3: if Time[1] < 70 then Inc(Time[1]); { 2 }

4: if Time[2] > 0 then Dec(Time[2]); { 3 }

5: if Time[2] < 70 then Inc(Time[2]); { 4 }

6: if Time[3] > 0 then Dec(Time[3]); { 5 }

7: if Time[3] < 70 then Inc(Time[3]); { 6 }

8: if Time[4] > 0 then Dec(Time[4]); { 7 }

9: if Time[4] < 70 then Inc(Time[4]); { 8 }

10: if speed > 1 then { 9 }

Dec(speed);

11: if speed < 25 then { 0 }

Inc(speed);

18: if musSpeed > 1 then { E }

Dec(musSpeed);

19: if musSpeed < 25 then { R }

Inc(musSpeed);

23: ChangeStatus(1); { нажата I }

24: ChangeStatus(2); { O }

25: ChangeStatus(3); { P }

36: ChangeStatus(4); { J }

37: ChangeStatus(5); { K }

38: ChangeStatus(6); { L }

end;

Str(Time[1], s);

Print(s + ' ', 66, 12, symAttr);

Str(Time[2], s);

Print(s + ' ', 66, 13, symAttr);

Str(Time[3], s);

Print(s + ' ', 66, 14, symAttr);

Str(Time[4], s);

Print(s + ' ', 66, 15, symAttr);

Str(speed, s);

Print(s + ' ', 66, 16, symAttr);

Str(musSpeed, s);

Print(s + ' ', 66, 17, symAttr);

Inline($9C);

OldKHandler;

end;

{$F-}

{ Изменение размера курсора }

procedure SetCurSize(const BegLine, EndLine: Byte);

var

Regs: Registers;

begin

with Regs do begin

AH := $01;

CH := BegLine;

CL := EndLine;

end;

Intr($10, Regs);

end;

{ Инициализация основных переменных }

procedure Initialize;

var

i, j: Integer;

s: String;

begin

musSpeed := 5;

tMus := 0;

speed := 6;

impulsesCounter := 0;

Top1 := 0;

Top2 := 0;

SetCurSize($20, $00);

for i := 1 to 6 do

Thread[i] := Active;

for i := 1 to 4 do

Time[i] := 30;

PrintStatus(1);

PrintStatus(2);

Print('Не запущен', 66, 5, 16 * bgColor + LightGray);

Print('Не запущен', 66, 6, 16 * bgColor + LightGray);

Print('Не запущен', 66, 7, 16 * bgColor + LightGray);

Print('Не запущен', 66, 8, 16 * bgColor + LightGray);

Print('0.00 %', 54, 21, symAttr);

Print('0.00 %', 54, 22, symAttr);

Str(Time[1], s);

Print(s, 66, 12, symAttr);

Str(Time[2], s);

Print(s, 66, 13, symAttr);

Str(Time[3], s);

Print(s, 66, 14, symAttr);

Str(Time[4], s);

Print(s, 66, 15, symAttr);

Str(speed, s);

Print(s, 66, 16, symAttr);

Str(musSpeed, s);

Print(s, 66, 17, symAttr);

X1 := 0;

Y1 := 0;

X2 := 0;

Y2 := 0;

LP := 0;

GetIntVec($9, @OldKHandler);

SetIntVec($9, Addr(KHandler));

GetIntVec($8, @OldTHandler);

SetIntVec($8, Addr(THandler));

end;

{ Действия при завершении работы программы }

procedure KillProc;

begin

Thread[3] := Suspended;

Time[2] := 20;

Thread[4] := Active;

Thread[5] := Suspended;

Time[4] := 20;

Thread[6] := Active;

T := High(T);

CurThread := 1;

while (Top1 <> 0) or (Top2 <> 0) do begin

T := 0;

case Random(2) of

0: Cons1;

1: Cons2;

end;

end;

SetIntVec($9, Addr(OldKHandler));

SetIntVec($8, Addr(OldTHandler));

Window(1, 1, 80, 25);

GotoXY(1, 25);

SetCurSize($06, $07);

Halt(0);

end;

var

s: String;

v: String;

code: Integer;

begin

if ParamCount <> 2 then { проверяем количество параметров команд. строки }

begin

Writeln('Ошибка! Правильный формат командной строки: kurs.exe ' +

'Положение заголовка(a - вверху, b - внизу) ' +

'Имя файла с текстом');

ReadKey;

Halt(1); { завершаем программу }

end;

v := ParamStr(1); { берем первый параметр командной строки }

s := Upcase(v[1]);

if (Length(v) <> 1) or ((s <> 'A') and (s <> 'B')) then

begin

Writeln('Неправильное положение заголовка!');

ReadKey;

Halt(1);

end;

x := 30;

if s = 'A' then

y := 1

else

y := 25;

Assign(F, ParamStr(2));

{$I-}

Reset(F);

{$I+};

if IOResult <> 0 then begin

WriteLn('Ошибка при открытии файла ', ParamStr(2));

ReadLn;

Halt;

end;

TextBackground(3);

ClrScr;

Frame(2, 2, 42, 12, 117, symAttr, 'Процесс 1');

FullScreen;

Frame(2, 14, 42, 24, 117, symAttr, 'Процесс 2');

FullScreen;

Frame(44, 2, 79, 9, 117, symAttr, 'Состояния потоков');

WriteLn('I Заголовок :');

WriteLn('O Музыка :');

WriteLn('P Производитель 1 :');

WriteLn('J Потребитель 1 :');

WriteLn('K Производитель 2 :');

Write('L Потребитель 2 :');

FullScreen;

Frame(44, 11, 79, 18, 117, symAttr, 'Время (уменьшить/увеличить)');

WriteLn('1/2 Производитель 1:');

WriteLn('3/4 Потребитель 1:');

WriteLn('5/6 Производитель 2:');

WriteLn('7/8 Потребитель 2:');

Writeln('9/0 Скор. заголовка:');

Write('E/R Скор. изм. муз.:');

FullScreen;

Frame(44, 20, 79, 23, 117, symAttr, 'Заполненность буферов');

WriteLn('Буфер 1:');

Write('Буфер 2:');

FullScreen;

Print(' Esc - выход ', 44, 24, 62);

Initialize;

Randomize;

while True do begin

if Kill then KillProc;

CurThread := Random(4);

case CurThread of

0: Prod1;

1: Cons1;

2: Prod2;

3: Cons2;

end;

end;

end.

Размещено на Allbest.ru

...

Подобные документы

  • Написание программы, реализующей работу мультипроцессорной системы с общей памятью, которая обрабатывает очереди заявок переменной длины. Анализ типовой архитектуры мультипроцессорной системы. Описание процедур и переменных, используемых в программе.

    курсовая работа [158,4 K], добавлен 21.06.2013

  • Осуществление работы разрабатываемой программы на основе алгоритма, использующего Z-буфер. Аналитическое описание программной реализации. Алгоритмы основных функций программы. Содержание руководства пользователя. Файлы программы, пункты главного меню.

    курсовая работа [1,7 M], добавлен 15.04.2015

  • Постановка задачи и алгоритм решения. Листинг программы, иллюстрирующей работу с символами, строками и блоками. Описание возможностей языка С, используемых для реализации алгоритма. Тестирование итоговой программы, анализ полученных результатов расчета.

    курсовая работа [63,0 K], добавлен 27.12.2012

  • Описание программы, реализующей различные операции над строковыми типами данных, а также методы их обработки для получения заданных в задании результатов. Требования к программному продукту. Процедура проверки сохранения данных программы перед закрытием.

    курсовая работа [1,1 M], добавлен 26.02.2015

  • Описание принципа развивающей игры в слова "Виселица". Разработка программы, реализующей задачу данной игры на языке Delphi. Обоснование выбора среды программирования, листинг файла, результаты отладки и тестирования, руководство для пользователя.

    курсовая работа [572,7 K], добавлен 14.07.2012

  • Разработка программы-приложения для создания композиции кривых второго порядка в полярных координатах. Описание используемых констант, переменных, компонентов, процедур и функций. Источники входной и выходной информации. Требования к программе и системе.

    реферат [125,2 K], добавлен 28.05.2014

  • Написание программы, реализующей алгоритм RLE, позволяющий кодировать, декодировать файлы любого формата и размера, предоставлять пользователю информацию о степени их сжатия. Анализ эффективности кода. Экспериментальная оценка алгоритма программы.

    контрольная работа [151,7 K], добавлен 29.05.2013

  • Разработка программы, реализующей построение объемной гистограммы с использованием свойств языка программирования Java. Возможность графически отобразить статистические данные урожайности как основное требование к программе. Реализация кода программы.

    курсовая работа [333,5 K], добавлен 21.01.2013

  • Написание программы, состоящей из двух модулей и реализующей простейший калькулятор. Разработка алгоритма решения задачи, реализация его в среде программирования Delphi. Список использованных переменных. Блок-схема программы, руководство пользователя.

    курсовая работа [106,6 K], добавлен 16.06.2014

  • Составление программы lab3.exe, реализующей удаление элемента из списка перед указанным методом и его сортировку по возрастанию. Описание предикатов, используемых в программе. Проверка на корректный вывод информации. Программа для обхода бинарного дерева.

    контрольная работа [559,3 K], добавлен 20.05.2012

  • Создание программы, реализующей игру "Линии". Среда разработки программы, описание ее общего вида. Основные алгоритмы программы. Реализация программы в среде разработки Microsoft Visual Studio 2008 на языке объектно-ориентированного программирования С++.

    курсовая работа [639,0 K], добавлен 16.03.2012

  • Анализ, математическая постановка задачи. Описание алгоритма работы основной программы. Детализация отдельных участков программы. Графический интерфейс программы "15". Описания используемых типов, глобальных переменных, процедур, функций. Процесс отладки.

    курсовая работа [48,8 K], добавлен 14.02.2009

  • Существующие альтернативы программы. Описание формул для выкроек, используемых в разработке. Описание разрабатываемой программы, а также структура ее интерфейса. Детальное описание возможностей и спецификация, функциональные особенности программы.

    курсовая работа [427,4 K], добавлен 10.10.2015

  • Характеристика аппаратов для очистки газов. Описание основных процессов, протекающих в пылеосадительной камере. Разработка программы в среде программирования Visual C# Express 2010, реализующей вычисление параметров процесса по приведенной модели.

    курсовая работа [1,8 M], добавлен 20.11.2012

  • Характеристика программы на языке VBA, которая вводит исходные данные, выполняет расчеты и выводит результаты на экран. Описание переменных в программе, ее блок-схема и алгоритм работы. Листинг программы. Описание входных данных и результат вычислений.

    курсовая работа [721,4 K], добавлен 10.11.2010

  • Определение назначения и описание функций дискового кэша как промежуточного буфера с быстрым доступом к информации. Процесс кэширования внешних накопителей. Построение алгоритма, описание интерфейса и разработка программы для работы с двусвязным списком.

    курсовая работа [2,1 M], добавлен 21.01.2014

  • Процесс и порядок написания программы, реализующей графическое решение логической задачи (игры). Обзор аналогичных продуктов. Описание и алгоритм решения задачи. Структура программы, ее процедуры и функции. Настройка и руководство для пользователя.

    курсовая работа [35,7 K], добавлен 29.06.2010

  • Создание игровой программы, реализующей игру в бильярд на компьютере. Математическое описание законов физики, определяющих траекторию движения шаров по бильярдному столу. Существующие аналоги разрабатываемого продукта. Алгоритмы игровой программы.

    контрольная работа [31,3 K], добавлен 25.07.2012

  • Проектирование и описание логической структуры программы для работы электронного магазина в среде Microsoft Visual C++. Инструкция, описывающая сведения для запуска программы. Обновление данных о доступных товарах. Поиск по каталогу доступных товаров.

    курсовая работа [27,6 M], добавлен 27.04.2012

  • Создание средств представления процессов и механизмов управления на уровне диспетчеризации, разработка алгоритма и написание программы, имитирующую работу простейшей операционной системы. Формирование дескриптора, ввод информации, интерфейс программы.

    лабораторная работа [1,1 M], добавлен 09.07.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.