Написание программы, реализующей параллельную работу нескольких процессов
Описание основных алгоритмов, используемых в программе, реализующей параллельную работу нескольких процессов. Работа программы с параметрами: 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