OberonCore
https://forum.oberoncore.ru/

Таймер замирает при нажатой кнопке мыши
https://forum.oberoncore.ru/viewtopic.php?f=24&t=1401
Страница 1 из 1

Автор:  Rifat [ Пятница, 13 Март, 2009 16:55 ]
Заголовок сообщения:  Таймер замирает при нажатой кнопке мыши

Пытаюсь сделать форму, на которой будет отображаться обратный отсчет.
Заметил такую вещь, если нажать и удерживать кноку мыши на заголовке окна или же выбрать меню, но не выбрать подменю, то отображение времени на форме останавливается.
Я использую 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 ]
Заголовок сообщения:  Re: Таймер замирает при нажатой кнопке мыши

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

Автор:  Rifat [ Суббота, 14 Март, 2009 12:39 ]
Заголовок сообщения:  Re: Таймер замирает при нажатой кнопке мыши

Есть какой-нибудь другой способ, как организовать фоновую работу (отображение часов и фоновое скачивание из сети), если Services.Action плохо подходит для этих целей?

Автор:  Иван Кузьмицкий [ Суббота, 14 Март, 2009 12:48 ]
Заголовок сообщения:  Re: Таймер замирает при нажатой кнопке мыши

Использовать Active BlackBox :) Там есть параллелизм. См. http://www.oberoncore.ru/blackbox/polygon

Автор:  Пётр Кушнир [ Суббота, 14 Март, 2009 12:56 ]
Заголовок сообщения:  Re: Таймер замирает при нажатой кнопке мыши

Services.Action нормально подходит для организации фоновой работы, такой, которая не требует строгой периодичности. Работа с сетью, например, отлично ложится на Services.Action (проверено). Если требуется просто отображать количество миллисекунд(секунд) то тут тоже Services.Action подойдёт. Если работа в фоне критична к периодичности таймера, тогда конечно, лучше использовать Active BlackBox + системный MMTimer(кажется так)

Автор:  Пётр Кушнир [ Суббота, 14 Март, 2009 13:10 ]
Заголовок сообщения:  Re: Таймер замирает при нажатой кнопке мыши

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 ]
Заголовок сообщения:  Re: Таймер замирает при нажатой кнопке мыши

Вот здесь посмотрите
http://forum.oberoncore.ru/viewtopic.php?f=23&t=834&sid=26fda99300707891c38d12f172490de4
Почему-то в Дельту это не вошло.
Такое же изменение верно и для 1.6

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