<<< BACK NEXT >>>

РЕАЛЬНЫЕ ПРИМЕРЫ

На основе изложенного материала рассмотрим несколько примеров программирования в Caper.
   Следующий пример демонстрирует возможности программирования с помощью оператора WAIT.

internal <null> f_sum
private <int> sum := 0

// в следующем операторе после очередной проверки условия
// вызывается процедура f_sum
 
wait sum == 30 by f_sum

// ожидание нажатия ESC
wait GetKeyb() == 27
return

// процедура инкремента переменной sum
flick f_sum
  sum += 1
endflick

В следующем примере определяются две процедуры, одна из которых перемещает “маленький шарик” вправо (Ping), другая – влево (Pong). Обе процедуры могут работать бесконечно (все преобразования расположены внутри бесконечного цикла без принудительного выхода). Возможность завершения программы обеспечивает процедура WaitExit, внутри которой ожидается нажатия клавиши ESC. Еще одна процедура обеспечивает возможность установки асинхронной паузы.
   В программе (блок MAIN) стартуют параллельно 3 процедуры, причем Ping и Pong стартуют на общем поле параметров. Взаимодействие между Ping и Pong осуществляется через общее поле параметров. В любой момент времени для завершения работы программы может быть нажат ESC, на который отреагирует WaitExit.
   Процедура Pause используется в Ping и Pong для организации пауз при рисовании “маленького шарика”.

#include caper_GDI.ch
#include caper_FRW.ch
#include capGeometry.def
#include capWindow.def

// объявления блоков
internal <int> Ping( <int> y, x ), <byte> Pong( <int> y, x ), =>
         <NULL> WaitExit(),  Pause( <word> tm_pouse )

// синхронный старт Ping, Pong и WaitExit
do synch ( Ping, Pong ) ( 100, 100 ), WaitExit
return

 

* Перемещает "маленький шарик" слева направо
block Ping ( y, x )
  while 1
    wait x == 100   ;* ожидает значение координаты по x
    repeat          ;* когда x станет равным 100, начнется выполнение цикла.
      outText( y, x, 'O',, 0x00FF0000 ) ;* вывод “маленкого шара” на экран
      Pause( 1 )                        ;* однамиллисекундная пауза
      outText( y, x, '  ',, 0 )         ;* затирание “шарика” на экране
      x += 1        ;* инкремент х (двигаемся вправо)
    until x >= 500  ;* до тех пор, пока x < 500
  endw
endblock

* Перемещает "маленький шарик" справа налево
block Pong ( y, x )
  while 1
    wait x == 500   ;* waits x-coordinate value
    repeat          ;* when x == 500 cycle will start.
      outText( y, x, 'O',, 0xFF )
      Pause( 1 )
      outText( y, x, '  ',, 0 )
      x -= 1        ;* x increamentation (moving to left)
    until x <= 100  ;* cycle works before x > 100
  endw
endblock

#macro K_ESC    27
// ожидает нажатия ESC
block WaitExit
  outText( 20, 20, "Press ESC to exit",, 0xFF )
  Wait GetKeyb() == K_ESC ;* ожидание ESC
  quit         ;* выйти из программы
endblock

// Данная процедура организует паузу в миллисекундах, количество
// которых указывается параметром
block Pause static ( msec )   
local <word> time := GetTicks() ;* динамическое создание локальной переменной ;* которая хранит текущее время в миллисекундах
wait GetTicks()- time >= msec ;* ожидание истечения времени, указанного в  ;* параметре
endblock

ФУНКЦИИ УПРАВЛЕНИЯ

SetParams(
             <имя блока>,
             <номер параметра>,
             <значение>
         )
<имя блока>       -  строка - имя блока;
<номер параметра> -  число - номер параметра;
<значение>        -  значение любого типа.
Функция позволяет установить значение параметра уже вызванного блока: указывается имя блока, который расположен в стеке вызовов или является текущим (в этом случае вместо имени - NULL), номер параметра и его значение.

SetParamsParall(
                  <номер потока>,
                  <имя блока>,
                  <номер параметра>,
                  <значение>
               )
<номер потока>    -  число - номер потока;
<имя блока>       -  строка - имя блока;
<номер параметра> -  номер параметра;
<значение>        -  значение любого типа.
Функция позволяет установить значение параметра вызванного блока в указываемом параллельном потоке: указывается имя блока, который расположен в стеке вызовов или является текущим (в этом случае вместо имени - NULL), номер параметра и его значение.

GetParamsAddr( <имя блока>, <номер параметра> ) возвращает текущее значение параметра с <номер параметра> вызванного блока с <имя блока>; если <имя блока> - NULL, то предполагается текущий блок.

GetPrlParamAddr( <номер потока>, <имя блока>, <номер параметра> )
<номер потока>    -  число - номер потока;
<имя блока>       -  строка-имя блока;
<номер параметра> -  число-номер параметра.

возвращает текущее значение параметра с <номер параметра> вызванного блока с <имя блока> в параллельном потоке с <номер потока>;  если <имя блока> - NULL, то предполагается текущий блок.

<<< BACK NEXT >>>