powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6: Приостановить выполнение кода приложения
45 сообщений из 45, показаны все 2 страниц
VB6: Приостановить выполнение кода приложения
    #37575006
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, задачка архитектурного характера

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

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

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

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

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

Ы?

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

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

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

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

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

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

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

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

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

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

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

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

Antonariy

sleep+refresh проблему не решил - окно приложения не обновляется, то есть если я куда-то переключусь, обратно в приложение вернуться не могу
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37575892
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда только второй поток. Основной спит и реконектится, второй развлекает пользователя формочкой "подождите/отмените".
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37575924
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyТогда только второй потокЯ сам не работал с CreateThread, примеров-то тут полно, вчера читал, но есть негативные отзывы в том числе твои (ща сходу не могу найти). Подойдет он для данной задачи?
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37576303
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напрямую нет. Тебе нужно ознакомиться с этим постом, походить по ссылкам там опубликованным и вообще пообщаться с автором. Он является крупнейшим специалистом, не побоюсь этого слова, в мире (не работающим в MS), по внутренностям VB6.
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37580599
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Честно говоря, нифига не понял.
КОСВЕННО из топика вроде бы следует, что без ломания рантайма ничего не выйдет. И в итоге чел пока так и не выложил ломалку. Да и, собственно, зачем мне с ним знакомиться, у меня же вроде задача тривиальней некуда - окошко показать.

С другой стороны, народ же вроде как-то делал многопоточность и вроде как-то у него это работало вез взлома рантайма?
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37581013
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Корректно она работает только в Activex exe без всяких CreateThread.
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37581034
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Я конечно же читал эту ветку, но сходу сложно было понять, годиться ли там что-то для под мои нужды, опять же Дмитрий любит все усложнять )
Ок, попробую разобрать пример
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37581453
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, а там довольно много букаф в проекте.
я понимаю, что это демонстрация неких возможностей, и прога делает много больше, чем мне требуется.

Можно ли тогда в двух словах описать, что делает эта прога (помимо, собственно, визуального эффекта, который я наблюдаю, когда запускаю приложенный скрипт)?

Либо (для меня конечно, был бы самый идеальный вариант) помочь реализовать мне, собственно, требуемую задачу, а именно - пока основной поток завис, пытаясь достучаться до сервера и установить соединение, вывести формочку для информирования пользователя, при этом даже если висит выполнение команды Connection.Open (а не Sleep) форма отображается нормально, даже если переключиться в другое приложение и вернуться обратно, чтобы не пугать пользователя якобы зависшей программой. Или, как вариант, запустить установку соединения в другом потоке (если возможно потом передать установленное соединение в основную прогу), а сама прога уже будет общаться с пользователем и просить его подождать.
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37581464
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ: в примере даже не очень понял, где возникает демонстрация многопоточности. То ли создание самого объекта из скрипта уже запуускает асинхронный поток, то ли внутри активикса создаются потоки, но тогда какое отношение это имеет к StandardEXE и почему это не может быть реализовано в таком проекте... и зачем внутри проекта он создает экземпляр самого себя и можно ли эту часть отделить и вынести в StandardExe...
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37581482
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Демонстрация многопоточности происходит в момент нажатия кнопки. Создаются десять потоков, которые делают Sleep. Несмотря на Sleep интерфейс не блокируется, можно свободно гулять по листбоксам. CreateObject нужен для создания объекта в новом потоке, при New объект создастся в основном потоке. vbs-файл нужен для отладки, после запуска ide ждет, пока кто-нибудь не создаст отлаживаемый объект.

но тогда какое отношение это имеет к StandardEXE и почему это не может быть реализовано в таком проектеЭто данность, так работает рантайм vb6 и это было сделано специально.
и зачем внутри проекта он создает экземпляр самого себяЭто уже привычка, создавать единственный глобальный объект. При запуске exe-файла проверяется наличие этого объекта в памяти и делается выход, если он есть. В данном примере это может и не надо, но я решил пойти проверенным путем.
можно ли эту часть отделить и вынести в StandardExeНет, изменение типа проекта обязательно. В этом нет ничего страшного)

