Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6: Приостановить выполнение кода приложения / 25 сообщений из 45, страница 1 из 2
14.12.2011, 12:21
    #37575006
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
В общем, задачка архитектурного характера

Есть у меня прога, в нормальном режиме работы там открыта пользователем куча окон, с которыми он работает параллельно, программа не блокирует ему ничего, давая возможность переключаться между потребностями.

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

как бы так просто убить двух зайцев?
делать дополнительный контроль во всех событиях, которые могут произойти - достаточно проблематично.
...
Рейтинг: 0 / 0
14.12.2011, 12:29
    #37575031
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
Sleep()
...
Рейтинг: 0 / 0
14.12.2011, 12:31
    #37575038
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
Shocker.ProНо возникает ситуация, когда требуется, чтобы вся прога приостановила свою работу, не выполнялся никакой код, до определенного момента. Я запускаю модальную форму, в этой форме работает цикл.Каков критерий окончания этой приостановки? что за определённый момент? критерий - наступление некоего события или действия пользователя (нажатие кнопки, например)?
...
Рейтинг: 0 / 0
14.12.2011, 12:40
    #37575065
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
Ожидание восстановления связи с сервером ))
...
Рейтинг: 0 / 0
14.12.2011, 12:50
    #37575101
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
Оставить цикл с DoEvents, но добавить туда Sleep. Sleep приостановит прогу без загрузки проца, а DoEvent позволит иногда перерисовать окно. Хотя в этот момент пытливый юзер может успеть куда-нибудь ткнуть и сгенерить событие.
...
Рейтинг: 0 / 0
14.12.2011, 12:55
    #37575118
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
Да блин, если разрешить doevents, то будут происходить события, которых быть не должно. И это необязательно пользовательские события.
...
Рейтинг: 0 / 0
14.12.2011, 13:04
    #37575163
BelowZero
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
Shocker.Pro,

оставить DoEvents и блокировать нажатия мыши и клавы, на всякий пожарный давать фокус какому-нить левому окну) правда от программного ввода не спасёт... либо что-нить можно сообразить с msgbox'ом. вроде, можно было послать msgbox так, что прога работает, а ввод данных в прогу не осуществляется, пока не закрыт msg...
...
Рейтинг: 0 / 0
14.12.2011, 13:08
    #37575173
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
> Автор: Shocker.Pro
> Да блин, если разрешить doevents, то будут происходить события, которых быть не должно. И это необязательно
> пользовательские события.

БегЁшь по всем открытым окнам и делаешь им Enabled = False, открываешь свое модальное окно в циклом и DoEvents'ом и
ждешь сигнала окончить перекур, прячешь модальное окно и пробегаешся по открытым окнам и делаешь им Enabled = True. И
овцы целы(задизейбленным окнам недоходят виндовые сообщения) и волки сыты(делается то что нужно)

Ы?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.12.2011, 13:23
    #37575216
Диклевич Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
я в таком случае использую цикл с DoEvents, однако блокирую все контролы (Enabled = False) до выхода из цикла. Потом разблокирую.
...
Рейтинг: 0 / 0
14.12.2011, 13:55
    #37575303
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
BelowZero, Игорь Горбонос, Диклевич Александр

Ребята, вы все меня не услышали!!!!
Пользователь и так ничего не может сделать, потому что форма модальная, запрещена к выгрузке и на ней нет контролов.

Но в программе происходят события, не связанные с пользовательскими действиями, вот их-то и не надо обслуживать.
...
Рейтинг: 0 / 0
14.12.2011, 13:59
    #37575316
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
тогда через глобальный флаг, который в своих событиях отслеживай
...
Рейтинг: 0 / 0
14.12.2011, 14:01
    #37575321
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
Все вышеотписавшиеся проигнорировали этот момент:
И это необязательно пользовательские события.Это может быть событие какой-нибудь асинхронной библиотеки, с UI никак не связанной. XMLHTTP, например.

