Страница 1 из 2
Запрет повторного запуска процедуры из фрейма.
Добавлено: 29 Октябрь 2016, 15:36
kreator
Нужно запретить повторный запуск некоторых процедур из меню фрейма (на тулбаре их нет, но вдруг), ключевое здесь слово - фрейм. Естественно, окно MDI, запуск start'ом. Есть в Кларионе такая возможность? Может шаблон? Не проблема руками контролировать глобальную переменную, в которую помещается значение треда. Но если есть уже правильный путь...
Запрет повторного запуска процедуры из фрейма.
Добавлено: 29 Октябрь 2016, 16:01
Игорь Столяров
Так вот же ископаемые терки на эту тему:
http://forum.clarionlife.net/phpbb/view ... %B0#p11254
Здесь возможны вариации на тему, что делать если MDI окно открыто:
1. Можно задизайблить Items для его повторного открытия (самое простое);
2. Можно при повторном вызове послать в ранее открытое окно событие, развернуть и сделать его активным (мой случай).
Запрет повторного запуска процедуры из фрейма.
Добавлено: 29 Октябрь 2016, 16:24
RaFaeL
У нас используется что-то на основе ISemaphore
Запрет повторного запуска процедуры из фрейма.
Добавлено: 29 Октябрь 2016, 16:26
Дед Пахом
Мы как отцы учили - глобальные переменные

Запрет повторного запуска процедуры из фрейма.
Добавлено: 29 Октябрь 2016, 17:11
Yufil
В комплекте FreeABC есть подходящий шаблон (ThreadLimit, файл vsa_thrx.tpw), рекомендуется
Если не подходит - внутри вызываемой процедуры (mdi-окна) заводится переменная
Procname_thread Long(0), Static
Сразу после запуска проверяется
Код: Выделить всё
If Procname_thread <> 0 ! Если есть уже запущенная
! Можно вытащить окно уже запущенной задачи вперёд
SetTarget(, Procname_thread)
0{Prop:Active} = True
SetTarget
Post(Event:GainFocus,,Procname_Thread)
! И завершимся
Return Level:fatal ! Это в ABC
else
Procname_thread = Thread()
end
А перед выходом
Код: Выделить всё
If ProcName_Thread = Thread()
ProcName_Thread = 0
End
Запрет повторного запуска процедуры из фрейма.
Добавлено: 29 Октябрь 2016, 19:00
kreator
Игорь Столяров писал(а):Так вот же ископаемые терки на эту тему: viewtopic.php?f=1&t=2340&p=11254&hilit=%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82+%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B0#p11254
Искал же. Наверно, не по тем словам.
Дед Пахом писал(а):Мы как отцы учили - глобальные переменные
Как отцы учили не пойду. Потому что есть
Yufil писал(а):В комплекте FreeABC есть подходящий шаблон (ThreadLimit, файл vsa_thrx.tpw), рекомендуется
Спасибо, Юрий. Красиво реализовано.
Запрет повторного запуска процедуры из фрейма.
Добавлено: 29 Октябрь 2016, 19:03
Дед Пахом
Ну, это те же яйца на самом деле.
PS.
Вопрос, на самом деле, в другом - кто должен решать, можно ли запускать вторую копию? Если решает фрейм, то что-то вроде "if something_good then start(proc) end" где-то в коде фрейма, если же решает сама процедура, то "if something_bad then return level:notify" в коде WindowManager.Init().
Запрет повторного запуска процедуры из фрейма.
Добавлено: 30 Октябрь 2016, 6:12
Admin
Вы еще учитывайте что к примеру:
Можно запускать только одну копию BrowseGoods но давать возможность запустить ее же с GlobalRequest = SelectRecord
Запрет повторного запуска процедуры из фрейма.
Добавлено: 30 Октябрь 2016, 19:34
kreator
Admin писал(а):Можно запускать только одну копию BrowseGoods но давать возможность запустить ее же с GlobalRequest = SelectRecord
Сделано всё по уму в этом шаблоне. GlobalRequest = SelectRecord учитывается. Мне понравилось, что шаблон только для одной процедуры (данный шаблон), и свой текст лепит в процедуру, не затрагивая фрейм, глобальные переменные, dll... И потом. Поскольку такой запрет нужен для специфических процедур, то, в общем-то логично, что запрет полный, и это решает процедура. У меня так - процедуры не должны вызываться два раза ниоткуда. Проверка на GlobalRespect, в принципе, лишняя даже.
Запрет повторного запуска процедуры из фрейма.
Добавлено: 31 Октябрь 2016, 14:56
finsoftrz
Игорь Столяров писал(а):
2. Можно при повторном вызове послать в ранее открытое окно событие, развернуть и сделать его активным (мой случай).
Плюсану, делаю аналогично. Для справочников и журналов документов. Отчеты (окна с расчетом каких-либо сводных итогов) не ограничиваются. Отслеживается по глобальной очереди открытых окон/потоков. Есть еще близкая по смысловой нагрузке тема - переключение в поток открытого документа при попытке его повторного открытия.
Запрет повторного запуска процедуры из фрейма.
Добавлено: 01 Ноябрь 2016, 10:00
Артур
Yufil писал(а): Если не подходит - внутри вызываемой процедуры (mdi-окна) заводится переменная Procname_thread Long(0), Static Сразу после запуска проверяется Код: Выделить всёIf Procname_thread <> 0 ! Если есть уже запущенная ! Можно вытащить окно уже запущенной задачи вперёд SetTarget(, Procname_thread) 0{Prop:Active} = True SetTarget Post(Event:GainFocus,,Procname_Thread) ! И завершимся Return Level:fatal ! Это в ABCelse Procname_thread = Thread() end
Попробовал, работает, но окно не вытаскивается наверх
Запрет повторного запуска процедуры из фрейма.
Добавлено: 01 Ноябрь 2016, 10:25
Yufil
Если не вытаскивается, надо Event:GainFocus отрабатывать.
А лучше всего посмотреть файл Vsa_thrx.tpw с шаблоном из FreeABC, там всё чётко прописано.
Запрет повторного запуска процедуры из фрейма.
Добавлено: 01 Ноябрь 2016, 11:09
Yufil
Запрет повторного запуска процедуры из фрейма.
Добавлено: 01 Ноябрь 2016, 11:46
kreator
Артур писал(а):Попробовал, работает, но окно не вытаскивается наверх
Вытаскивается. В шаблоне вытаскивается. Вы неправильно что-то делаете.
Вот код, который делает этот шаблон:
Код: Выделить всё
IF GlobalRequest <> SelectRecord ! ThreadLimit (ABC Free)
IF NOT ActiveThread:Preferences ! ThreadLimit (ABC Free)
ActiveThread:Preferences = THREAD() ! ThreadLimit (ABC Free)
vs::ThisThreadActive = THREAD() ! ThreadLimit (ABC Free)
ELSE ! ThreadLimit (ABC Free)
POST(EVENT:GainFocus,,ActiveThread:Preferences) ! ThreadLimit (ABC Free)
RETURN Level:Fatal ! ThreadLimit (ABC Free)
END ! ThreadLimit (ABC Free)
END ! ThreadLimit (ABC Free)
Запрет повторного запуска процедуры из фрейма.
Добавлено: 01 Ноябрь 2016, 11:57
Артур
kreator писал(а): Вытаскивается. В шаблоне вытаскивается. Вы неправильно что-то делаете.
Я работаю в 10 версии, шаблона у меня нет, а предложенный Yufil не регистрируется видимо из-за несоответствия версий, поэтому хотелось бы без шаблона обойтись..