помочь реализовать мне, собственно, требуемую задачуНе вопрос, но мне нужен пример, который приблизительно отражал бы твою архитектуру, и который ты мог бы перенести обратно. Обещаю, он почти не пострадает, только обрастет свистелками))

Или, как вариант, запустить установку соединения в другом потоке (если возможно потом передать установленное соединение в основную прогу), а сама прога уже будет общаться с пользователем и просить его подождать.Мне без разницы, но как быть с непользовательскими событиями в основном потоке, которые не заморозятся?
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37581487
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyно мне нужен примерА хотя не нужен.
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37581504
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyВ данном примере это может и не надоНадо. Я забыл, новый поток создается независимым, все глобальные переменные у него свои собственные, поэтому поиметь информацию о наличии основного потока можно только таким способом. Плюс, можно получить из него любую информацию через методы класса, если он не спит, конечно.

А вот и пример:
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37581505
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, изменения не сохранил. Вот нормальный:
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37581751
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Что-то я догнать не могу, как применить пример к собственным нуждам, то бишь к проекту StandardExe. То есть мне нужно перенести к себе то, что делает Form1? Или просто создать объект CreateObject "sleeper.alarm". В первом случае ты вроде говорил, что не прокатит, во втором - неясен смысл, ведь после CreateObject основная программа продолжит свою работу.

И не пойму, куда мне вставить свой цикл (условно говоря пока Do Until 1 = 2: Loop), который будет крутить основной поток. И, кстати, при запуске примера получается, что переключиться на Form1 все равно не получается, он висит, а я как раз хотел избежать этого, полагая, что окно второго потока будет показываться при попытке переключения на первый.
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37581812
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот сейчас ты мне ЦЭ напоминаешь, ей-богу.

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

а я как раз хотел избежать этого, полагая, что окно второго потока будет показываться при попытке переключения на первыйНевозможно показать новое окно модально окну из другого потока.
Если это нужно только для того, чтобы пользователь не прибил "зависшее" приложение через окошко "приложение не отвечает", то можно основное окно просто прятать перед созданием потока.
Или можно имитировать модальность, если свистелки важнее здравого смысла:
1) Сделать скриншот основного окна
2) Натянуть его на еще одну форму из второго потока
3) Отобразить ее поверх окна основного потока
4) Спрятать основное окно
5) Отобразить форму ожидания модально форме-скриншоту.
6) Заснуть, ожидая сигнала от второго потока.

Что-то я догнать не могу, как применить пример к собственным нуждам, то бишь к проекту StandardExe.Либо сделать этот свой проект ActiveX, либо сделать отдельную программу ActiveX exe, которая и будет (теперь уже в отдельном процессе, а не потоке) делать что там тебе надо.
Я бы изменил тип проекта вместо того, чтобы таскать второй файл, который обязательно когда-нибудь на какой-нибудь машине окажется не той версии, что надо.
И не пойму, куда мне вставить свой циклВ корзину для мусора, апи WaitForSingleObject вместо него, она как раз для межпоточного взаимодействия предназначена.
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37581852
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyВот сейчас ты мне ЦЭ напоминаешь, ей-богу.сам себе напоминаю, ужас, но я, по крайней мере пытаюсь хотя разобрать написанное )))AntonariyИ не пойму, куда мне вставить свой циклВ корзину для мусора,так, блин, речь то о том, что основной поток не просто должен бездельничать, а делать цикл попыток установки связи с сервером, а как он его будет делать, если заклинится на WaitForSingleObject.
AntonariyНикакой код включает в себя "переключиться на Form1", потому что Form1 должна получить событие от мыши, а оконная процедура не выполняется.так получается, что это не решает основную задачу - показывать пользователю что-то при попытке переключиться на приложение
Antonariyпрятать перед созданием потока. Или можно имитировать модальностьтак мне это тоже пришло в голову. Причем пользователь обойдется без скриншота, я спрячу от него основное окно, покажу ему формочку "подождите", у которой будет то же название и та же иконка, сойдет, думаю. Но тогда зачем организовывать все эти потоки, если я могу просто с помощью CreateObject создать объект, который мне выведет форму на экран... или я опять чего-то не продумал?
AntonariyЛибо сделать этот свой проект ActiveXЯ просто не знаю, чем это чревато. Там же куча всякого понаписана, не возникнет ли где глюк какой?
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37581899
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но тогда зачем организовывать все эти потоки, если я могу просто с помощью CreateObject создать объект, который мне выведет форму на экран... ... и эта форма зависнет, когда заработает цикл. Поток будет занят циклом, а не еще одной оконной процедурой.

