Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Залипает кнопка запуска VBA скрипта


Автор: GrishinUS 19.1.2008, 20:33
Здравствуйте.
Пишу скрипт к SCADA системе ICONICS Genesis32. Что делает скрипт : следит за набором параметров и записывает их в БД MySQL (через ADODB). Пуск и остановка скрипта осуществляется нажатием кнопки вручную -- запускается цикл слежения за параметрами, обновление значений параметров происходят 1 раз в секунду. В качестве задержки служит процедура  Sleep:

Код

Private Declare Function WaitMessage Lib "user32.dll" () As Long

Sub SleepVB(Seconds)
  ' ожидание Seconds секунд
  Dim Start
  Start = Timer   ' текущее время в секундах
  Do While Timer < Start + Seconds
    ' обеспечивает параллельное выполнение других процессов
    WaitMessage
    DoEvents
  Loop
End Sub


Теперь загвоздка. Когда нажимаешь кнопку "Начать слежение за параметрами" кнопка как бы залипает (остается нажатой) и программа не реагирует на нажатия вообще. Проиходит это до тех пор пока не переключишься на другое окно. Прикреплю 3 рисунка :
1) Не нажимали ничего
2) Нажали "Начать слежение за параметрами" (наблюдается залипание)
3) Переключились на другое окно и вернулись обратно (кнопка отлипла)


Автор: GrishinUS 19.1.2008, 20:37
2) Нажали "Начать слежение за параметрами" (наблюдается залипание)

Автор: GrishinUS 19.1.2008, 20:39
3) Переключились на другое окно и вернулись обратно (кнопка отлипла)

Автор: Akina 19.1.2008, 22:22
Если бы теперь еще понять, где все это происходитЮ, какое отношение и в какой именно части это имеет к VB6 (раздел) и VBA (название)...

Автор: Dexx 19.1.2008, 23:07
TRACE MODE

Добавлено @ 23:08
Надо юзать!

Автор: GrishinUS 19.1.2008, 23:08
при нажатии этой кнопки запускается VBA скрипт :

Код

Sub Start(o As GwxPick)
Dim .....
........    

'********************************* цикл здесь ********************************

While DontStop = True
'обрабатывать параметры
......
    
    SleepVB (1)

Wend
'********************************* цикл здесь ********************************
    
End Sub


программа из которой происходит запуск ждет завершения выполнения скрипта. Сейчас ради интереса написал в Start только один оператор

Код

Sub Start(o As GwxPick)
    SleepVB (10)
End Sub


кнопка отвисает через 10 секунд. Может его можно запускать как - нибудь вроде трэда?

Добавлено через 1 минуту и 43 секунды
Цитата(Dexx @  19.1.2008,  23:07 Найти цитируемый пост)

TRACE MODE

Добавлено @ 23:08
Надо юзать!


Я извиняюсь, а что это?

Автор: Dexx 19.1.2008, 23:13
Другая SCADA

Автор: GrishinUS 19.1.2008, 23:25
Цитата(Dexx @  19.1.2008,  23:13 Найти цитируемый пост)
Другая SCADA 


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

Автор: Dexx 19.1.2008, 23:32
У ладно если скада выбрана.
Мож на таймер повесить на проверку параметров?

Добавлено @ 23:35
Мне кажется это логичней.
Пусть вызывается раз в секунду и проверяет параметры!
Выводит там куда нужно и тд.

Автор: Akina 20.1.2008, 00:31
Цитата

The WaitMessage function suspends the thread and does not return until a new message is placed in the thread's message queue. 

Так что кнопка и залипает в ожидании следующего события... каковым собсно является получение приложением фокуса после твоих манипуляций.
Используй другую функцию... или нет, не так - объясни, нахрена ты вообще сюда WaitMessage вставляешь?

Автор: Dexx 20.1.2008, 00:39
Код

Private Declare Function WaitMessage Lib "user32.dll" () As Long

Sub SleepVB(Seconds)
  ' ожидание Seconds секунд
  Dim Start
  Start = Timer   ' текущее время в секундах
  Do While Timer < Start + Seconds
    ' обеспечивает параллельное выполнение других процессов
    WaitMessage
    DoEvents
  Loop
End Sub


 WaitMessage
    DoEvents
Типа цитирую "обеспечивает параллельное выполнение других процессов"
по замыслу автора

Автор: Akina 20.1.2008, 00:47
Цитата(Dexx @  20.1.2008,  01:39 Найти цитируемый пост)
Типа цитирую "обеспечивает параллельное выполнение других процессов"
по замыслу автора

 smile  во бредятина... или это Genesis32 такой тупизной страдает? хотя нет, все равно не может быть, это же не драйвер ядра...

Автор: Dexx 20.1.2008, 01:12
Таймер используй!
При нажатии кнопки запускай.
И например, при повторном нажатии останавливай.


Автор: GrishinUS 20.1.2008, 10:03
Цитата(Akina @  20.1.2008,  00:31 Найти цитируемый пост)
Так что кнопка и залипает в ожидании следующего события... каковым собсно является получение приложением фокуса после твоих манипуляций.
Используй другую функцию... или нет, не так - объясни, нахрена ты вообще сюда WaitMessage вставляешь? 


WaitMessage был вставлен после того как обнаружили загрузку проца 100%, с ней проц грузится так будто ничего не нажимали (0 - 1 % загрузка ЦП).
Если убрать и DoEvents то программа вообще перестает реагировать на что - либо и показывает белый (повисший) экран.


Цитата(Akina @  20.1.2008,  00:47 Найти цитируемый пост)
smile  во бредятина... или это Genesis32 такой тупизной страдает? хотя нет, все равно не может быть, это же не драйвер ядра...


Обеспечивает выполнение других процессов В ПРЕДЕЛАХ САМОЙ GENESIS32 -- отрисовку данных с датчиков там и т.д.
Кстати функция SleepVB была взята вот отсюда :
http://www.visual.2000.ru/develop/ms-vb/tips/0002-2.htm
впоследствии я к ней добавил WaitMessage  чтобы разгрузить ЦПУ (автору процедуры SleepVB отписал)


Цитата(Dexx @  20.1.2008,  01:12 Найти цитируемый пост)
Таймер используй!
При нажатии кнопки запускай.
И например, при повторном нажатии останавливай.


Можно поподробнее что за таймер?

Автор: Akina 21.1.2008, 09:55
Цитата(GrishinUS @  20.1.2008,  11:03 Найти цитируемый пост)
WaitMessage был вставлен после того как обнаружили загрузку проца 100%, с ней проц грузится так будто ничего не нажимали (0 - 1 % загрузка ЦП).
Если убрать и DoEvents то программа вообще перестает реагировать на что - либо и показывает белый (повисший) экран.

Вместо WaitMessage разумнее было вставить задержку по таймеру (скакжем, настроенному на 100 мс).

Цитата(GrishinUS @  20.1.2008,  11:03 Найти цитируемый пост)
Можно поподробнее что за таймер? 

Есть такой контрол... суть его - превращение кода
Код

Sub x()
sleep(N)
Call Action()
End Sub

в такой код:
Код

Sub x()
Timer1.Interval=N*1000
Timer1.Enabled=True
End Sub

Sub Timer1_Timer
Timer1.Enabled=False
Call Action()
End Sub

Автор: neProger 21.1.2008, 15:17
следить за параметрами из VBA?!, пардон, тогда в чем смысл скады. Наверняка есть другой выход.
Таймера в VBA, по-моему, напрочь отсутствуют

Автор: Dexx 21.1.2008, 17:09
Win API

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)