Я вообще бросил на форму пять вебешных таймеров, которые, по идее, должны поставлять события дуэвентсу (вместо скрола) - не появляется рекурсяия. И от скрола не появляется.
То что каждый второй тик холостой, можно исправить, выставляю на каждом втором тике интервал в ноль (а на первом возвращая).
Изначально ты говорил не о непременимости этого бредового кода, а о его НЕОСУЩЕСТВИМОСТИ.
Хакер писал(а):Я говорил, что нельзя сделать сделать так, чтобы и в таймере код работа и скролл работал.
Я изначально это понял. Поэтому и предложил не как разрешить это противоречие (оно действительно неразрешимо), а как его обойти.Я говорил, что нельзя сделать сделать так, чтобы и в таймере код работа и скролл работал. Одновременно они работать не могут, а последовательно — только рекурсивно.
Private Sub ITimer_Tick(ByVal idTimer As Long, tmNow As Long)
Select Case idTimer
Case tm1
tick1 tmNow
Case tm2
tick2 tmNow
End Select
End Sub
Private Sub tick1(tmNow As Long)' интервал 1000
Static fKRB As Boolean
If fKRB Then Exit Sub
fKRB = True
Dim tm As Long
Do
mTimer.Enabled(tm2) = True' запускаем вспомогательный таймер на случай, если обработка событий затянится.
DoEvents
mTimer.Enabled(tm2) = False' останавливаем вспомогательный таймер
Call DoSomething
tm = GetTickCount
If tm > tmNow + 800 Then Exit Do 'немного меньше интервала, потому что иначе
'при срабатывании КРБ таймер будет ждать целую секунду лишнюю
Loop
fKRB = False
End Sub
Private Sub tick2(tmNow As Long)' интервал 50
Debug.Print "из тика";
Call DoSomething
End Sub
Private Sub DoSomething()
Dim s As String
s = Space(1000000) & Space(1000000)
cntSomething = cntSomething + 1
Debug.Print cntSomething
End Sub
Если данные индецируются в обработчике тика, то тогда во время интервала вообще ничего не делается.а таймер обеспечит гарантированный интервал, в течение которого а) данные индицируются
Для этого тебе нужна целая секунда простоя? Тем более, что эта секунда может растенуться на сколько угодно, если в момент обработки вызвать меню (это ведь и есть проблема?)б) могут делаться другие дела (по событиям от пользователя и по другим таймерам)
обработка у меня до cекунды, а вот интервал между ними намного меньше должен быть
А если никак не обрабатываю? То, как система вызывает следующий timeproc - можно считать-таки особенностью именно апи-таймера?А то, как ты их обрабатываешь — свойства твоего кода, а не свойства таймера.
arthur2 писал(а): А у Апишного - одинаковый интервал как раз между тиками.
Думаю, что "апишный таймер" - это всё-таки не термин с устоявшимся значением. Почему бы для простоты выражения не называть этим "термином" простую реализацию таймера, построенную на апи и процедуре косвенного вызова?
простую реализацию таймера, построенную на апи и процедуре косвенного вызова?
Слово "свойства" по отношению к апи-таймеру предлагаю читать как "особенности", дабы не конфликтовало с термином "свойства".
Но, для простоты, я уже рекомендовал тебе говорить "самодельный" и "VB-шный"
У него нет особенностей. Особенности вытекают из специфики его использования. А использовать его можно десятком разных способов.
А то, как ты их обрабатываешь — свойства твоего кода, а не свойства таймера.
А если никак не обрабатываю? То, как система вызывает следующий timeproc - можно считать-таки особенностью именно апи-таймера?
arthur2 писал(а):Поскольку, как выяснилось, задача у автора была вовсе не та, как в его первом тесте
arthur2 писал(а):Arkadia
Проблема в тесте - как добиться, чтобы обработка данных в большом цикле не прерывалась, если дуэвентс затянулся и заморозил этот самый большой цикл.
если doevents затянулся - то он и должен затягивать всё то, откуда его запустили
другие таймеры <...> на той же форме - продолжают работать
Private Sub Form_Click()
Do
Call DoSomething 'выполняем нужные вычисления
tmr.Enabled = True 'запускаем таймер на случай заморозки цикла
DoEvents
tmr.Enabled = False 'гасим таймер
If flExit Then Exit Sub
Loop
End Sub
Private Sub tmr_Timer()
Debug.Print "из тика";
Call DoSomething
End Sub
Private Sub DoSomething()
Dim s As String
s = Space(10000000) & Space(10000000) & Space(10000000) 'имитируем сложные вычисления
cntSomething = cntSomething + 1
Debug.Print cntSomething
End Sub
Private Sub Form_Unload(Cancel As Integer)
flExit = True
End
End Sub
А вот если вдруг затянется - таймер сработает, и пока цикл заморожен, обработка будет продолжаться в тиках (а после разморозки снова вернётся в цикл)
Я и из цикла, и из тика вызываю одну и ту же процедуру - с чего это в ней будут разные переменные?
Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 56