OberonCore
https://forum.oberoncore.ru/

Задержка времени
https://forum.oberoncore.ru/viewtopic.php?f=35&t=3179
Страница 1 из 1

Автор:  comm1x [ Среда, 19 Январь, 2011 18:15 ]
Заголовок сообщения:  Задержка времени

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

Автор:  Владислав Жаринов [ Среда, 19 Январь, 2011 18:26 ]
Заголовок сообщения:  Re: Задержка времени

comm1x писал(а):
Требуется смоделировать программу, работающую в режиме реального времени.
Программа как будто получает ежесекундно какие то данные. В данном случае это обычный рандом числа. Необходимо каждую секунду запускать процедуру, генерирующие те самые случайные данные и передающие в банк данных. Как реализовать эту самую задержку в секунду?
Чем угодно смоделировать? Если просто "изобразить" - то можно как в п. Некоторые итоги этого примера (находится в конце). Там на "как будто ассемблере", но принцип, наверное, понятен :)

Автор:  Илья Ермаков [ Среда, 19 Январь, 2011 18:26 ]
Заголовок сообщения:  Re: Задержка времени

Смотрите документацию модуля Services.
Там же есть ссылки на модули-примеры.

(Разумеется, это пригодно только для модели, т.к. ни Винда, ни ББ не соответствуют РВ).

Автор:  Пётр Кушнир [ Среда, 19 Январь, 2011 18:40 ]
Заголовок сообщения:  Re: Задержка времени

Код:
MODULE PrivAction;

   IMPORT Services, Log;
   
   TYPE
      Action = POINTER TO RECORD(Services.Action)  (* определяем реализацию отложенного действия, см. документацию к модулю Services *)
         i: INTEGER; (* нужные для чего-то поля *)
         stop: BOOLEAN;
      END;
   
   VAR
      rec: RECORD
         a: Action; (* глобальный идентификатор, в принципе - необязательно хранить идентификатор, но имеет смысл, если данные для обработки будут поступать из-вне *)
      END;   
      
   PROCEDURE (a: Action) Do; (* эта процедура будет выполняться через обозначенный промежуток времени *)
   BEGIN
      Log.Int(a.i);
      INC(a.i);
      IF ~a.stop THEN Services.DoLater(a, Services.Ticks()+1000) END; (* если не stop, то назначаем ещё одно выполнение через секунду от текущего момента *)
   END Do;
   
   PROCEDURE Stop*;
   BEGIN
      IF rec.a#NIL THEN rec.a.stop:=TRUE END; (* останавливаем действие, метод 1 *)
   END Stop;
   
   PROCEDURE Cancel*;
   BEGIN
      IF rec.a#NIL THEN Services.RemoveAction(rec.a) END; (* останавливаем действие, метод 2, при этом отменяется назначенное выполнение *)
   END Cancel;
   
   PROCEDURE Start*;
   BEGIN
      NEW(rec.a); rec.a.i:=0; rec.a.stop:=FALSE; (* создаём новый экземпляр *)
      Services.DoLater(rec.a, Services.Ticks()+1000); (* назначаем выполнение через секунду от текущего момента времени *)
   END Start;

BEGIN

CLOSE
   Cancel; (* останавливаем при выгрузке модуля *)
END PrivAction.

(!)PrivAction.Start

Автор:  comm1x [ Среда, 19 Январь, 2011 19:52 ]
Заголовок сообщения:  Re: Задержка времени

Код:
PROCEDURE (v: View)  Restore (f: Views.Frame; l, t, r, b: INTEGER);
   ...
END Restore;
   
PROCEDURE Main*;
   VAR
      v: View;
   BEGIN
   NEW(v); Views.Deposit(v);
END;


Один момент, по данным мне необходимо выводить динамический график. Restore, как я понял, сначала все отрисовывает, а потом после всего нарисованного Deposit выводит. Если схема работы такая, как мне она представляется, то ума не приложу - куда же вставлять эту временную задержку. В Restore - я не дождусь начала отрисовки графика. Выходит, зацикливать депозит?

Автор:  Иван Кузьмицкий [ Среда, 19 Январь, 2011 20:18 ]
Заголовок сообщения:  Re: Задержка времени

comm1x писал(а):
Один момент, по данным мне необходимо выводить динамический график. Restore, как я понял, сначала все отрисовывает, а потом после всего нарисованного Deposit выводит. Если схема работы такая, как мне она представляется, то ума не приложу - куда же вставлять эту временную задержку. В Restore - я не дождусь начала отрисовки графика. Выходит, зацикливать депозит?


