зависание программы (работа с текстовым файлом 2)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Сергей К..
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 11.04.2003 (Пт) 17:40

зависание программы (работа с текстовым файлом 2)

Сообщение Сергей К.. » 15.04.2003 (Вт) 22:18

Снова прошу помочь.
Ситуация следующая: есть большой текстовый файл (4 Мб).
Мне нужно вырезать определенные текстовые блоки начинающиеся
определенными симолами. Каждый из этих блоков нужно записать в переменную и поместить в массив, чтобы затем перемешать блоки в произвольном порядке.
написанный мною код вырезания блоков почему-то виснит при обработке большого n. Т.е. если n = 30 работает , а если 3000 программа виснит

RichText1.Text = ""
b = 0
n = Ubound(TempString)' посчитали количество блоков (выше)
k = 1

For i = 1 To n
a = InStr(k, myString, "&START!") 'ищем вхожднние
If a = 0 Then Exit Sub 'если нет выходим
b = InStr(a, myString, "&END!") 'ищем окончания блока
k = b
c = Mid(myString, a, (b + 4 - a)) 'вырезаем блок

RichText1.Text = RichText1.Text + c & Chr(13) & Chr(10) & Chr(10)
Next i

Прошу помочь и указать на ошибку. Что нужно сделать?

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 15.04.2003 (Вт) 23:32

Наверняка не виснет а просто считает. Прочто у виндов стоит задержка после которой прога считается зависшей. попробуй просто подождать.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

Damage
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 06.04.2003 (Вс) 18:31
Откуда: Москва

Сообщение Damage » 16.04.2003 (Ср) 0:54

Вставь внутрь DoEvents

Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Сообщение Gigahard » 16.04.2003 (Ср) 1:01

Damage писал(а):Вставь внутрь DoEvents
А че это DoEvents дает? Это же просто указание человеку, где код вписывать! :lol: :lol: :lol:

Damage
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 06.04.2003 (Вс) 18:31
Откуда: Москва

Сообщение Damage » 16.04.2003 (Ср) 1:05

просто если вписать DoEvents то винда не будет ругаться на то, что прога зависла(неотвечает)


Вышли весю софтину на мыло - поправлю. Дописывать влом.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2003 (Ср) 8:39

После For i = ... вставь
Код: Выделить всё
If I Mod 100 = 0 Then DoEvents
Lasciate ogni speranza, voi ch'entrate.

Сергей K.
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 10.04.2003 (Чт) 9:18

Сообщение Сергей K. » 16.04.2003 (Ср) 13:49

alibek писал(а):После For i = ... вставь
Код: Выделить всё
If I Mod 100 = 0 Then DoEvents


не работает.
Она все таки виснет!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2003 (Ср) 14:14

Проверь, в каком месте виснет, внутри цикла или при Ubound(TempString). Если первое, то попробуй использовать I Mod 10. Если второе, тогда в настройках виртуальной памяти Windows вручную выставь использовать своп размером 512 Мб.
Lasciate ogni speranza, voi ch'entrate.

Сергей К..
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 11.04.2003 (Пт) 17:40

Сообщение Сергей К.. » 16.04.2003 (Ср) 22:50

Да, действительно, она не виснит, а так жутко долго выполняется.
Проверял на старой машине, поэтому так и не смог дождаться
окончания обработки текста 3,5 Мб. Кстати а почему винда считает,
что приложение повисло?

У меня еще вопрос: как можно перемешать элементы массива в произвольном порядке. Т.е. есть массив из переменных, которые string, их нужно перемешать и слит в файл.
Как ?

И еще неужели нет более быстрого способа, чем применяемый, вырезания текстовых блоков с разделителями.? А то уж слишком долго.

Спасибо!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.04.2003 (Чт) 9:43

Так долго потому, что ты используешь Split() для очень большого объема данных. Используй свой алгоритм для загрузки данных из файлов непосредственно блоками, будет быстрее.
Lasciate ogni speranza, voi ch'entrate.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 17.04.2003 (Чт) 11:09

В Windows у каждого приложения есть очередь сообщений (message queue) в которыую попадают все сообщения для этой программы. Сообщения обрабатываются так называемой оконной функцией программы. В случае работы длинного цикла эта оконная функция не получает управление долгое время и очередь сообщений переполняется. Поэтому система и считает что программа "висит".


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

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

Сейчас этот форум просматривают: Google-бот и гости: 93

    TopList