Shocker.ProДа блин, если разрешить doevents, то будут происходить события, которых быть не должно.Тогда Refresh вместо DoEvents. Refresh гораздо накладнее DoEvents, но можно минимизировать нагрузку на проц, поставив в Sleep промежуток побольше.
...
Рейтинг: 0 / 0
14.12.2011, 14:09
    #37575346
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
Shocker.ProОжидание восстановления связи с сервером ))Как именно определяется факт восстановления связи?
Если, к примеру, изменяется статус контрола в другой форме - то в соотв. методе можно сделать unload этой модальной формы...
...
Рейтинг: 0 / 0
14.12.2011, 14:21
    #37575378
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
Konst_Oneтогда через глобальный флаг, который в своих событиях отслеживайкак я сказал в первом посте - это неудобно, так как обработчиков событий много разных
...
Рейтинг: 0 / 0
14.12.2011, 14:22
    #37575381
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
AntonariyShocker.ProДа блин, если разрешить doevents, то будут происходить события, которых быть не должно.Тогда Refresh вместо DoEvents. Refresh гораздо накладнее DoEvents, но можно минимизировать нагрузку на проц, поставив в Sleep промежуток побольше.Refresh чего?
...
Рейтинг: 0 / 0
14.12.2011, 14:30
    #37575410
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
Akina,

Твой пример не решает мою проблему - стронние события будут выполняться (даже если MsgBox открыть ))
...
Рейтинг: 0 / 0
14.12.2011, 14:36
    #37575424
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
Shocker.ProТвой пример не решает мою проблему - стронние события будут выполнятьсяАх вот что тебе нужно... тут, я боюсь, без API-шного SuspendThread или чего-то аналогичного тебе не обойтись...
...
Рейтинг: 0 / 0
14.12.2011, 14:44
    #37575453
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
Shocker.ProRefresh чего?Модальной формы.
...
Рейтинг: 0 / 0
14.12.2011, 15:13
    #37575520
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
> Автор: Antonariy
> Все вышеотписавшиеся проигнорировали этот момент:
> > И это необязательно пользовательские события.
> Это может быть событие какой-нибудь асинхронной библиотеки, с UI никак не связанной. XMLHTTP, например.

Тогда я бы ввел новую сущность - диспечер обработчиков в котором бы создавал объекты обработки и в случае необходимости
"переназначал" реальные объекты с переменной обработчика на другую объектную переменную которая объявленна без
WithEvent, а саму переменную-обработчик Nothing'ил.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.12.2011, 15:17
    #37575530
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
> Автор: Игорь Горбонос
> ...WithEvent, а саму переменную-обработчик Nothing'ил.

А потом, при необходимости снова возвращал объект переменной-обработчику

P.S. Сори, у меня - руки крюки. Отправил раньше чем дописал :(

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.12.2011, 15:20
    #37575536
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
сам вопрос мне не очень внушает доверия. может что-то стоит пересмотреть в архитектуре самой программы. зачем какое-то модальное окно юзеру, почему не должны работать ассинхронные события неких объектов?
...
Рейтинг: 0 / 0
14.12.2011, 16:53
    #37575874
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
Игорь Горбонос, Konst_One

Не до переделки архитектуры!
Слишком большой объем работы.
Фактически, пытаюсь создать заплатку.

Порвалась связь с сервером - модальная форма занимается переконнектом.
В это время могут срабатывать таймеры, события окончания асинхронных процессов и т.п. Так как они могут тоже обращаться к серверу, а мы и так занимаемся ожиданием связи, надо, чтобы события эти также подвисли в ожидании.

Antonariy

sleep+refresh проблему не решил - окно приложения не обновляется, то есть если я куда-то переключусь, обратно в приложение вернуться не могу
...
Рейтинг: 0 / 0
14.12.2011, 16:59
    #37575892
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
Тогда только второй поток. Основной спит и реконектится, второй развлекает пользователя формочкой "подождите/отмените".
...
Рейтинг: 0 / 0
14.12.2011, 17:09
    #37575924
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
AntonariyТогда только второй потокЯ сам не работал с CreateThread, примеров-то тут полно, вчера читал, но есть негативные отзывы в том числе твои (ща сходу не могу найти). Подойдет он для данной задачи?
...
Рейтинг: 0 / 0
14.12.2011, 20:09
    #37576303
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6: Приостановить выполнение кода приложения
Напрямую нет. Тебе нужно ознакомиться с этим постом, походить по ссылкам там опубликованным и вообще пообщаться с автором. Он является крупнейшим специалистом, не побоюсь этого слова, в мире (не работающим в MS), по внутренностям VB6.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6: Приостановить выполнение кода приложения / 25 сообщений из 45, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]