powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Progress bar
37 сообщений из 37, показаны все 2 страниц
Progress bar
    #38892573
Intension
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Столкнулся с небольшой проблемой.
Есть база access которая запускает большое количество процедур на сервере после нажатия на кнопку.
Хотел сделать примитивный progress bar что бы было понимание на каком степе сейчас идет обработка (что бы было понимание сколько еще примерно осталось времени, так как суммарное время отработки занимает до 2х часов, а количество вовлеченных процедур около 30 штук).
Сделал новую форму, которая открывается после запуска основной процедуры, на всю форму растянуто текстовой поле куда постятся логи по мере выполнения процедур.
На этом вроде как все ОК, проблемы нет, система работает.

Проблема начинает возникать в тот момент когда access благополучно зависает (not responding), и естественно, в этот момент форма перестает обновляться, и все изменения отображаются разом после того как весь процесс отработал.

Как я только не пытался это обойти, и вешал таймер в самом коде между запусками процедур:


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private sub main
CurrentDb.Execute "proc_1"
Forms!Progressbar.Text0 = status_
Forms!Progressbar.Refresh
Sleep 5000
CurrentDb.Execute "proc_2"
End sub



И через me.TimerIterval


Код: vbnet
1.
2.
3.
Private Sub Form_Timer()
Form_Progressbar.Refresh
End Sub



Ничего из этого мне не помогло.

Пытался даже начать отображать логи в cmd или powershell

Код: vbnet
1.
process_id = SHELL("C:\windows\system32\powershell.exe", vbNormalFocus)


Но тут столкнулся с другой проблемой, как первоначально передать набор команд в cmd я понимаю и знаю, а вот как дальше работать с созданной cmd зная ее PID я не понимаю.

Надеюсь у вас есть идеи как с этим можно справиться.

Как самый "костыльный" вариант, можно начать постить результат транзакций в отдельной таблице, создавать через объект отдельную сессия экселя, делать внутри него подключение к данной таблице и принудительно рефрешить таблицу, но мне этот вариант как то совсем не нравится.
Заранее спасибо за помощь и варианты.
...
Рейтинг: 0 / 0
Progress bar
    #38892587
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите Do Events.
...
Рейтинг: 0 / 0
Progress bar
    #38896590
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1244тады лучче поднять чо-нить на авиТак, для примеру... Размятся...
ЗЫ. На полное авторство не претендую. Использован код и идеи других мемберов форума sql.ru
...
Рейтинг: 0 / 0
Progress bar
    #39100741
Casper2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Панург,

Пытался применить данный код с тяжелыми SQL запросами. Картинка появляется, но зависает и не шевелиться до тех пор пока не отработает запрос.
...
Рейтинг: 0 / 0
Progress bar
    #39100751
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__MichelleПосмотрите Do Events.
Поддерживаю.
...
Рейтинг: 0 / 0
Progress bar
    #39100768
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Casper2002,

для запросов было ещё такое решение :)
http://am.rusimport.ru/MSAccess/topic.aspx?ID=433
...
Рейтинг: 0 / 0
Progress bar
    #39100916
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Casper2002Панург,

Пытался применить данный код с тяжелыми SQL запросами. Картинка появляется, но зависает и не шевелиться до тех пор пока не отработает запрос.Выше правильно отметили про DoEvents . Ещё добавлю - когда выполняется запрос нужно чтобы VBA IDE была закрыта !
Ну и пример с открытием запроса на 10 000 000 записей. Можно и больше, ждать долго.
...
Рейтинг: 0 / 0
Progress bar
    #39100922
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimport,

Такой вариант очень увеличивает время открытия запроса.
...
Рейтинг: 0 / 0
Progress bar
    #39100963
Casper2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Панург Ну и пример с открытием запроса на 10 000 000 записей. Можно и больше, ждать долго.

Точно также появляется рисунок и зависает... (Office 2010)
...
Рейтинг: 0 / 0
Progress bar
    #39100979
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Casper2002, не, не тестировал. Увы, один поток. Возможно и есть способ решения, но пока некогда его искать.
...
Рейтинг: 0 / 0
Progress bar
    #39101063
А так?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А так?
...
Рейтинг: 0 / 0
Progress bar
    #39101077
Casper2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тоже самое...
...
Рейтинг: 0 / 0
Progress bar
    #39101304
Тогда так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Casper2002Тоже самое...
...
Рейтинг: 0 / 0
Progress bar
    #39101611
Casper2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь анимация заработала, но вылез другой баг. Теперь окошечко с анимацией отвязана от экрана MS Access и при передвижении окна остается на том же месте.
...
Рейтинг: 0 / 0
Progress bar
    #39101635
\\\\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Casper2002, а ты не двигай окно приложения
...
Рейтинг: 0 / 0
Progress bar
    #39101666
Casper2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В любом случае это мега прогресс (то есть успех :) ) как для MS Access-а.

