OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 19 Апрель, 2024 21:37

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Задержка времени
СообщениеДобавлено: Среда, 19 Январь, 2011 18:15 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задержка времени
СообщениеДобавлено: Среда, 19 Январь, 2011 18:26 

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


Последний раз редактировалось Владислав Жаринов Среда, 19 Январь, 2011 18:27, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задержка времени
СообщениеДобавлено: Среда, 19 Январь, 2011 18:26 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Смотрите документацию модуля Services.
Там же есть ссылки на модули-примеры.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задержка времени
СообщениеДобавлено: Среда, 19 Январь, 2011 18:40 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Код:
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задержка времени
СообщениеДобавлено: Среда, 19 Январь, 2011 19:52 

Зарегистрирован: Среда, 14 Апрель, 2010 15:53
Сообщения: 15
Откуда: Орел
Код:
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 - я не дождусь начала отрисовки графика. Выходит, зацикливать депозит?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задержка времени
СообщениеДобавлено: Среда, 19 Январь, 2011 20:18 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
comm1x писал(а):
Один момент, по данным мне необходимо выводить динамический график. Restore, как я понял, сначала все отрисовывает, а потом после всего нарисованного Deposit выводит. Если схема работы такая, как мне она представляется, то ума не приложу - куда же вставлять эту временную задержку. В Restore - я не дождусь начала отрисовки графика. Выходит, зацикливать депозит?


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задержка времени
СообщениеДобавлено: Среда, 19 Январь, 2011 21:40 

Зарегистрирован: Среда, 14 Апрель, 2010 15:53
Сообщения: 15
Откуда: Орел
Отлично спасибо. Еще вопрос не по теме, а именно по динамическим массивам. Два модуля: 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.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задержка времени
СообщениеДобавлено: Среда, 19 Январь, 2011 22:01 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
comm1x писал(а):
Код:
MODULE Graphics;
   <...>   
   PROCEDURE AddValue* (OUT DataArray: POINTER TO ARRAY OF INTEGER);

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задержка времени
СообщениеДобавлено: Среда, 19 Январь, 2011 22:09 

Зарегистрирован: Среда, 14 Апрель, 2010 15:53
Сообщения: 15
Откуда: Орел
Увы не то. Оно раньше не работало, и заработало с OUT но в одном модуле. В двух ни с VAR ни с OUT, ни без них не работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задержка времени
СообщениеДобавлено: Среда, 19 Январь, 2011 22:38 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
а вы чего хотите сделать-то?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задержка времени
СообщениеДобавлено: Среда, 19 Январь, 2011 22:46 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задержка времени
СообщениеДобавлено: Среда, 19 Январь, 2011 22:49 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
дак как вы его отправляете, если DataArray это OUT-параметр процедуры. он равен NIL в этой процедуре, в том виде, как она есть сейчас.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задержка времени
СообщениеДобавлено: Среда, 19 Январь, 2011 22:56 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
если уж на то пошло, то надо делать так:
Код:
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задержка времени
СообщениеДобавлено: Среда, 19 Январь, 2011 23:15 

Зарегистрирован: Среда, 14 Апрель, 2010 15:53
Сообщения: 15
Откуда: Орел
Спасибо, помогло!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB