OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 21:56

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




Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: Аналог процедуры Delay()
СообщениеДобавлено: Вторник, 28 Февраль, 2012 20:36 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2011 16:26
Сообщения: 18
Откуда: Люберцы
Я хочу в исполнителе сделать задержку на x миллисекунд между выполнением команд. Как в Pascal процедура Delay().
Подскажите пожалуйста как проще реализовать это.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аналог процедуры Delay()
СообщениеДобавлено: Вторник, 28 Февраль, 2012 23:22 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Александр Иноземцев писал(а):
Я хочу в исполнителе сделать задержку на x миллисекунд между выполнением команд. Как в Pascal процедура Delay().
Подскажите пожалуйста как проще реализовать это.
Через Services.Action


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аналог процедуры Delay()
СообщениеДобавлено: Среда, 29 Февраль, 2012 01:16 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Код:
IMPORT Services;

TYPE
  DelayAction = POINTER TO RECORD (Services.Action) END;

PROCEDURE (da: DelayAction) Do;
BEGIN
 (* наш код
если нужно продолжить, выполняем здесь
Services.DoLater(Services.Ticks()+timeout);*)
END Do;

PROCEDURE DoLater(timeout: INTEGER);
VAR da: DelayAction;
BEGIN
NEW(da); Services.DoLater(da, Services.Ticks()+timeout); (* это важно, именно Ticks()+таймаут, то есть, через таймаут от текущего момента *)
END DoLater;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аналог процедуры Delay()
СообщениеДобавлено: Среда, 29 Февраль, 2012 07:41 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Товарищи, вы название форума не забыли прочитать? ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аналог процедуры Delay()
СообщениеДобавлено: Среда, 29 Февраль, 2012 08:26 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Насколько я помню, в Дельфе Delay блокирует выполнение? Т.е. это просто обёртка над WinApi.Sleep?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аналог процедуры Delay()
СообщениеДобавлено: Среда, 29 Февраль, 2012 08:49 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2011 16:26
Сообщения: 18
Откуда: Люберцы
В данном случае я бы хотел написать аналог Sleep(). Т.е. задержка перед выполнением следующей команды. Однако моих скромных познаний в КП не хватает для этого.

Опишу подробнее: Имется набор процедур Исполнителя. Часть из них изменяют положение Исполнителя (перемещение, поворот). Я хочу в конце таких процедур ставить процедуру задержки, чтобы можно было рассмотреть процесс, а не конечный результат (процедура задержки должна иметь параметр).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аналог процедуры Delay()
СообщениеДобавлено: Среда, 29 Февраль, 2012 09:04 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Вызывайте WinApi.Sleep напрямую.

Если не хотите выходить за пределы библиотеки ББ, используйте Services.Action --- задержка будет не после, а перед выполнением команды --- команда ожидает заданное число миллисекунд, потом выполняется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аналог процедуры Delay()
СообщениеДобавлено: Среда, 29 Февраль, 2012 11:55 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Евгений Темиргалеев писал(а):
Вызывайте WinApi.Sleep напрямую.

Задержка то будет, но картинка обновится только после завершения программы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аналог процедуры Delay()
СообщениеДобавлено: Среда, 29 Февраль, 2012 12:11 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Trurl писал(а):
Задержка то будет, но картинка обновится только после завершения программы.
После завершения программы никакой картинки уже не будет. Или я не в теме?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аналог процедуры Delay()
СообщениеДобавлено: Среда, 29 Февраль, 2012 13:52 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2011 16:26
Сообщения: 18
Откуда: Люберцы
Евгений Темиргалеев писал(а):
Вызывайте WinApi.Sleep напрямую.

Если не хотите выходить за пределы библиотеки ББ, используйте Services.Action --- задержка будет не после, а перед выполнением команды --- команда ожидает заданное число миллисекунд, потом выполняется.


1. А как быть если ББ запущен из Linux? (по поводу WInApi)