Только пока непонятно как можно преобразовать новый код для общего использования вида:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub cmdPushMe_Click()
ProgressBar True

...
мой код
...

ProgressBar False
End Sub



Где ProgressBar - процедура вкл/вык прогресс бара.
...
Рейтинг: 0 / 0
Progress bar
    #39101672
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Casper2002,

А где ТС?
...
Рейтинг: 0 / 0
Progress bar
    #39102047
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Casper2002,
для DAO можно, наверное, ещё так попробовать :)
...
Рейтинг: 0 / 0
Progress bar
    #39102307
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Casper2002, вот что делает коллективный разум!
Суммируя и внося коррективы получил так (см. пример)
...
Рейтинг: 0 / 0
Progress bar
    #39102397
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург, а можно сделать, чтобы прогрессбар крутился внутри формы frmTest? В смысле так наложить frmWait на frmTest? И ещё. сделать у AVI прозрачный фон. Или это не возможно Тогда может вместо AVI использовать GIF? У него фон можно сделать прозрачным. Смотрелось бы просто здорово.
...
Рейтинг: 0 / 0
Progress bar
    #39102521
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jossа можно сделать, чтобы прогрессбар крутился внутри формы frmTest?Можно сам контрол создать прямо на форме. Ну или отцентрировать форму по форме. В последнем примере форма центрируется относительно окна Access.
JossИ ещё. сделать у AVI прозрачный фон.Хм. А у меня AVI везде получается полупрозрачный... Вместе с формой.
...
Рейтинг: 0 / 0
Progress bar
    #39102523
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПанургХм. А у меня AVI везде получается полупрозрачный... Вместе с формой.Проверено на Win Xp SP3 и Win7, Access XP, Access XP RunTime, Access 2010.
...
Рейтинг: 0 / 0
Progress bar
    #39102636
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПанургПанургХм. А у меня AVI везде получается полупрозрачный... Вместе с формой.Проверено на Win Xp SP3 и Win7, Access XP, Access XP RunTime, Access 2010.Это понятно. Прозрачность Вы задаёте для формы.

Поясняю свою хотелку.
Есть у немя длинные операции. Например, некоторые расчёты, копирование базы, ну и создание архива. Пользователей нервирует отсутствие сообщений на экране. Висит форма "Идёт процесс". Хотелось бы к этой форме прицепить вывод авишки.
Где-нибудь рядом с надписью.
Неплохо бы смотрелась авишка в качестве бегущего индикатора, как при загрузке Windows XP.

А на счёт GIF Вы не задумывались?
...
Рейтинг: 0 / 0
Progress bar
    #39102655
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss, а тут мало от меня зависит. Это стандартный контрол существующий с Win95. У тебя же есть пример с ним Описание элементов управления ActiveX (21 элемент) , там смотри Animation . Только не цепляем библиотек и рисуем в реальном времени.
AVI можно засунуть любую или эту подкорректировать.
...
Рейтинг: 0 / 0
Progress bar
    #39102983
Casper2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Панург,
Уже лучше но пока еще 2. То есть не до конца то что хотелось бы. :)
Мне нужно чтобы когда запускались мои процедуры/запросы анимация не зависала.
В основном зависания происходят на выполнении кода вида CurrentDb.Execute... Я так понимаю нужно как-то использовать DoEvents/WithEvents но пока не понял как это сделать...
...
Рейтинг: 0 / 0
Progress bar
    #39103036
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПанургJoss, а тут мало от меня зависит. Это стандартный контрол существующий с Win95. У тебя же есть пример с ним Описание элементов управления ActiveX (21 элемент) , там смотри Animation . Только не цепляем библиотек и рисуем в реальном времени.
AVI можно засунуть любую или эту подкорректировать.Ясно. А я когда-то для GIF начинал делать. Но не доделал. Где-то лежит. Брал Gif , раскладывал на кадры, а потом через таймер выводил в элемент Image. Даже что-то получалось.
...
Рейтинг: 0 / 0
Progress bar
    #39103110
Casper2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильное решение - использование многопоточности, но это в свою очередь ведет к другим проблемам... :) ( Потоки в Visual Basic )
...
Рейтинг: 0 / 0
Progress bar
    #39103143
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Casper2002, у меня всё работает без многопоточности
...
Рейтинг: 0 / 0
Progress bar
    #39103146
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss, где то я видел твою попытку, давненько уже...
...
Рейтинг: 0 / 0
Progress bar
    #39105554
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То Панург, у меня в задаче есть несколько мест с длительными вычислениями. Хотел туда пристроить этот прорессбар, но не удалось.
Там где происходит копирование базы (3-5 минут) там всё крутится. А вот где расчёты, там выводится только первый кадр avi и всё. Больше ничего не меняется. картинка висит без изменений. Потом, по окончанию рассчёта - исчезает.

Вот такие вот пироги.
...
Рейтинг: 0 / 0
Progress bar
    #39105590
