|
|
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
Antonariy, Честно говоря, нифига не понял. КОСВЕННО из топика вроде бы следует, что без ломания рантайма ничего не выйдет. И в итоге чел пока так и не выложил ломалку. Да и, собственно, зачем мне с ним знакомиться, у меня же вроде задача тривиальней некуда - окошко показать. С другой стороны, народ же вроде как-то делал многопоточность и вроде как-то у него это работало вез взлома рантайма? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2011, 20:42 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
Корректно она работает только в Activex exe без всяких CreateThread. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2011, 12:25 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
Antonariy, Я конечно же читал эту ветку, но сходу сложно было понять, годиться ли там что-то для под мои нужды, опять же Дмитрий любит все усложнять ) Ок, попробую разобрать пример ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2011, 12:54 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
блин, а там довольно много букаф в проекте. я понимаю, что это демонстрация неких возможностей, и прога делает много больше, чем мне требуется. Можно ли тогда в двух словах описать, что делает эта прога (помимо, собственно, визуального эффекта, который я наблюдаю, когда запускаю приложенный скрипт)? Либо (для меня конечно, был бы самый идеальный вариант) помочь реализовать мне, собственно, требуемую задачу, а именно - пока основной поток завис, пытаясь достучаться до сервера и установить соединение, вывести формочку для информирования пользователя, при этом даже если висит выполнение команды Connection.Open (а не Sleep) форма отображается нормально, даже если переключиться в другое приложение и вернуться обратно, чтобы не пугать пользователя якобы зависшей программой. Или, как вариант, запустить установку соединения в другом потоке (если возможно потом передать установленное соединение в основную прогу), а сама прога уже будет общаться с пользователем и просить его подождать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2011, 00:32 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
ЗЫ: в примере даже не очень понял, где возникает демонстрация многопоточности. То ли создание самого объекта из скрипта уже запуускает асинхронный поток, то ли внутри активикса создаются потоки, но тогда какое отношение это имеет к StandardEXE и почему это не может быть реализовано в таком проекте... и зачем внутри проекта он создает экземпляр самого себя и можно ли эту часть отделить и вынести в StandardExe... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2011, 00:43 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
Демонстрация многопоточности происходит в момент нажатия кнопки. Создаются десять потоков, которые делают Sleep. Несмотря на Sleep интерфейс не блокируется, можно свободно гулять по листбоксам. CreateObject нужен для создания объекта в новом потоке, при New объект создастся в основном потоке. vbs-файл нужен для отладки, после запуска ide ждет, пока кто-нибудь не создаст отлаживаемый объект. но тогда какое отношение это имеет к StandardEXE и почему это не может быть реализовано в таком проектеЭто данность, так работает рантайм vb6 и это было сделано специально. и зачем внутри проекта он создает экземпляр самого себяЭто уже привычка, создавать единственный глобальный объект. При запуске exe-файла проверяется наличие этого объекта в памяти и делается выход, если он есть. В данном примере это может и не надо, но я решил пойти проверенным путем. можно ли эту часть отделить и вынести в StandardExeНет, изменение типа проекта обязательно. В этом нет ничего страшного) помочь реализовать мне, собственно, требуемую задачуНе вопрос, но мне нужен пример, который приблизительно отражал бы твою архитектуру, и который ты мог бы перенести обратно. Обещаю, он почти не пострадает, только обрастет свистелками)) Или, как вариант, запустить установку соединения в другом потоке (если возможно потом передать установленное соединение в основную прогу), а сама прога уже будет общаться с пользователем и просить его подождать.Мне без разницы, но как быть с непользовательскими событиями в основном потоке, которые не заморозятся? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2011, 01:24 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
Antonariyно мне нужен примерА хотя не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2011, 01:39 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
AntonariyВ данном примере это может и не надоНадо. Я забыл, новый поток создается независимым, все глобальные переменные у него свои собственные, поэтому поиметь информацию о наличии основного потока можно только таким способом. Плюс, можно получить из него любую информацию через методы класса, если он не спит, конечно. А вот и пример: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2011, 02:42 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
Пардон, изменения не сохранил. Вот нормальный: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2011, 02:49 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
Antonariy, Что-то я догнать не могу, как применить пример к собственным нуждам, то бишь к проекту StandardExe. То есть мне нужно перенести к себе то, что делает Form1? Или просто создать объект CreateObject "sleeper.alarm". В первом случае ты вроде говорил, что не прокатит, во втором - неясен смысл, ведь после CreateObject основная программа продолжит свою работу. И не пойму, куда мне вставить свой цикл (условно говоря пока Do Until 1 = 2: Loop), который будет крутить основной поток. И, кстати, при запуске примера получается, что переключиться на Form1 все равно не получается, он висит, а я как раз хотел избежать этого, полагая, что окно второго потока будет показываться при попытке переключения на первый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2011, 14:46 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
Вот сейчас ты мне ЦЭ напоминаешь, ей-богу. Но возникает ситуация, когда требуется, чтобы вся прога приостановила свою работу, не выполнялся никакой код, до определенного момента. Я запускаю модальную форму, в этой форме работает цикл.Никакой код включает в себя "переключиться на Form1", потому что Form1 должна получить событие от мыши, а оконная процедура не выполняется. а я как раз хотел избежать этого, полагая, что окно второго потока будет показываться при попытке переключения на первыйНевозможно показать новое окно модально окну из другого потока. Если это нужно только для того, чтобы пользователь не прибил "зависшее" приложение через окошко "приложение не отвечает", то можно основное окно просто прятать перед созданием потока. Или можно имитировать модальность, если свистелки важнее здравого смысла: 1) Сделать скриншот основного окна 2) Натянуть его на еще одну форму из второго потока 3) Отобразить ее поверх окна основного потока 4) Спрятать основное окно 5) Отобразить форму ожидания модально форме-скриншоту. 6) Заснуть, ожидая сигнала от второго потока. Что-то я догнать не могу, как применить пример к собственным нуждам, то бишь к проекту StandardExe.Либо сделать этот свой проект ActiveX, либо сделать отдельную программу ActiveX exe, которая и будет (теперь уже в отдельном процессе, а не потоке) делать что там тебе надо. Я бы изменил тип проекта вместо того, чтобы таскать второй файл, который обязательно когда-нибудь на какой-нибудь машине окажется не той версии, что надо. И не пойму, куда мне вставить свой циклВ корзину для мусора, апи WaitForSingleObject вместо него, она как раз для межпоточного взаимодействия предназначена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2011, 16:02 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
AntonariyВот сейчас ты мне ЦЭ напоминаешь, ей-богу.сам себе напоминаю, ужас, но я, по крайней мере пытаюсь хотя разобрать написанное )))AntonariyИ не пойму, куда мне вставить свой циклВ корзину для мусора,так, блин, речь то о том, что основной поток не просто должен бездельничать, а делать цикл попыток установки связи с сервером, а как он его будет делать, если заклинится на WaitForSingleObject. AntonariyНикакой код включает в себя "переключиться на Form1", потому что Form1 должна получить событие от мыши, а оконная процедура не выполняется.так получается, что это не решает основную задачу - показывать пользователю что-то при попытке переключиться на приложение Antonariyпрятать перед созданием потока. Или можно имитировать модальностьтак мне это тоже пришло в голову. Причем пользователь обойдется без скриншота, я спрячу от него основное окно, покажу ему формочку "подождите", у которой будет то же название и та же иконка, сойдет, думаю. Но тогда зачем организовывать все эти потоки, если я могу просто с помощью CreateObject создать объект, который мне выведет форму на экран... или я опять чего-то не продумал? AntonariyЛибо сделать этот свой проект ActiveXЯ просто не знаю, чем это чревато. Там же куча всякого понаписана, не возникнет ли где глюк какой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2011, 16:25 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
Но тогда зачем организовывать все эти потоки, если я могу просто с помощью CreateObject создать объект, который мне выведет форму на экран... ... и эта форма зависнет, когда заработает цикл. Поток будет занят циклом, а не еще одной оконной процедурой. Давай тогда текст цикла. Если в нем есть отсылки к своим процедурам, устанавливающим соединения, их текст тоже. Я на 99% уверен, что их можно устанавливать асинхронно в другом потоке/процессе, не нагружая процессор циклами. Я просто не знаю, чем это чревато. Там же куча всякого понаписана, не возникнет ли где глюк какой?Потерянными 20ю минутами, код для проверки модифицировать скорее всего не придется. В свойствах проекта в первой закладке поставить галку Thread Per Object, в четвертой StartMode - Stand Alone, это позволит обойтись без vbs-скрипта для отладки. Все контролы и классы (за исключением какого-нибудь одного попроще, должен быть хотя бы один public multiuse) сделать приватными, нефиг без пользы унавоживать реестр. Далее удовлетворять IDE пока она не соизволит скомпилировать. Запустить exe, я на 99% уверен, что будет работать штатно, и лишь при выходе может остаться в памяти. Это система сама создаст экземпляр публичного класса, поэтому я контролирую такие вещи в sub main. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2011, 17:22 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
Antonariyи эта форма зависнет, когда заработает цикл. Поток будет занят циклом, а не еще одной оконной процедурой.дык, не зависает. я ща экспериментирую так (код в StandardExe): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. SVAOuter.Host - это ActiveX.exe. В классе Host две строки - показ формы при инициализации класса и выгрузка ее при терминировании класса AntonariyДавай тогда текст цикла. Если в нем есть отсылки к своим процедурам, устанавливающим соединения, их текст тоже. Я на 99% уверен, что их можно устанавливать асинхронно в другом потоке/процессе, не нагружая процессор циклами.Да, собственно, внутри цикла единственная команда - ADODB.Connection.Open, если ошибка, цикл повторяется. Проблема соединения в 99% случаем связана с потерей связи с сервером (отключение интернета или туннеля на удаленных машинах, выпадание пачкорда из розетки с помощью уборщицы и т.п.), поэтому Open зависает надолго. Соединение устанавливается с MSSQL, протокол - TCP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2011, 17:45 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
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. 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. Формочки добавь по вкусу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2011, 19:22 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
Отлично, если не сложно, подскажи, что с дистрибуцией ActiveX.Exe? Из того, что я нарыл - что мол он сам регистрируется при первом запуске. То есть как бы мне не попасть при смене версий (допустим, я даже не сохраню преемственность в какой-то из версий SVAOuter) - мне надо просто запустить exe-шник разок из основного проекта, который в свою очередь должен впустую отработать Sub Main? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2011, 23:57 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
Насчет регистрации при запуске, все так и есть. Насчет версий, используй позднее связывание и тогда проблемы будут лишь в том случае, если изменится название проекта, класса или одного из членов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2011, 10:18 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
Antonariy, Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2011, 10:35 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
Antonariy, Так сказать, "крик души"Меня вот всегда удивляло, почему 99,99% людей, с упорством, достойным лучшего применения, ломятся написать у себя в коде CreateThread(), кивая, в лучшем случае, на Эпплмана (несмотря на то, что он сам написал после выхода SP2 или SP3 к VB5 - "всё, баста, run-time изменился, так больше работать не будет"), вместо того, чтобы почитать официальную документацию к продукту, найти (впервые появившийся в MSDN Library году эдак в 1997, ещё до выхода VB6) официальный пример "ThreadDemo" , найти пример "Coffee", почитать главу "Asynchronous Call-Backs and Events" и соседние главы - ведь это относится к Visual Basic Concepts, "всего лишь" к концепциям применения продукта. Хотя бы это сделать. Мэтью Кёрланда почитать, если хочется большего. Но нет. Фиг вам. Сами с усами. Будем обламываться и хаять продукт и производителя. Я вот устал на эту тему общаться. Может, у тебя сил больше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2011, 13:23 |
|
||
|
VB6: Приостановить выполнение кода приложения
|
|||
|---|---|---|---|
|
#18+
БенедиктМеня вот всегда удивляло, почему БенедиктЯ вот устал на эту тему общаться. Может, у тебя сил больше?А смысл тратить на это силы? Исход известен: либо поциент, разбив лоб об непрошибаемое, таки сделает как положено, либо заявит, что оно ему не надо, и бросит. Если этот поц под моей ответственностью, то нужное направление ему будет задано в директивном виде. Проблема на самом деле не в технике, а страхе перед "новым" и "неизвестным" — вдруг ВСЁ перестанет работать????77 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2011, 14:01 |
|
||
|
|

start [/forum/topic.php?fid=60&gotonew=1&tid=2158216]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
12ms |
get first new msg: |
7ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 163ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...