2. Я с трудом разгребаю Views, поэтому буду очень благодарен за ссылку на примеры по модулю Services, а конкретно, по данному вопросу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аналог процедуры Delay()
СообщениеДобавлено: Среда, 29 Февраль, 2012 14:37 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
1) Вы скорее всего пользуетесь виндовым ББ под wine, который реализует WinApi. Но, как заметил Trurl, этот вариант не годится.
2) viewtopic.php?p=71073#p71073
Код:
MODULE PrivDelay;
   IMPORT Services, Dialog;

   TYPE
      DelayAction = POINTER TO RECORD (Services.Action)
         cmd: ARRAY 256 OF CHAR
      END;

   PROCEDURE (da: DelayAction) Do;
      VAR res: INTEGER;
   BEGIN
      Dialog.Call(da.cmd, "", res)
   END Do;

   PROCEDURE Exec* (IN cmd: ARRAY OF CHAR; timeout: INTEGER);
   VAR da: DelayAction;
   BEGIN
      NEW(da); da.cmd := cmd$;
      Services.DoLater(da, Services.Ticks()+timeout); (* это важно, именно Ticks()+таймаут, то есть, через таймаут от текущего момента *)
   END Exec;

END PrivDelay.

^Q "PrivDelay.Exec('Log.Int(1);Log.Ln', 1000)"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аналог процедуры Delay()
СообщениеДобавлено: Среда, 29 Февраль, 2012 17:25 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2011 16:26
Сообщения: 18
Откуда: Люберцы
Спасибо.
А если вызов идет не через коммандер, то так пойдет PrivDelay.Exec('', 1000)?
Вот пример фрагмента:
Код:
...
PROCEDURE ШагВперед;
BEGIN
  DrawPlace(vx, vy); (* удаляем изображение Исполнителя на старой позиции *)
  vx := vx + dx;
  vy := vy + dy;
  DrawVoyager(vx, vy); (* отрисовываем Исполнителя на новой позиции *)
  Views.Update( область, Views.keepFrames );
  PrivDelay.Exec('', 1000)
END;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аналог процедуры Delay()
СообщениеДобавлено: Среда, 29 Февраль, 2012 18:24 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
PrivDelay.Exec(cmd, t) регистрирует экшен, который через t мс выполнит команду cmd. Экшены выполняются "в фоне".

PROCEDURE ШагВперед;
BEGIN
...
PrivDelay.Exec('', 1000)
END;

ШагВперед будет сам по себе работать, на каждое его исполнение будет регистрироваться по экшену, которые в фоне, через секунду ничего делать не будут.

Вам надо что-то типа Exec('ШагВперёд', 1000)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аналог процедуры Delay()
СообщениеДобавлено: Среда, 29 Февраль, 2012 21:05 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2011 16:26
Сообщения: 18
Откуда: Люберцы
Евгений Темиргалеев писал(а):
...
Вам надо что-то типа Exec('ШагВперёд', 1000)

Большое спасибо. Что-то такое я предполагал, когда внимательнее посмотрел на предложенный вариант. Не хотел даблпостить.
Именно такой вариант подойдет, т.к. ШагВперед это процедура отрисовки. Анализ до и после действия производится отдельно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аналог процедуры Delay()
СообщениеДобавлено: Среда, 25 Июль, 2012 07:56 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Евгений Темиргалеев писал(а):
Вызывайте WinApi.Sleep напрямую.

Код:
PROCEDURE Test* ();
VAR i:INTEGER;
BEGIN
   i:=0;
   WHILE i<20  DO
      WinApi.Sleep(1000);
      Log.Real(ObxRandom.Uniform());
      Log.Ln;

      led0:=~led0;
      led1:=~led1;
      led2:=~led2;
      led3:=~led3;

      Dialog.UpdateBool(led0);   
      Dialog.UpdateBool(led1);   
      Dialog.UpdateBool(led2);   
      Dialog.UpdateBool(led3);   
      
      INC(i)
   END;
END Test;
   

Иногда срабатывает нормально (чекбоксы мигают, как LED),
иногда после 5-6 миганий система затормаживается и потом
все результаты сразу выводятся на печать.

Причина- в многозадачности операционной системы?
Как можно лечить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аналог процедуры Delay()
СообщениеДобавлено: Среда, 25 Июль, 2012 08:04 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Kubanych писал(а):
Причина- в многозадачности операционной системы?
Как можно лечить?


Лечится тестированием на многоядерном процессоре.


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

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


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

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


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

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