А так?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
Option Compare Database
Option Explicit

Private WithEvents con As ADODB.Connection
Private Steps%

Private Sub Form_Load()
    Set con = CurrentProject.Connection
End Sub

Private Sub Form_Close()
    Set con = Nothing
    wait_avi.fWait.EndWait
End Sub

Private Sub cmdPushMe_Click()
    Steps = 1
    con.BeginTrans
    DoIt Steps
End Sub

Private Sub DoIt(n%)
    Dim s$
    Select Case n
    Case 1
    s = "select * into t from q"
    Case 2
    s = "update t set n=n + 1000"
    Case 3
    s = "delete from t"
    Case 4
    s = "drop table t"
    Case Else
        con.CommitTrans
        Exit Sub
    End Select
    Me.Info = "step " & n
    con.Execute s, , adAsyncExecute
End Sub

Private Sub con_WillExecute(Source As String, CursorType As ADODB.CursorTypeEnum, LockType As ADODB.LockTypeEnum, Options As Long, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
    'Запуск AVI
    wait_avi.fWait.StartWait
    DoEvents
End Sub

Private Sub con_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
    'Стоп AVI
    wait_avi.fWait.EndWait
    
    If Not pError Is Nothing Then
          con.RollbackTrans
          MsgBox pError.Description, vbCritical, ""
          Exit Sub
    End If
    
    DoEvents
    Steps = Steps + 1
    DoIt Steps
End Sub

...
Рейтинг: 0 / 0
Progress bar
    #39105655
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаете после каждого выполненного запроса выводить индикатор? Только там у меня в расчёте более полусотни исполняемых запросов и лепить после каждого вызов индикатора неохота. Хотелось бы запустить форму с индикатором перед запуском расчёта, а по окончанию закрыть. Но не получается.

Разве что многопоточность, но тут я плаваю...
...
Рейтинг: 0 / 0
Progress bar
    #39105704
JossПредлагаете после каждого выполненного запроса выводить индикатор? .
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
Option Compare Database
Option Explicit

Private WithEvents con As ADODB.Connection
Private Steps%

Private Sub Form_Load()
    Set con = CurrentProject.Connection
End Sub

Private Sub Form_Close()
    Set con = Nothing
    wait_avi.fWait.EndWait
End Sub

Private Sub cmdPushMe_Click()
    Steps = 1
    con.BeginTrans
    wait_avi.fWait.StartWait
    DoIt Steps
End Sub

Private Sub DoIt(n%)
    Dim s$
    Select Case n
    Case 1
    s = "select * into t from q"
    Case 2
    s = "update t set n=n + 1000"
    Case 3
    s = "delete from t"
    Case 4
    s = "drop table t"
    Case Else
        con.CommitTrans
        wait_avi.fWait.EndWait
        Exit Sub
    End Select
    Me.Info = "step " & n
    con.Execute s, , adAsyncExecute
End Sub

Private Sub con_WillExecute(Source As String, CursorType As ADODB.CursorTypeEnum, LockType As ADODB.LockTypeEnum, Options As Long, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
    'Старт AVI
    'wait_avi.fWait.StartWait
    DoEvents
End Sub

Private Sub con_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
    'Стоп AVI
    'wait_avi.fWait.EndWait
    
    If Not pError Is Nothing Then
          con.RollbackTrans
          MsgBox pError.Description, vbCritical, ""
          Exit Sub
    End If
    
    DoEvents
    Steps = Steps + 1
    DoIt Steps
End Sub

...
Рейтинг: 0 / 0
Progress bar
    #39105727
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А куда вставлять con_WillExecute() и con_ExecuteComplete(()?

Некоторые запросы у меня выполняются в момент, а некоторые 2-3 минуты.
...
Рейтинг: 0 / 0
Progress bar
    #39106118
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JossТо Панург, у меня в задаче есть несколько мест с длительными вычислениями. Хотел туда пристроить этот прорессбар, но не удалось.
Там где происходит копирование базы (3-5 минут) там всё крутится. А вот где расчёты, там выводится только первый кадр avi и всё. Больше ничего не меняется. картинка висит без изменений. Потом, по окончанию рассчёта - исчезает.

Вот такие вот пироги.

А если вынести прогрессбар в отдельную базу и как то так (см.пример) ?
...
Рейтинг: 0 / 0
Progress bar
    #39106310
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimport, Мысль интересная. Но уж больно не хочется создавать под это специальные базы. Начинаются вопросы об их позиционировании на экране. Правда это можно обойти развернув Access во весь экран. Бум думать и пробовать.
...
Рейтинг: 0 / 0
Progress bar
    #39107418
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimport, покрутил, попробовал. В моём случае не подходит. У нас пользователи открывают сразу несколько задач и переключаются между ними. И в этом случае непривязанный к конкретному окну Access индикатор будет cмущать.
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Progress bar
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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