RUS  ENG 

Торможение макросов

Страницы: 1
RSS
Торможение макросов
 
Добрый день.
Версия 10.0.0.8512u.x64 - но эта проблема была еще в Zulu 8.

Суть: есть некий макрос (пример ниже), при его запуске он отрабатывает примерно за секунд 20-30 ( в зависимости от размера сети), где элементов в сети примерно 400. Если запускать макрос много раз (больше 10-15) то с каждым разом он будет выполнятся все дольше. Вполь до того, что сеть из 10 элементов обработает за минут 10!

Возможно макрос я написал коряво и не эффективно, однако думаю что независимо от количество запусков, время выполнение должно быть примерно одинаково, а не отличатся в сотни раз.
При этом перезагрузка клиента не помогает, решается перезагрузкой сервера Zulu.

Вопрос: в чем проблема?


Код
Sub Num_Opora
Const eIncidentAll = 3
Const eNetworkAll = 3
' ActiveX enumeration values definitions end
    
Set L = Zulu.ActiveMapDoc.Layers.Active   

L.NetworkTools.ClearResults
L.NetworkTools.ClearOverloadedStates
L.NetworkTools.ClearFlags
        
tp = L.CurrentID    

L.NetworkTools.AddFlag tp

Zulu.ActiveMapDoc.Refresh 1
L.NetworkTools.FindConnected

   
L.Selection.ModifyByKeys 1, L.NetworkTools.Results   
   


L.ExecSQL("upd ate set [tp_sys] = " + cstr(tp) + " where geometry.selected() = 1")

Se t keys = L.Selection
set keys2 = keys.ElementKeys
set all_sys_uch = keys2.SelectByType(4, 0)
For i = 1 to all_sys_uch.Count
    sys_uch = all_sys_uch.Item(i)
   Set nwo = L.NetworkObjects (eNetworkAll)
   nwo1 = nwo.GetIndexByKey (sys_uch)
   key_end = nwo.KeyEnd(nwo1)
    key_begin = nwo.KeyBegin(nwo1)
    L.ExecSQL("upd ate set [start_sys] = " + cstr(key_begin) + " where typeid = 4 and  sys = " + cstr(sys_uch))
    L.ExecSQL("upd ate se t [end_sys] = " + cstr(key_end) + " where typeid = 4 and  sys = " + cstr(sys_uch))
    L.ExecSQL("upd ate se t [opora_sys] = " + cstr(key_begin) + " where typeid = 3 and  sys = " + cstr(key_end))
Next

Se t keys2 = L.NetworkTools.Results.SelectByType (2 , 0)

cnt = keys2.Count 

Set opora_k = L.ExecSQL("upd ate set [RootLevel_1] = null where  geometry.selected() = 1 ")
For j = 1 To cnt
    sys_opora = keys2.Item(j)

   kol_svet = "SELECT count([sys]) WHERE opora_sys = "  + cstr(sys_opora) + " and typeid =  3"
   Se t Result = L.ExecSQL(kol_svet)
    
   kol_u = "SELECT count([sys]) WHERE start_sys = "  + cstr(sys_opora) + " and typeid =  4"
   Set Result_u = L.ExecSQL(kol_u)

    
    If (Result_u.DataSet.FieldValue(0) - Result.DataSet.FieldValue(0)) >0 Then
        Set opora_p = L.ExecSQL("upd ate set [RootLevel_1] = 0 where sys = " + cstr(sys_opora))
   End if
    
    
    Se t opora_k = L.ExecSQL("upd ate set [RootLevel_1] = 1 where [RootLevel_1] is null and geometry.selected() = 1 ")

Next

Se t NObjects = L.NetworkObjects (eNetworkAll)
'''
Set Tree = L.GetShortWayTree(tp)
Set keys = L.Selection
set keys2 = keys.ElementKeys
Set Keys = keys2.SelectByType (2, 0)
cnt = Keys.Count 
For j = 1 To cnt
    Set Item = Tree.ItemById(Keys(j))
   Set sql_1 = L.ExecSQL("upd ate set l_tp = " & Item.RootLength & "  where Sys = " + CStr(Item) + "")

  
Next

nn = 1
Se t ways= L.ExecSQL("SELECT sys, l_tp where typeid = 2  and RootLevel_1 = 1  ORDER BY l_tp ASC")

Set list= ways.DataSet
      list.MoveFirst
        Do
      If list.eof = true then exit do 
         Set Way = L.ShortWay (tp, ways.DataSet.FieldValue(0))
         For i = 2 To Way.Count
            ID = Way.Item(i)           
            If i Mod 2 = 0 Then          
            Else   
               Set status = L.ExecSQL("SELECT [num_opora] where typeid = 2 and Sys = " + CStr(ID) + "")
               If status.DataSet.FieldValue(0) = "" Then
                  L.ExecSQL("update set [num_opora] = " + CStr(nn) + " where typeid = 2 and Sys = " + CStr(ID) + "")
                  nn = nn +1 
            End if

      End If   
         Next  

      list.MoveNext
      Loop

L.NetworkTools.ClearResults
L.NetworkTools.ClearOverloadedStates
L.NetworkTools.ClearFlags
L.Themes.UpdateTheme 2   
msgbox("Готово")

End Sub
 
Цитата
написал:
Добрый день.
Версия 10.0.0.8512u.x64 - но эта проблема была еще в Zulu 8.
[CODE][/CODE]
Добрый день. Слой нужен, чтобы посмотреть.

Из неэффективного это создавать в цикле Set nwo = L.NetworkObjects (eNetworkAll)
Тяжелая операция. Нужно один раз до цикла объект получить
Страницы: 1