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 ![]() |
Автор: | Пётр Кушнир [ Суббота, 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/ |