Страница 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
Кому не хочется искать и грузить шаблон, выложил на
https://mega.nz/#!ckZEQLKL!EgbAAOB_OXuG ... 9pAI9a37UM

Запрет повторного запуска процедуры из фрейма.

Добавлено: 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 не регистрируется видимо из-за несоответствия версий, поэтому хотелось бы без шаблона обойтись..