powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6: Приостановить выполнение кода приложения
20 сообщений из 45, страница 2 из 2
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
20 сообщений из 45, страница 2 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6: Приостановить выполнение кода приложения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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