Deposit - это размещение отображения в глобальной очереди. Делается один раз, а вот Restore делается при обновлении отображения. Можно делать периодически Views.Update.

Автор:  comm1x [ Среда, 19 Январь, 2011 21:40 ]
Заголовок сообщения:  Re: Задержка времени

Отлично спасибо. Еще вопрос не по теме, а именно по динамическим массивам. Два модуля: Graphics рисует графики по данным из динамического одинарного массива. Массив создается в модуле Graphics но потом передается в модуль AddValue где увеличивает свою размерность на один и заполняет его определенным значением. Но чтото я делаю не так. Кажется чтото я напутал с этими Pointerами. Может я сам массив както не создал? Спасибо

Код:
MODULE Graphics;
   Data : POINTER TO ARRAY OF INTEGER;

   PROCEDURE Restore;
   BEGIN
      NEW(Data,1); Data[0] := 0;
      DataModel.AddValue(Data);
   END Restore;
END Graphics.

MODULE  DataModel;
   
      
   PROCEDURE AddValue* (OUT DataArray: POINTER TO ARRAY OF INTEGER);
   VAR
      old, new: INTEGER;
   BEGIN
      
      old := DataArray[LEN(DataArray)-1]; [b](*Выхожу за рамки массива здесь*)[/b]
      new := old + Rand.Int(21)-10;
      NEW(DataArray,1);
      DataArray[LEN(DataArray)-1] := -new - 2*old;
      
   END AddValue;
   

END DataModel.

Автор:  Пётр Кушнир [ Среда, 19 Январь, 2011 22:01 ]
Заголовок сообщения:  Re: Задержка времени

comm1x писал(а):
Код:
MODULE Graphics;
   <...>   
   PROCEDURE AddValue* (OUT DataArray: POINTER TO ARRAY OF INTEGER);

OUT убрать или заменить на VAR

Автор:  comm1x [ Среда, 19 Январь, 2011 22:09 ]
Заголовок сообщения:  Re: Задержка времени

Увы не то. Оно раньше не работало, и заработало с OUT но в одном модуле. В двух ни с VAR ни с OUT, ни без них не работает.

Автор:  Пётр Кушнир [ Среда, 19 Январь, 2011 22:38 ]
Заголовок сообщения:  Re: Задержка времени

а вы чего хотите сделать-то?

Автор:  comm1x [ Среда, 19 Январь, 2011 22:46 ]
Заголовок сообщения:  Re: Задержка времени

Отправить динамический массив в соседний модуль, где увеличится его размерность и добавится значение в новую ячейку. Проблема скорее всего вот в чем, как мне кажется. Сначала я увеличиваю размерность с 0 до 1, т.е. создаю самую первую ячейку массива в первом модуле (т.к. во втором модуле я сначала обращаюсь к переменной а потом увеличиваю ее, и если этого не сделать, будет однозначно выход за пределы массива), далее я отсылаю во второй модуль массив где при обращении old := DataArray[LEN(DataArray)-1]; я выхожу за границы массива. По всей видимости не смотря на то что я увеличил размерность массива до 1го, массив все равно передается нулевой, если так можно сказать. Мне кажется это так. Как исправить даже не знаю.

Автор:  Пётр Кушнир [ Среда, 19 Январь, 2011 22:49 ]
Заголовок сообщения:  Re: Задержка времени

дак как вы его отправляете, если DataArray это OUT-параметр процедуры. он равен NIL в этой процедуре, в том виде, как она есть сейчас.

Автор:  Пётр Кушнир [ Среда, 19 Январь, 2011 22:56 ]
Заголовок сообщения:  Re: Задержка времени

если уж на то пошло, то надо делать так:
Код:
MODULE M1;

TYPE

IntArr* = POINTER TO ARRAY OF INTEGER;

END M1.


Код:
MODULE M2;

PROCEDURE AddItem*(VAR arr: M1.IntArr; x: INTEGER);
VAR i, len: INTEGER; new: M1.IntArr;
BEGIN
i:=0;
len:=LEN(arr); NEW(new, len+1);
WHILE i<len DO
new[i]:=arr[i];
INC(i);
END;
new[i]:=x;
arr:=new;
END AddItem;

END M2.


хотя это не корректно. корректнее было бы сделать процедуры по работе с массивом в модуле M1

Автор:  comm1x [ Среда, 19 Январь, 2011 23:15 ]
Заголовок сообщения:  Re: Задержка времени

Спасибо, помогло!

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/