Зависание интерфейса на время выполнения задачи

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

diver
Сообщения: 114
Зарегистрирован: Пн мар 27, 2017 8:01 pm
Благодарил (а): 7 раз
Поблагодарили: 1 раз

Зависание интерфейса на время выполнения задачи

Сообщение diver » Чт ноя 30, 2017 6:06 pm

Всем привет!
Столкнулся с такой проблемой: Хочу на сцену сделать простой таймер обратного отчета. В итоге, пока таймер работает вэб интерфейс недоступен, не могу ничего обновить, не могу ходить по менюшкам. В программировании новичок, может чего в принципе делаю неправильно. В итоге для теста создал совсем простую конфигурацию:
Создан объект "OnLineTimer" со свойством "OnLineTimer.sec" и методом everysec
СпойлерПоказать
"for($i=30;$i>=0;$i--) {
sg('OnLineTimer.sec',time());;
sleep(1);
}"
Создал сцену с двумя элементами:
1) тип html, всё по дефолту, одно состояние с кодом %OnLineTimer.sec%
2) тип кнопка, которая дергает объект OnLineTimer с методом everysec.
В итоге, когда на сцене жмешь кнопку - бежит unix время, весь остальной интерфейс majordomo замораживается. Причем в другом браузера, majordomo работает нормально. Проблема явно в том, что первый браузер ждет окончания работы скрипта.
Но самое интересное, что если метод everysec запускать не кнопкой со сцены, а например из свойств объекта - браузер не замораживается. Подскажите, куда копать...
PS
Надеюсь, понятно объяснил.
PPS
От браузера не зависит, "замораживаются" все.
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Зависание интерфейса на время выполнения задачи

Сообщение Chainik » Чт ноя 30, 2017 6:25 pm

Попробуйте заменить "sleep" на "SetTimeOut".
https://majordomo.smartliving.ru/Main/P ... gFunctions
diver
Сообщения: 114
Зарегистрирован: Пн мар 27, 2017 8:01 pm
Благодарил (а): 7 раз
Поблагодарили: 1 раз

Re: Зависание интерфейса на время выполнения задачи

Сообщение diver » Чт ноя 30, 2017 6:56 pm

