Зависание длинных циклов
При выполнении цикла, например For - Next более 200тыс раз программа не отвечает, форма не активна и ошибка со всей потерей данных
(даже с определением всех переменных Option Explicit) типа Long
i = i + 1 и условие остановки таймера, когда i = i(max)
DoEvents в теле цикла - рулит.
Цитата: SkyMаn
DoEvents в теле цикла - рулит.
Вообще если то что происходит в цикле критично или длительно по времени можно выполнять в отдельном потоке, что не критично в таймере.
Цитата: iridum
Вообще если то что происходит в цикле критично или длительно по времени можно выполнять в отдельном потоке, что не критично в таймере.
Можно и так. DoEvents - тоже вполне приемлимо для сабжа.
На счет таймера, то можно АПИшкой заюзать SetTimer/KillTimer.
Что лучше - не скажу, поскольку не знаю, что вертится в автора в теле цикла.
DoEvents работает, но останавливает цикл например при удержании кнопки мыши, но остановка на прерывании мне не больно нужна. И вопрос к эксперту: что возвращает X = DoEvents [as Integer]
Цитата: SPB-667
если время выполнения программы не очень важно, то попробуй поместить содержимое цикла в таймер, добавив лишь строку, наподобие:
i = i + 1 и условие остановки таймера, когда i = i(max)
i = i + 1 и условие остановки таймера, когда i = i(max)
Это идея оказалась не плохой, только пришлось ещё добавить Exit Sub
кое где, ну для выполнения нескольких циклов сразу, по принципу "ядра" с приоритетом. Вообщем разобрался с таймером
http://vbzero.narod.ru/chapter1/page_22.htm
А тут - http://www.codinghorror.com/blog/archives/000159.html - попытка доказать, что это зло. :)
Доп. инфа:
А тут - http://www.codinghorror.com/blog/archives/000159.html - попытка доказать, что это зло. :)
Public Declare Function SetTimer Lib "user32" Alias "SetTimer" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Ругается на lpTimerFunc
Как это записать правильно