Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Залипает кнопка запуска VBA скрипта 
:(
    Опции темы
GrishinUS
Дата 19.1.2008, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.9.2006
Где: Самара

Репутация: нет
Всего: нет



Здравствуйте.
Пишу скрипт к 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:40

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  isnt_running.GIF 3,00 Kb
PM MAIL ICQ   Вверх
GrishinUS
Дата 19.1.2008, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.9.2006
Где: Самара

Репутация: нет
Всего: нет



2) Нажали "Начать слежение за параметрами" (наблюдается залипание)

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  is_running.GIF 3,38 Kb
PM MAIL ICQ   Вверх
GrishinUS
Дата 19.1.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.9.2006
Где: Самара

Репутация: нет
Всего: нет



3) Переключились на другое окно и вернулись обратно (кнопка отлипла)


Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  is_stopped.GIF 2,93 Kb
PM MAIL ICQ   Вверх
Akina
Дата 19.1.2008, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Dexx
Дата 19.1.2008, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 13.6.2005

Репутация: 5
Всего: 7



TRACE MODE

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

Это сообщение отредактировал(а) Dexx - 19.1.2008, 23:08


--------------------

PM   Вверх
GrishinUS
Дата 19.1.2008, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.9.2006
Где: Самара

Репутация: нет
Всего: нет



при нажатии этой кнопки запускается 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
Надо юзать!


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

Это сообщение отредактировал(а) GrishinUS - 19.1.2008, 23:09
PM MAIL ICQ   Вверх
Dexx
Дата 19.1.2008, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 13.6.2005

Репутация: 5
Всего: 7



Другая SCADA


--------------------

PM   Вверх
GrishinUS
Дата 19.1.2008, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.9.2006
Где: Самара

Репутация: нет
Всего: нет



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


Мне думается заказчик неправильно поймет мои советы по выбору SCADA, тем более, что она давно куплена. 
PM MAIL ICQ   Вверх
Dexx
Дата 19.1.2008, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 13.6.2005

Репутация: 5
Всего: 7



У ладно если скада выбрана.
Мож на таймер повесить на проверку параметров?

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

Это сообщение отредактировал(а) Dexx - 19.1.2008, 23:38


--------------------

PM   Вверх
Akina
Дата 20.1.2008, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата

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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Dexx
Дата 20.1.2008, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 13.6.2005

Репутация: 5
Всего: 7



Код

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
Типа цитирую "обеспечивает параллельное выполнение других процессов"
по замыслу автора

Это сообщение отредактировал(а) Dexx - 20.1.2008, 00:40


--------------------

PM   Вверх
Akina
Дата 20.1.2008, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Dexx
Дата 20.1.2008, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 13.6.2005

Репутация: 5
Всего: 7



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




--------------------

PM   Вверх
GrishinUS
Дата 20.1.2008, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.9.2006
Где: Самара

Репутация: нет
Всего: нет



Цитата(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 Найти цитируемый пост)
Таймер используй!
При нажатии кнопки запускай.
И например, при повторном нажатии останавливай.


Можно поподробнее что за таймер?
PM MAIL ICQ   Вверх
Akina
Дата 21.1.2008, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(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



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0702 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.