Форум » GUI » Таймера в МиниГуи » Ответить

Таймера в МиниГуи

Andrey: Столкнулся с проблемой с новыми версиями МиниГуи с февральской... Перестали работать таймера в программе. Их у меня 3 штуки в большой проге. Сделал в 2015 и до этого работали без проблем. 1-таймер читает пользователей программы в журнале-dbf и выводит на главную форму, 2-таймер проверяет ключ HASP, 3-таймер каждые 5 минут передаёт записи на сайт в Postgres Sql Я до этого считал, что если таймер не работает(выводит) что-то на форму, то достаточно запоминать/восстанавливать алиасы по которым работаешь в таймере с базами и всё, больше ничего не нужно. Однако меня просветили, совсем недавно, что не всё так просто. Блин прога работала 8 лет, а сейчас начала ВЕШАТЬСЯ после отработки таймера. Формы открыты, по ним юзер тупо тыкается, а прога не реагирует... висит... Даже закрыть программу нельзя - rdp протокол такого не разрешает наверное. Нужно заходить админу на сервер и тупо снимать прогу юзера. Это не постоянно происходит, а по непонятному решению Винды. Хрень какая то получается, чем больше знаешь и правишь свой код, тем больше ломается. Можно выкинуть таймера совсем из программы, но это не наш метод ! Указали мне как правильно работать с таймером - пример SAMPLES\Advanced\Tsb_5Win ВАЖНО ! При запуске одного таймера, все другие надо выключать... Прога 8 лет об этом и не знала... И ещё нужно запоминать текущее окно проги и текущий фокус объекта на форме. Или это не особо важно ? А то у меня опять хрень получается..

Ответов - 4

Andrey: Andrey пишет: ВАЖНО ! При запуске одного таймера, все другие надо выключать... Что-то за сегодня из-за этого выключения юзера жалуются, отправка не идёт. Что будет в проге, если таймера не выключать при запуске одного таймера ? У меня это вызывает - негатив, перестают выполняться функции на таймерах.

Andrey: Вернулся к старому варианту, не останавливаю все таймера, а только один, который срабатывает, вот так. И везде ставлю вывод в лог-файл, чтобы понять, что у юзера происходит. [pre2] DEFINE TIMER Timer_1 INTERVAL nStaticTimeUpdate * 60 * 1000 ; ACTION {|| // таймер чтения всех работающих в журнале программы, вывод в STATUSBAR Local cForm := "Form_Main" Local cTime := "[" + HB_NtoS( nStaticTimeUpdate ) + " мин.]" nTimer1++ ? "@@@ Timer_1 " + cTime, HB_DATETIME(), ProcNL(), "попытка=",nTimer1 SetProperty(cForm, "Timer_1", "Enabled", .F.) // остановить таймер // функция чтения журнала dbf всех работающих пользователей // внутри сохранение/восстановление текущего алиаса, recno OperatUsers2(nTimer1) SetProperty(cForm, "Timer_1", "Enabled", .T.) // включить заново таймер Return Nil } Form_Main.Timer_1.Enabled := .F. // отключить таймер до ON INIT Form_Main.Timer_1.Visible := .F. // блок кода без изменения среды This на время работы Timer_1[/pre2]

SergKis: Andrey пишет Form_Main.Timer_1.Visible := .F. // блок кода без изменения среды This на время работы Timer_1 Т.к. оказалось, что среда This сохраняется без изменений всего несколько срабатываний таймера (2-3) и потом меняется на This среду окна MAIN (причина не ясна), то лучше поставить или убрать совсем строку Form_Main.Timer_1.Visible := .T. тогда This среда будет сохранятся (которая была) на время выполнения блока кода таймера и восстанавливаться по окончании.


SergKis: Andrey Думаю, такой вариант таймеров в своих потоках тебе должен подойти Кому интересно пример тут https://TransFiles.ru/9nlnp



полная версия страницы