Помогите с рекурсией!!!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Помогите с рекурсией!!!

Сообщение XairOn » 26.11.2004 (Пт) 19:38

Здравствуйте, вот такая у меня проблема: хочу, что бы прога упорядочила содержимое листбокса, вобщем в это листбоксе отображается содержимое определенного каталога (каталоги и файлы), вобщем в листбокс они (файлы и папки) добавляются не по порядку, т.е. допустим, сначала файл, потом папка и т.д. я хочу, что бы прога рассортировала содержимое листбокса, сначала должны идти папки, а затем файлы. Для удобста я сделал так, что каждый итем заканчивается символом "\" - если каталог или "|" - если файл. Потом написал функцию, которая производит сортировку, вот её код:
Код: Выделить всё
Private Sub pro()
Dim i As Integer
Dim bufer As String
Dim bool As Boolean

bool = True
For i = 0 To List1.ListCount - 1
If (Mid$(StrReverse(List1.List(i)), 1, 1) = "\") And (Mid$(StrReverse(List1.List(i - 1)), 1, 1) = "|") Then
bufer = List1.List(i - 1)
List1.List(i - 1) = List1.List(i)
List1.List(i) = bufer
bool = False
End If
Next i
If bool = False Then pro
End Sub


Вобщем проблема такая: функция работает хорошо, но очень медленно, если например 300 итемов в листбоксе, на его сортировку уходит около 7-8 секунд, по-моему это очень долго, при чем во время работы функции прога вообще висит... я бы не сказал, что у меня слабая тачка (1.5 Гц всё таки). Подскажите, как мне этот процесс сортировки ускорить или подскажите другой выход!

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 26.11.2004 (Пт) 19:46

Например, используй вместо прямой сортировки в ЭУ массив, потом уже перекидывай в Listbox. Когда добавляешь/удаляешь все в ЭУ, винда его каждый раз перерисовать должна, а это занимает время.

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 26.11.2004 (Пт) 19:56

List действительно хорошо бы перед началом работы скрыть.
Окно "висит", потому что главный поток приложения занят. Внутри цикла вызывай DoEvents и все будет ОК.
Моду создают модоки, а распространяют модозвоны.

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 26.11.2004 (Пт) 21:46

Блин, полтергейст творится какой-то: сделал так как советовали: сортировку перенес в массив и в цикл добавил DoEvents и вот что странно, с DoEvents сортировка неправильная получается, хотя всё быстро (почти незаметно) делается, комментирую всего одну строчку с DoEvents'ом и всё работает нормально, но опять же долго. Что за дела???

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 26.11.2004 (Пт) 22:11

Вот примерчик, в нем implements твоего способа и мой (работающий чуть быстрее 8))..
Может поможет :wink:

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 26.11.2004 (Пт) 23:34

XairOn

А для чего тебе рекурсия, ты же не сортируешь, а просто переставляешь папки вверх, файлы вниз :) Для этого достаточно всего один раз пройти листбокс:

Код: Выделить всё
Sub Exchange()
    Dim i As Long, i1 As Long, i2 As Long
    Dim BufFolder() As String, BufFile() As String
    List.Visible = False
    For i = 0 To List.ListCount - 1
        If (Right$(List.List(i), 1) = "\") Then
            ReDim Preserve BufFolder(0 To i1)
            BufFolder(i1) = List.List(i)
            i1 = i1 + 1
        Else
            ReDim Preserve BufFile(0 To i2)
            BufFile(i2) = List.List(i)
            i2 = i2 + 1
        End If
    Next i
    List.Clear
    For i = 0 To UBound(BufFolder())
        List.AddItem BufFolder(i)
    Next i
    For i = 0 To UBound(BufFile())
        List.AddItem BufFile(i)
    Next i
    List.Visible = True
   
End Sub


У меня результат такой: папка System32 (более 2000 файлов и субпапок) упорядочиваются в лисбоксе за 32-35 мс. Если файлов 300, то порядка 15мс. Но здесь уже больше само время вызова влияет, чем обработка листа.

И ещё: List.Visible можно на LockWindowUpdate заменить

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 26.11.2004 (Пт) 23:35

Если задача стоит только в том, чтобы вначале поместить папки, а затем- файлы, рекомендую
1) заменить Listbox на Listview
2) Listview1.sorted=False
3 во вторую колонку в случае папок ставить " _folder", а в случае файлов -"File"
4 затем, после добавления всего, делать
Listview1.sorted=True
Listview1.SortOreder=1
Т.Е. сортировать по второй колонке.
Алгоритмы сортировки от Microsoft, как правило, работают быстрее, чем рукотворные.

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 27.11.2004 (Сб) 0:13

Alexanbar писал(а):Алгоритмы сортировки от Microsoft, как правило, работают быстрее, чем рукотворные.


Ну не надо так сильно доверять Мелкософту:)

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 27.11.2004 (Сб) 0:51

В 95% случаев алгоритмы Microsoft будут лучше твоих, только если ты не являешься сверхспециалистом по алгоритмам или не оттачивал один алгоритм сутками, неделями или месяцами ;)
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 27.11.2004 (Сб) 1:07

gaidar

Мелкософт оттачивал свои алгоритмы не сутками и не неделями, и не месяцами. Они уже столько лет их всё точат и точат... А они всё тупые и тупые...

Если ХР, попробуй, в других работать не будет. Сравнишь доморощенный поиск с Виндовым. Там же и сортировка.
Вложения
NewFloat.zip
(43.3 Кб) Скачиваний: 20

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 27.11.2004 (Сб) 9:38

Всем спасибо, проблема решена!
xolod, тебе отдельная благодарность, твой код помого мне решить эту проблему!!!


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

    TopList