|
|
|||||||||||||||||||||||||||||||||||||||||||
|
Понедельник
21 мая 2012 года |
|||||||||||||||||||||||||||||||||||||||||||
|
Приостановка выполнения программы Turbo PascalПри обработке информации часто возникает необходимость приостановить выполнение программы: 1) на время, определяемое самим пользователем (последующий запуск программы осуществляется либо нажатием какой-либо клавиши, либо с помощью кнопки манипулятора мышь (пример использования ма-нипулятора мышь для указанных целей дан в разделе 5.9.5 — программа DemoMouseText); 2) на фиксированное время, заданное в самой программе. В следующих разделах приводится несколько стандартных процедур, решающих данные задачи. 1. Приостановка выполнения программы на время, определяемое пользователемПростейшим решением данной задачи является запись в соответствующем месте процедуры Readln (оператор Read использовать нельзя) или функции ReadKey. Пример использования процедуры Readln.
PROGRAM DemoReadln;
USES Crt;
BEGIN
ClrScr;
Writeln ('Выполнение программы приостановлено.');
Writeln;
Write ('Для продолжения нажмите клавишу Enter ....');
Readln;
Writeln;
Write ('Выполнение программы продолжается. Ждите 5 секунд. ');
Delay (5000);
END.
Для продолжения выполнения программы достаточно нажать клавишу Enter. Недостатком данного решения является обязательное нажатие клавиши Enter, а не любой клавиши, что увеличивает вероятность ошибочного действия пользователя и в ряде случаев приводит к непредсказуемым результатам. Пример использования функции ReadKey.
PROGRAM DemoReadKey;
USES Crt;
VAR
ch : char;
BEGIN
ClrScr;
Writeln ('Выполнение программы приостановлено.');
Writeln;
Write ('Для продолжения нажмите любую клавишу ....');
ch := ReadKey;
Writeln;
Write ('Выполнение программы продолжается. Ждите 5 секунд. ');
Delay (5000);
END.
Недостатком использования данной функции является то, что, если до обращения к ней использовалась функция KeyPressed и ее значение стало равным True, возможны непредсказуемые результаты выполнения программы. В связи с этим предпочтительнее использовать приведенные ниже процедуры Wait, GoingOut или GoingOutColor и Wait_l. Здесь и далее в первой строке комментария дано имя процедуры (например, Wait), а во второй - имя файла этой процедуры на диске (например, wait.inc).
{ Wait
Процедура ожидания нажатия любой клавиши
wait.inc }
PROCEDURE Wait;
BEGIN
repeat until KeyPressed
END ;
Пример использования процедуры Wait.
PROGRAM DemoWait;
USES Crt;
{$I wait.inc }
BEGIN
ClrScr;
GotoXY (15, 10);
Write ('Для завершения программы нажмите клавишу "Пробел"'); Wait;
END.
При использовании процедуры Wait подсказка о требуемых дальнейших действиях пользователя записывается в программе перед вызовом процедуры. Процедура GoingOut приостанавливает работу программы и позволяет выводить требуемое, сообщение желаемого цвета и располагать его в нужном месте экрана.
{
Процедура выхода после нажатия любой клавиши.
Внимание! Не забывайте очищать буфер клавиатуры после выполнения этой процедуры,
иначе при нажатии клавиши Enter при окончании работы откомпилированной программы
она снова запустится на выполнение
Text - текст сообщения
ColorText - цвет текста
X, Y - координаты вывода сообщения
}
PROCEDURE GoingOut (Text : string;
ColorText, X, Y : integer);
BEGIN
TextColor (ColorText);
GotoXY (X, Y);
Write (Text);
repeat until KeyPressed; { ожидаем нажатия клавиши }
END;
Пример использования процедуры GoingOut.
PROGRAM Demo_GoingOut;
USES Crt;
{$I goingout.inc }
BEGIN
ClrScr;
GotoXY (15, 10);
GoingOut('Нажмите клавишу "Пробел"',14,15,10);
END.
Недостатком процедур Wait и GoingOut является то, что при нажатии на клавишу Enter откомпилированная программа вновь запустится на выполнение. Чтобы проверить это, откомпилируйте программу DemoWait или DemoGoingOut в режиме Options/Destination Disk и запустите откомпилированную программу, для завершения работы программы вместо клавиши Пробел нажмите клавишу Enter). В связи с этой особенностью при использовании данных процедур желательно указывать, что необходимо нажать клавишу Пробел. Для корректной работы процедур Wait или GoingOut необходимо после каждого вызова этих процедур очищать буфер клавиатуры с помощью процедуры ClrKeyBuf.
{ ClrKeyBuf
Очистка буфера клавиатуры
clrkeybu.inc }
PROCEDURE ClrKeyBuf;
VAR
ch : Char;
BEGIN
while KeyPressed do ch := ReadKey;
END;
Процедура Wait_l останавливает выполнение программ и очищает буфер при входе и при выходе из процедуры (данная процедура объединяет процедуры Wait и ClrKeyBuf.
{ Wait_1
Процедура ожидает нажатия любой клавиши,
буфер клавиатуры очищается при входе
в процедуру и при выходе из процедуры
wait_l .inc }
PROCEDURE Wait_l (Text : string; { текст сообщения >
X, { координаты вывода }
Y : byte); { сообщения }
VAR
ch : Char;
BEGIN
while KeyPressed do ch := ReadKey; { очистка буфера клавиатуры }
GotoXY (X,Y);
Write (Text) ; { вывод сообщения }
repeat until KeyPressed; { ожидание нажатия любой клавиши }
while KeyPressed do ch := ReadKey; { очистка буфера клавиатуры }
END;
Пример использования процедуры Wait_1.
PROGRAM Demo_Wait_l ;
USES Crt;
{$I wait_l.inc }
BEGIN
ClrScr;
GotoXY (15, 10) ;
Wait_l ('Нажмите любую клавишу' , 15, 10) ;
END.
Процедуре GoingOutColor аналогична процедуре Wait_l, но позволяет изменять цвет символов и цвет фона, на котором выводится сообщение.
{ GoingOutColor
Процедура выхода после нажатия любой клавиши.
Выводится подсказка о дальнейших действиях пользователя.
Устанавливаются цвета фона и символов.
Text - текст сообщения
ColorText - цвет символов
ColorBackGround - цвет фона
X, Y - координаты вывода сообщения
goingouc.inc }
PROCEDURE GoingOutColor (Text : string;
ColorText,
ColorBackGround : byte;
X,
Y : integer);
VAR ch : Char;
BEGIN
while KeyPressed do ch := ReadKey;
TextColor (ColorText);
TextBackGround (ColorBackGround);
GotoXY (X,Y); Write (Text);
repeat until KeyPressed;
while KeyPressed do ch := ReadKey;
END;
Пример использования процедуры GoingOutColor.
PROGRAM Demo__GoingOutColor ;
USES Crt;
{$I goingouc.inc }
BEGIN
ClrScr;
GotoXY (15, 10) ;
GoingOutColor (' Нажмите любую клавишу ', 0, 3, 27, 10);
END.
2. Приостановка выполнения программы на заданный отрезок времениИспользование системных часов компьютера позволяет задать время, на которое должно быть приостановлено выполнение программы. В приводимой ниже процедуре возможно задание этого времени в пределах от 0 до 58 секунд.
{ WaitDos
Процедура приостановки выполнения программы на заданный отрезок
времени в секундах (от 0 до 58)
WordTime - число секунд приостановки выполнения программы
waitdos.inc }
PROCEDURE WaitDos (WaitTime : word);
VAR
House, { час - 0..23 }
Minute, { минута - 0. . 59 }
Second, { секунда - 0..59 }
Seс100, { сотые доли секунды 0..99 }
Second_0 : word;
BEGIN
GetTime (House, Minute, Second, Seс100);
if WaitTime + Second >= 59
then Second_0 := WaitTime + Second - 59
else Second_0 := Second + WaitTime;
repeat
GetTime (House, Minute, Second, Sec100);
until
Second = Second_0;
END;
Примечание. При замене в данной процедуре Second на часы, минуты или сотые доли секунды (House, Minute, Second или Sec100) время остановки программы будет соответственно измеряться в этих временных интервалах. Пример использования процедуры WaitDos. Для работы процедуры waitdos.inc необходимо с помощью директивы USES подключить модуль Dos.
PROGRAM DemoWaitDos;
USES Crt, Dos;
VAR
WaitTime : word;
($I waitdos.inc }
BEGIN
ClrScr;
Writeln ('Введите число секунд (1..58) для приостановки ');
Write ('выполнения программы ');
Readln (WaitTime);
Write ('Ждите ', WaitTime, ' секунд(у,ы) ....');
WaitDos (WaitTime);
END.
|
|
||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
|
:tanucik2004@ya.ru |
Copyright © TP7.INFO, 2007-2011
|
|
|
: 308-364-613 |
||
|
: +7 953 580 83 78 |