Chainik писал(а):Попробуйте заменить "sleep" на "SetTimeOut".
СпойлерПоказать
for ($count = 0; $count < 600; $count++) {
setTimeOut('delay123', setGlobal('OnLineTimer.sec',time()), (int)('1'));
}
ClearTimeOut('delay123');
Не помогает, такое ощущение, что как скрипт не тормози - пока он выполняется, все остальное недоступно.
И опять же - если запускать метод руками, то проблем нет. Проблема только, если метод запускается по некому действию на сцене.
Не понимаю :(
diver
Сообщения: 114
Зарегистрирован: Пн мар 27, 2017 8:01 pm
Благодарил (а): 7 раз
Поблагодарили: 1 раз

Re: Зависание интерфейса на время выполнения задачи

Сообщение diver » Пт дек 01, 2017 3:36 pm

В общем получается забавная штука, если на Сцене расположен какой-то объект, по клику на который вызывается цикл (по Методу или Сценарию, не важно) - интерфейс замирает на время работы этого цикла. Теперь бы понять, как это обойти...
diver
Сообщения: 114
Зарегистрирован: Пн мар 27, 2017 8:01 pm
Благодарил (а): 7 раз
Поблагодарили: 1 раз

Re: Зависание интерфейса на время выполнения задачи

Сообщение diver » Пн дек 04, 2017 2:25 pm

Есть какие-нибудь идее, как по клику на сцене запускать цикл и так, что бы интрефейс не вис на время цикла ?
Я уже все варианты перепробовал, какие смог придумать :(
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Зависание интерфейса на время выполнения задачи

Сообщение Chainik » Пн дек 04, 2017 5:04 pm

Может попробовать с safe_exec
https://majordomo.smartliving.ru/forum/ ... hp?p=12010
Есть надежда, что ваш скрипт запустится в отдельном потоке и элементы интерфейса на сцене не будут дожидаться окончания исполнения скрипта.
diver
Сообщения: 114
Зарегистрирован: Пн мар 27, 2017 8:01 pm
Благодарил (а): 7 раз
Поблагодарили: 1 раз

Re: Зависание интерфейса на время выполнения задачи

Сообщение diver » Вт дек 05, 2017 12:49 pm

Chainik писал(а):Может попробовать с safe_exec
https://majordomo.smartliving.ru/forum/ ... hp?p=12010
Есть надежда, что ваш скрипт запустится в отдельном потоке и элементы интерфейса на сцене не будут дожидаться окончания исполнения скрипта.
Судя по:
sergejey писал(а):сорри, сейчас нет механизма обратной связи от safe_exec
это не вариант. Мне же надо не просто запускать некий цикл, но и взаимодействовать с вэб интерфейсом сцены...
Пока из того, что более или менее работает - это по кнопке запускать сценарий, в котором инициализировать ряд значений, записывать их в свойства объекта, в конце запускать новый_скрипт runScript(новый_скрипт), в котором уже пускать таймеры, а в конце "новый_скрипт" запускать его же самого... как в примере про 2ух секундный таймер.
В общем или я запутался и не вижу нормального и простого решения, или это просто жесть... Вообще функционал таймера по кнопке в вэб интерфейсе - на мой взгляд штука должна быть простая. Хотя может быть я использую данный софт не по назначению. Не знаю..
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Зависание интерфейса на время выполнения задачи

Сообщение Chainik » Вт дек 05, 2017 3:16 pm

Если у вас элементы на сцене завязаны на свойства объектов, то системе, думаю, все равно, каким образом они (свойства) меняются. Главное для вас, насколько я понимаю, чтобы при выполнении скрипта не было "зависания" интерфейса. А оно может быть (пока скрипт тратит время на опрос некого "железа"). Так что если safe_exec запускает ваш скрипт без "замораживания" интерфейса, почему бы его не использовать. Ведь насколько я понимаю изменения свойств объектов "мониторятся" MDM в режиме "реального времени".
diver
Сообщения: 114
Зарегистрирован: Пн мар 27, 2017 8:01 pm
Благодарил (а): 7 раз
Поблагодарили: 1 раз

Re: Зависание интерфейса на время выполнения задачи

Сообщение diver » Вт дек 05, 2017 3:34 pm

Chainik писал(а):Если у вас элементы на сцене завязаны на свойства объектов, то системе, думаю, все равно, каким образом они (свойства) меняются. [skip] Ведь насколько я понимаю изменения свойств объектов "мониторятся" MDM в режиме "реального времени".
А как можно из внешнего PHP скрипта передать данные в MDM ?
Я соорудил внешний скрипт, не зная php - я предположил, что первые 4 строки - это подключение библиотек, что бы отработала MDM функция sg(). Но в итоге OnLineTimer.sec не передается.
СпойлерПоказать
<?php
chdir(dirname(__FILE__) . '/../');
include_once("./config.php");
include_once("./lib/loader.php");
include_once("./lib/threads.php");
setGlobal('OnLineTimer.sec',time());
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Зависание интерфейса на время выполнения задачи

Сообщение Chainik » Вт дек 05, 2017 4:23 pm

Ну я тоже не программист (от слова совсем). Я только предположил. Пусть более опытные товарищи попробуют подсказать (если решение вообще есть). А передать значение из внешнего скрипта в MDM, наверное, нельзя (во всяком случае, я не знаю как). Я то думал, что safe_exec вы будете запускать из-под MDM.
Сам такого не делал. Но там же в скриптах есть путь, по которому его можно запустить из командной строки. Вот я и предположил, что с помощью safe_exec (но из-под MDM) можно запустить скрипт в отдельном процессе...
Прошу прощения, если направил вас по ложному пути.
Ответить