GoldenSoftwareLtd / gedemin

22 stars 13 forks source link

Загрузка процессора событием OnUpdate стандартных Action-ов окон #4207

Open AliakseiDanilchyk opened 3 years ago

AliakseiDanilchyk commented 3 years ago

Для того, чтобы сделать недоступными стандартные кнопки в окнах Гедымина, широко практикуется перекрытие события OnUpdate для Action-а соответствующей кнопки.

Чаще всего код в таком случае выглядит так:

    Option Explicit
    sub actDetailEditOnUpdate(ByVal Sender)
    '*** Данный код необходим для вызова встроенного обработчика ***
    '*** В случае его удаления возможно нарушение работы системы ***
      call   Inherited(Sender, "OnUpdate", Array(Sender))
     '*** конец кода поддержки встроенного обработчика            *** 
      Sender.Enabled = false
    End sub

Если открыта (и не свернута) форма, где такое сделано, то сильно грузится процессор. Конкретно у меня полностью грузится один из 4-х логических процессоров. При этом, если посмотреть Gedemin Control Center, то actDetailEditOnUpdate вызывается примерно 15 000 раз за минуту.

Встречаются много кода, где в вышеприведенном коде закомментирована строка call Inherited. В таком случае actDetailEditOnUpdate вызывается 260 раз в минуту.

Я думаю примеров можно найти много, если поискать по коду actDeleteOnUpdate или actEditOnUpdate.

AliakseiDanilchyk commented 3 years ago

Например, на эталонной базе Ресторана, такое есть в документе Заказ. "Исследователь - Ресторан - 06. Служебное - 01. Заказ"

gsbelarus commented 3 years ago

Если поискать в интернете, то получается, что так и задумано.

https://stackoverflow.com/questions/28792745/does-taction-onupdate-event-degrade-the-performance

выход, или менять наш код перемещая присваивание enabled/disabled в другое место. или как-то влезть в код на стороне гедымина, чтобы он ограничивал частоту вызова onupdate. тут надо смотреть.

В рассматриваемом примере логика такая, чтобы вообще выключить экшен/кнопку. Это надо делать не в onUpdate, а в OnCreate формы. Однократно.

AliakseiDanilchyk commented 3 years ago

Тогда подскажите кто-нибудь оптимальный вариант для деактивации кнопок, потому что на OnCreate формы вот такой код не срабатывает.

    Option Explicit
    Sub gdc_frmUserComplexDocument147004989_45137928OnCreate(ByVal Sender)
    '*** Данный код необходим для вызова встроенного обработчика ***
    '*** В случае его удаления возможно нарушение работы системы ***
      Call   Inherited(Sender, "OnCreate", Array(Sender))
    '*** конец кода поддержки встроенного обработчика            ***
      Dim ActEdit : Set ActEdit = Sender.GetComponent("ActEdit")
      ActEdit.Enabled = False
    End Sub
MIchaelShoihet commented 3 years ago

Тогда надо перекрыть OnUpdate и закоментировать inherited

ср, 18 авг. 2021 г., 09:59 Aliaksei Danilchyk @.***>:

Тогда подскажите кто-нибудь оптимальный вариант для деактивации кнопок, потому что на OnCreate формы вот такой код не срабатывает.

Option Explicit Sub gdc_frmUserComplexDocument147004989_45137928OnCreate(ByVal Sender) ' Данный код необходим для вызова встроенного обработчика ' В случае его удаления возможно нарушение работы системы Call Inherited(Sender, "OnCreate", Array(Sender)) ' конец кода поддержки встроенного обработчика Dim ActEdit : Set ActEdit = Sender.GetComponent("ActEdit") ActEdit.Enabled = False End Sub

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/GoldenSoftwareLtd/gedemin/issues/4207#issuecomment-900869476, or unsubscribe https://github.com/notifications/unsubscribe-auth/ACXXJ7UXJNU5PRGKHOPSZLDT5NK4VANCNFSM5BV52UXQ . Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&utm_campaign=notification-email .

gsbelarus commented 2 years ago

Тогда подскажите кто-нибудь оптимальный вариант для деактивации кнопок, потому что на OnCreate формы вот такой код не срабатывает.

    Option Explicit
    Sub gdc_frmUserComplexDocument147004989_45137928OnCreate(ByVal Sender)
    '*** Данный код необходим для вызова встроенного обработчика ***
    '*** В случае его удаления возможно нарушение работы системы ***
      Call   Inherited(Sender, "OnCreate", Array(Sender))
    '*** конец кода поддержки встроенного обработчика            ***
      Dim ActEdit : Set ActEdit = Sender.GetComponent("ActEdit")
      ActEdit.Enabled = False
    End Sub
  1. Не в onCreate а скорее в LoadSettingsAfterCreate. Был вроде у нас такой метод. После вызова inherited части.
  2. При этом надо убрать присваивания в других местах. Например, в Action.OnUpdate.

Эту ситуацию надо задокументировать. Программно вряд ли мы просто решим, потому что такая логика зашита в компоненты делфи.

gsbelarus commented 2 years ago

Например, на эталонной базе Ресторана, такое есть в документе Заказ. "Исследователь - Ресторан - 06. Служебное - 01. Заказ"

@yoannawx @alexandra-gsoftware обратите внимание! надо поправить на эталоне везде, где есть такие места.