TreeView в SmartDeviceApplication

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Sergey_N
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 03.11.2005 (Чт) 11:09

TreeView в SmartDeviceApplication

Сообщение Sergey_N » 04.11.2005 (Пт) 4:50

Создаю узлы TreeView из текстового файла (около 4000 узлов).
В WindowsApplication процесс занимает десятые доли секунды.
В SmartDeviceApplication это занимает уже более двух минут при использовании как эмулятора (Pocket PC 2002), так и девайса.
Это так и должно быть?

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 04.11.2005 (Пт) 9:21

могу лишь посоветвать, заполнять узел при его открытии
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Sergey_N
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 03.11.2005 (Чт) 11:09

Сообщение Sergey_N » 04.11.2005 (Пт) 15:46

Sebas, спасибо!
Увы, это не подходит.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 05.11.2005 (Сб) 0:19

код выложи, мож какнить оптимизировать можно...
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Sergey_N
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 03.11.2005 (Чт) 11:09

Сообщение Sergey_N » 05.11.2005 (Сб) 8:59

Код: Выделить всё
    Private Sub ParceGedCom(ByVal GedCom As String)
        GedComArray = Split(GedCom, vbCrLf)
        Dim i, j, bs1, bs2 As Integer
        Dim tnNew As TreeNode
        Dim tnParent As TreeNode
        Dim collNode As New Collection
        Dim c1, c2, c3 As String
        tv.BeginUpdate()
        tv.Nodes.Clear()
        tnNew = tv.Nodes.Add(CType(NameFile(iFileName), String))
        tnNew.Tag = "-1"
        For i = 0 To GedComArray.GetUpperBound(0)
            If GedComArray(i) <> "" Then
                bs1 = GedComArray(i).IndexOf(" ")
                bs2 = GedComArray(i).IndexOf(" ", bs1 + 1)
                c1 = GedComArray(i).Substring(0, bs1)
                If bs2 = -1 Then
                    c2 = GedComArray(i).Substring(bs1 + 1)
                    c3 = ""
                Else
                    c2 = GedComArray(i).Substring(bs1 + 1, bs2 - bs1 - 1)
                    c3 = GedComArray(i).Substring(bs2 + 1)
                End If
                collNode.Add(tnNew, CType(i, String))
                If c1 = tnNew.Tag Then
                    tnParent = CType(collNode.Item(CType(i, String)), TreeNode).Parent
                ElseIf c1 > tnNew.Tag Then
                    tnParent = CType(collNode.Item(CType(i, String)), TreeNode)
                ElseIf c1 < tnNew.Tag Then
                    For j = i To 0 Step -1
                        tnParent = CType(collNode.Item(CType(j, String)), TreeNode).Parent
                        If c1 >= tnParent.Tag Then
                            tnParent = tnParent.Parent
                            Exit For
                        End If
                    Next
                End If
                tnNew = tnParent.Nodes.Add(CType((c2 + " " + c3), String))
                tnNew.Tag = c1
            End If
        Next
        tv.EndUpdate()
        tv.Nodes(0).Expand()
    End Sub


Где GedCom:
0 HEAD
1 SOUR AGES
2 VERS 1.40
2 NAME AGES
2 CORP Daub EDV-Beratung
3 ADDR Glashuetter Weg 105
4 CONT 22889 Tangstedt
4 CONT Germany
1 DEST AGES
1 DATE 22 AUG 2005
1 CHAR ANSI
1 SUBM @SUBM@
1 FILE myfamily.ged
1 GEDC
2 VERS 5.5.1
2 FORM LINEAGE-LINKED
... и т.д.

Цифры в начале строк означают родительские отношения:
Если последующая больше предыдущей, то это ребенок.
Если они равны, то у них общий родитель.
Если последующая меньше предыдущей, то родителя нужно искать у вышестоящей строки с цифрой равной текущей.
Например, для строки "1 DEST AGES" родитель тот же, что и у "1 SOUR AGES", т е. это "0 HEAD"
TreeView - не самоцель. Может можно построить массив массивов?