Давай тогда текст цикла. Если в нем есть отсылки к своим процедурам, устанавливающим соединения, их текст тоже. Я на 99% уверен, что их можно устанавливать асинхронно в другом потоке/процессе, не нагружая процессор циклами.

Я просто не знаю, чем это чревато. Там же куча всякого понаписана, не возникнет ли где глюк какой?Потерянными 20ю минутами, код для проверки модифицировать скорее всего не придется.
В свойствах проекта в первой закладке поставить галку Thread Per Object, в четвертой StartMode - Stand Alone, это позволит обойтись без vbs-скрипта для отладки. Все контролы и классы (за исключением какого-нибудь одного попроще, должен быть хотя бы один public multiuse) сделать приватными, нефиг без пользы унавоживать реестр. Далее удовлетворять IDE пока она не соизволит скомпилировать. Запустить exe, я на 99% уверен, что будет работать штатно, и лишь при выходе может остаться в памяти. Это система сама создаст экземпляр публичного класса, поэтому я контролирую такие вещи в sub main.
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37581912
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyи эта форма зависнет, когда заработает цикл. Поток будет занят циклом, а не еще одной оконной процедурой.дык, не зависает. я ща экспериментирую так (код в StandardExe):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim x As Object, m As Date
m = DateAdd("s", 4, Now)
Set x = CreateObject("SVAOuter.Host")
SY_MainMDI.Visible = False
'Sleep 4000
Do Until Now > m
Loop
SY_MainMDI.Visible = True
Set x = Nothing


SVAOuter.Host - это ActiveX.exe. В классе Host две строки - показ формы при инициализации класса и выгрузка ее при терминировании класса

AntonariyДавай тогда текст цикла. Если в нем есть отсылки к своим процедурам, устанавливающим соединения, их текст тоже. Я на 99% уверен, что их можно устанавливать асинхронно в другом потоке/процессе, не нагружая процессор циклами.Да, собственно, внутри цикла единственная команда - ADODB.Connection.Open, если ошибка, цикл повторяется. Проблема соединения в 99% случаем связана с потерей связи с сервером (отключение интернета или туннеля на удаленных машинах, выпадание пачкорда из розетки с помощью уборщицы и т.п.), поэтому Open зависает надолго. Соединение устанавливается с MSSQL, протокол - TCP.
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37581992
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SVAOuter.Host - это ActiveX.exeОткуда ж мне было знать? Это отдельный процесс, чего ему виснуть?

Да, собственно, внутри цикла единственная команда - ADODB.Connection.Open, если ошибка, цикл повторяется.Вот и отлично, можно не грузить процессор синхронным циклом
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Const INFINITE = &HFFFF      '  Infinite timeout

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Command1_Click()
Dim cnr As SVAOuter.Host
Dim cn As ADODB.Connection
Dim hEvent As Long
    Set cnr = New SVAOuter.Host
    hEvent = cnr.Connect("provider=sqlncli;server=(local);database=qwe;trusted_connection=yes")
    If hEvent > 0 Then
        'Call WaitForSingleObject(hEvent, INFINITE) 
        'Одна проблема: оно будет ждать вечно.
        'При межпроцессном взаимодействии нужно при создании события изменять атрибуты безопасности, это мутная тема
        'Чтобы не морочить голову, возвращаемся к циклу со sleep
        While Not cnr.Connected
            Sleep 100
        Wend
        Set cn = cnr.Connection
    End If
