OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 18 Апрель, 2024 05:00

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




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: Пятница, 13 Март, 2009 16:55 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Пытаюсь сделать форму, на которой будет отображаться обратный отсчет.
Заметил такую вещь, если нажать и удерживать кноку мыши на заголовке окна или же выбрать меню, но не выбрать подменю, то отображение времени на форме останавливается.
Я использую BlackBox 1.6

Вот код:
MODULE FormsTableOperators;

IMPORT
Dialog, Services, Strings, StdTables;

TYPE
TimeAction = POINTER TO RECORD (Services.Action)
start, step: LONGINT;
END;

VAR
data*: RECORD
t*: StdTables.Table;
END;
timer: TimeAction;


PROCEDURE (timer: TimeAction) Do;
VAR
left: LONGINT;
str: ARRAY 40 OF CHAR;
BEGIN
left := 1000 - timer.step;
Strings.IntToString(left, str);
data.t.SetItem(0, 0, "Ожидание (" + str + " секунд)");
Dialog.Update(data);
INC(timer.step);
Services.DoLater(timer, timer.start + timer.step * Services.resolution);
END Do;

PROCEDURE InitTimer;
BEGIN
(* Инициализируем таймер *)
NEW(timer);
timer.start := Services.Ticks();
timer.step := 0;
Services.DoLater(timer, Services.now);
END InitTimer;

BEGIN
data.t.SetSize(1,1);
InitTimer;
END FormsTableOperators.

Как можно обойти эту проблему, чтобы при нажатии на кнопку мыши или при других действиях время не останавливалось?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 13 Март, 2009 17:32 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Технически, Services.Action выполняются только тогда, когда фреймворк свободен от других задач. То есть, не гарантируется, что действие будет выполняться с заданой периодичностью. Для таймера оно не подходит.
При нажатии на заголовок подвисают многие программы, не только БлэкБокс.
Ещё, может быть, в этом причина: viewtopic.php?f=24&t=370&hilit=Ports


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 14 Март, 2009 12:39 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Есть какой-нибудь другой способ, как организовать фоновую работу (отображение часов и фоновое скачивание из сети), если Services.Action плохо подходит для этих целей?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 14 Март, 2009 12:48 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Использовать Active BlackBox :) Там есть параллелизм. См. http://www.oberoncore.ru/blackbox/polygon


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 14 Март, 2009 12:56 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Services.Action нормально подходит для организации фоновой работы, такой, которая не требует строгой периодичности. Работа с сетью, например, отлично ложится на Services.Action (проверено). Если требуется просто отображать количество миллисекунд(секунд) то тут тоже Services.Action подойдёт. Если работа в фоне критична к периодичности таймера, тогда конечно, лучше использовать Active BlackBox + системный MMTimer(кажется так)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 14 Март, 2009 13:10 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Rifat писал(а):
Services.DoLater(timer, timer.start + timer.step * Services.resolution);
К тому же, похоже что у вас, из за неверно заданных параметров действие изначально получается апериодическим. Корректное переназначение действия(периодичного) надо оформить вот так:

Код:
timer.resolution:=Services.resolution DIV 10; (*10 раз в секунду*)
Services.DoLater(timer, Services.Ticks() + timer.resolution);


Ещё я бы порекомендовал использовать Services.Ticks() для засекания прошедшего времени. например вот так:
Код:
VAR t0, dt : LONGINT;
<...>
t0:=Services.Ticks();
(* через некоторое время *)
dt:=Services.Ticks()-t0; (* прошедшее время в миллисекундах *)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Апрель, 2009 20:47 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Вот здесь посмотрите
http://forum.oberoncore.ru/viewtopic.php?f=23&t=834&sid=26fda99300707891c38d12f172490de4
Почему-то в Дельту это не вошло.
Такое же изменение верно и для 1.6


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

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


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

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


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

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