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/ |