mad_Max
Бывалый
Бывалый
 
Сообщения: 203
Зарегистрирован: 15.09.2002 (Вс) 21:17
Откуда: Russia, Cherepovets

Сообщение mad_Max » 07.11.2005 (Пн) 1:38

Предлагаю избавиться от Split. Раз уж создаешь дерево из файла, можно считывать построчно. Теперь в функцию передается имя файла:
Код: Выделить всё
    Private Sub ParceGedCom(ByVal GedCom As String)
        Dim rd As New System.IO.StreamReader(GedCom)
        Dim bs1, bs2 As Integer
        Dim tnNew As TreeNode
        Dim tnParent As TreeNode
        Dim c1, c2, c3 As String
        Dim cc1 As Integer
        Dim st As New Stack
        tv.BeginUpdate()
        tv.Nodes.Clear()
        tnNew = tv.Nodes.Add(GedCom)
        tnNew.Tag = -1
        Dim strLine As String = rd.ReadLine()
        st.Push(tnNew)
        While Not (strLine Is Nothing)
            If strLine.Length > 0 Then
                bs1 = strLine.IndexOf(" ")
                bs2 = strLine.IndexOf(" ", bs1 + 1)
                c1 = strLine.Substring(0, bs1)
                If bs2 = -1 Then
                    c2 = strLine.Substring(bs1 + 1)
                    c3 = ""
                Else
                    c2 = strLine.Substring(bs1 + 1, bs2 - bs1 - 1)
                    c3 = strLine.Substring(bs2 + 1)
                End If
                cc1 = Integer.Parse(c1)
                tnParent = CType(st.Peek(), TreeNode)
                While (CType(tnParent.Tag, Integer) >= cc1)
                    st.Pop()
                    tnParent = CType(st.Peek(), TreeNode)
                End While
                tnNew = New TreeNode(c2 & " " & c3)
                tnNew.Tag = cc1
                tnParent.Nodes.Add(tnNew)
                st.Push(tnNew)
            End If
            strLine = rd.ReadLine()
        End While
        rd.Close()
        tv.EndUpdate()
        tv.Nodes(0).Expand()
    End Sub

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 07.11.2005 (Пн) 9:35

Да, все тормоза из-за парсинга строки.

вот это
Код: Выделить всё
               bs1 = strLine.IndexOf(" ")
                bs2 = strLine.IndexOf(" ", bs1 + 1)
                c1 = strLine.Substring(0, bs1)
                If bs2 = -1 Then
                    c2 = strLine.Substring(bs1 + 1)
                    c3 = ""
                Else
                    c2 = strLine.Substring(bs1 + 1, bs2 - bs1 - 1)
                    c3 = strLine.Substring(bs2 + 1)
                End If


тяжело очень для большого цикла
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Sergey_N
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 03.11.2005 (Чт) 11:09

Сообщение Sergey_N » 07.11.2005 (Пн) 9:55

2 mad_Max,
спасибо за решение!
Использование Stack вместо Collection существенно улучшило ситуация, ускорив быстродействие на PPC до 5 сек.
Как полагаете, использование массивов не позволит уменьшить время выполнения?

2 Sebas
Да, все тормоза из-за парсинга строки.

Пробовал использовать регулярное выражение, но результат получился хуже.

mad_Max
Бывалый
Бывалый
 
Сообщения: 203
Зарегистрирован: 15.09.2002 (Вс) 21:17
Откуда: Russia, Cherepovets

Сообщение mad_Max » 09.11.2005 (Ср) 0:37

Sergey_N писал(а):Как полагаете, использование массивов не позволит уменьшить время выполнения?

Значительно - нет. Как уже сказал Sebas, главные тормоза происходят при разбиении строки на части.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 53

    TopList  
cron