"Зависание "

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

"Зависание "

Сообщение Black_T » 10.02.2006 (Пт) 11:44

Такая вот проблемка.
Сделал прогу, она считает кучу уравнений,
расчет длится от минуты и дальше,
за это время прога "подвисает",
ну это система так считает,
прогресс бар замирает и т.п.
После завершения расчета она "отмирает".
Как можно сделать так чтобы система не считала ее зависшей ?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 10.02.2006 (Пт) 11:48

DoEvents в цикл вычислений можно поставить

xqz_me
Постоялец
Постоялец
 
Сообщения: 413
Зарегистрирован: 04.12.2005 (Вс) 14:58

Сообщение xqz_me » 10.02.2006 (Пт) 12:02

Как то давно делал тупую программу. Прсто быстро меняла цвет формы, рисовала линии. Смотрелась прикольно... Ну так, вот... Она накак не хотела закрываться, подвисала система и т.д. Тогра я во все циклы вставил таймер на несеолько милисекунд и тормаза исчезли. :wink:

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 10.02.2006 (Пт) 12:03

DoEvents в цикл вычислений можно поставить

Не можно, а НУЖНО!
А я все практикую лечение травами...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 10.02.2006 (Пт) 12:10

Тогра я во все циклы вставил таймер на несеолько милисекунд и тормаза исчезли.

Какой таймер и в какие циклы? :shock:
Может это была задержка?...
А я все практикую лечение травами...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 10.02.2006 (Пт) 12:15

наверное он Sleep поставил

xqz_me
Постоялец
Постоялец
 
Сообщения: 413
Зарегистрирован: 04.12.2005 (Вс) 14:58

Сообщение xqz_me » 10.02.2006 (Пт) 12:21

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

Денис Победря
Мегобойанист
Мегобойанист
 
Сообщения: 1037
Зарегистрирован: 03.01.2005 (Пн) 21:29
Откуда: Из Москвы

Сообщение Денис Победря » 10.02.2006 (Пт) 15:31

xqz_me ты наверно сделал процедуру отрисовки в событии таймера

Black_T
DoEvents или (хотя не советую, очень не советую) сделай в событии таймера
[Место cдаётся]

CORBA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 22.11.2003 (Сб) 13:41
Откуда: Ukraine-Crimea-Feodosia

Сообщение CORBA » 10.02.2006 (Пт) 17:03

xqz_me писал(а):Там был вечный цикл, в котором менялся случайным образом цвет формы. Туда таймер и поставил. Наверно, получилось нерационально, но зато тормазить перестало.


Надо было в событие Timer прописать код прорисовки твоих линий. а не таким гемором заниматься.
У каждой сложной задачи есть множество простых для понимания, но неправильных решений.

Black_T
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 17.01.2006 (Вт) 18:25

Сообщение Black_T » 11.02.2006 (Сб) 11:03

>DoEvents

Если можно раскажите поподробнее,
или линк на статью, где пример с этой командой есть...

Это может отразиться на скорости работы программы ?

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 11.02.2006 (Сб) 13:24

Какой тут пример? Вставляешь в цикл и все!
Ну чтоб понятнее:
Код: Выделить всё

Do While a<b
   a=a+1
   DoEvents  'Позволяет ОС обработать события
Loop

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

Black_T
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 17.01.2006 (Вт) 18:25

Сообщение Black_T » 11.02.2006 (Сб) 14:09

Спасибо!
Разобрался, на скорость влияет, но не сильно.

1. Расчет без DoEvents - длился 3 мин 7 сек.
2. Расчет с DoEvents шаг через 10 уравнений- длился 3 мин 17 сек.
3. Расчет с DoEvents на каждом уравнении- длился 3 мин 18 сек.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 12.02.2006 (Вс) 19:15

Разобрался, на скорость влияет, но не сильно.

Конечно, DoEvents позволяет проге обрабатывать другие события во время выполнения цикла, но не повышает скорость...
А я все практикую лечение травами...

Fencer
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 01.06.2005 (Ср) 16:19
Откуда: Новосибирск

Сообщение Fencer » 14.02.2006 (Вт) 17:51

Функция DoEvents ОЧЕНЬ сильно замедляет работу. Если вам необходимо вычислить большой цикл и в нём вы используете DoEvents - скорость обработки цикла упадёт в десятки раз! Поэтому лучше прибегнуть к использованию API функции GetInputState (она возвращает True если форме было послано сообщение от клавиатуры или мыши):

Declare Function GetInputState Lib "user32" _
Alias "GetInputState" () As Long

For c = 1 To 100000
temp = 2 * 2 * 2
If GetInputState() Then DoEvents ' здесь 312 мс.
DoEvents ' а здесь время выполнения цикла 6543 мс. !!!
Next c

это я вычитал в "полезных советах" на одном сайте
Искал Гуглом и Яндексом.
Искал по форуму.
Спрашивал соседа.
Пытался сделать сам.
Спасибо за помощь ;)


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

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

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

    TopList