Подскажите (про таймер и VB6) - Нужна ли многопоточность??

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

Подскажите (про таймер и VB6) - Нужна ли многопоточность??

Сообщение live » 22.08.2007 (Ср) 14:09

Будет ли выполнятся событе таймера (или как сделать чтобы оно выполнялось) строго в соотв. с интервалом, если в это же время выполяется другая процедура (к примеру, в цикле do...loop) ?.
Т.е. мне нужно сделать так, чтобы события таймера выполнялись независимо от выполнения других процедур. Как этого можно добится ? Может у кого то есть уже готовые решения ?
Заранее спасибо...

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

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

RT-приложения в VB не пишутся (да и вообще в Windows).
Чтобы таймер срабатывал в Do...Loop, достаточно будет время от времени делать DoEvents.
Lasciate ogni speranza, voi ch'entrate.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 22.08.2007 (Ср) 14:45

RT-приложения в VB не пишутся (да и вообще в Windows).


Давно еще видел VB-приложение, которое через звуковую карту принимало морзянку с радиоприемника, и конвертировала ее в текст. Чем не RT приложение?

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

Сообщение Twister » 22.08.2007 (Ср) 14:48

Будет ли выполнятся событе таймера (или как сделать чтобы оно выполнялось) строго в соотв. с интервалом, если в это же время выполяется другая процедура (к примеру, в цикле do...loop) ?.
В ВБ не будет, если, как сказал Алибек, не воткнуть DoEvents. Добавлю - пока процедура таймера не отработает - повторно она же не вызовется. Если же создать таймер через АПИ - то вполне.
А я все практикую лечение травами...

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

Сообщение alibek » 22.08.2007 (Ср) 15:11

Twister писал(а):Добавлю - пока процедура таймера не отработает - повторно она же не вызовется.

Ну в MSDN вообще сильно остерегают от того, чтобы процедура повторно вызвалась (вследствии DoEvents) до того, как она отработает.

jangle, это не realtime-приложение.
Lasciate ogni speranza, voi ch'entrate.

live
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 22.08.2007 (Ср) 14:06
Откуда: Краснодар

Сообщение live » 22.08.2007 (Ср) 15:33

пока процедура таймера не отработает - повторно она же не вызовется

Это я знаю. Повторно ее вызывать и не нужно. Архитектура программы построена таким образом, что таймер только добавляет задание в очередь. А обработкой этой очереди занимается другая процедура.
Так вот я и боюсь если обработка очереди затянется, то таймер всё равно будет крутится или тоже остановится пока не обработается очередь??

Всё крутится примерно так
Код: Выделить всё
Private colQueue As New Collection1
Private IsQueue As Boolean 'Когда происходит обработка очереди IsQueue=True

Private Sub Timer1_Timer()
    i = i + 1
    colQueue.Add CStr(i)
   
    'Если обработка очереди не происходит и есть новые задания в очереди, то обработать очередь
    If IsQueue = False And Not colQueue Is Nothing Then Debug.Print "Calling":  Call UpdateQueue
End Sub

Private Sub UpdateQueue()
    Dim clsTask As Class1
    IsQueue = True
    For Each clsTask In colQueue
        '.
        '. обработка очереди
        '.
    Next
    Set colQueue = Nothing
    IsQueue = False
End Sub

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

Сообщение alibek » 22.08.2007 (Ср) 15:46

Если обработка затянется внутри For Each ... Next, то без вызова DoEvents событие таймера не сработает.
Можешь в таймере обновлять глобальную переменную (LastClock = Timer), а в цикле проверять If (Timer-LastClock)>0.1 Then DoEvents.
Lasciate ogni speranza, voi ch'entrate.

live
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 22.08.2007 (Ср) 14:06
Откуда: Краснодар

Сообщение live » 22.08.2007 (Ср) 16:01

alibek
спасибо, попробую


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot], Yandex-бот и гости: 92

    TopList