End Sub



SVAOuter.Host:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Option Explicit
Dim WithEvents cn As ADODB.Connection
Dim bConnected As Boolean

Public Function Connect(ByVal sConnString) As Long
    On Error GoTo errh
    Set cn = New ADODB.Connection
    cn.Open sConnString, , , adAsyncConnect
    Connect = 1
errh:
End Function

Public Property Get Connection() As ADODB.Connection
    Set Connection = cn
End Property

Public Property Get Connected() As Boolean
    Connected = bConnected
End Property

Private Sub Class_Terminate()
    Set cn = Nothing
End Sub

Private Sub cn_ConnectComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)
    If adStatus = adStatusOK Then
        bConnected = True
    Else
        'следующая попытка
        cn.Open , , , adAsyncConnect
    End If
    'bConnected = True
End Sub


Формочки добавь по вкусу.
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37582215
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отлично, если не сложно, подскажи, что с дистрибуцией ActiveX.Exe? Из того, что я нарыл - что мол он сам регистрируется при первом запуске. То есть как бы мне не попасть при смене версий (допустим, я даже не сохраню преемственность в какой-то из версий SVAOuter) - мне надо просто запустить exe-шник разок из основного проекта, который в свою очередь должен впустую отработать Sub Main?
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37582519
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет регистрации при запуске, все так и есть. Насчет версий, используй позднее связывание и тогда проблемы будут лишь в том случае, если изменится название проекта, класса или одного из членов.
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37582548
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Спасибо!
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37582919
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Так сказать, "крик души"Меня вот всегда удивляло, почему 99,99% людей, с упорством, достойным лучшего применения, ломятся написать у себя в коде CreateThread(), кивая, в лучшем случае, на Эпплмана (несмотря на то, что он сам написал после выхода SP2 или SP3 к VB5 - "всё, баста, run-time изменился, так больше работать не будет"), вместо того, чтобы почитать официальную документацию к продукту, найти (впервые появившийся в MSDN Library году эдак в 1997, ещё до выхода VB6) официальный пример "ThreadDemo" , найти пример "Coffee", почитать главу "Asynchronous Call-Backs and Events" и соседние главы - ведь это относится к Visual Basic Concepts, "всего лишь" к концепциям применения продукта. Хотя бы это сделать. Мэтью Кёрланда почитать, если хочется большего. Но нет. Фиг вам. Сами с усами. Будем обламываться и хаять продукт и производителя. Я вот устал на эту тему общаться. Может, у тебя сил больше?
...
Рейтинг: 0 / 0
VB6: Приостановить выполнение кода приложения
    #37582997
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БенедиктМеня вот всегда удивляло, почему
Потому данные тобой ссылки не висят на каждом углу, в отличие от устаревшего Эпплмана. Я их вижу в первый раз, как и пример нахождения основного потока. Впрочем, и Эпплмана не читал. Как-то всегда хватало описания функций из MSDN и примеров из PSC. А многопоточность делал без всякой документации и примеров, просто где-то услышав, что ActiveX exe для этого и предназначено.

БенедиктЯ вот устал на эту тему общаться. Может, у тебя сил больше?А смысл тратить на это силы? Исход известен: либо поциент, разбив лоб об непрошибаемое, таки сделает как положено, либо заявит, что оно ему не надо, и бросит. Если этот поц под моей ответственностью, то нужное направление ему будет задано в директивном виде.
Проблема на самом деле не в технике, а страхе перед "новым" и "неизвестным" — вдруг ВСЁ перестанет работать????77
...
Рейтинг: 0 / 0
45 сообщений из 45, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6: Приостановить выполнение кода приложения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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