powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Окно загрузки файла
25 сообщений из 96, страница 2 из 4
Окно загрузки файла
    #36729708
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shamanus

Ты забыл сделать рефреш для лейбла и поставить DoEvents перед каждым выполнением запроса

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36729725
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: Shamanus

Ты забыл сделать рефреш для лейбла и поставить DoEvents перед каждым выполнением запроса



Сделал doevents все заработало. Спасибо Игорь.

а что значит рефреш для лейбла,
разве строка
Код: plaintext
Form1.Label1( 0 ).Caption = Название

не есть рефреш? или должна быть какая то команда типа .update
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36729809
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shamanus
> а что значит рефреш для лейбла,

Код: plaintext
Me.Label1.Refresh


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36730658
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: Shamanus
> а что значит рефреш для лейбла,

Код: plaintext
Me.Label1.Refresh




Игорь спасибо, Вы очень помогли
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36730671
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще AutoRefresh форме поставить
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731398
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
Игорь Горбоноспоставить DoEvents перед каждым выполнением запроса
получается что запрос будет работать в фоне?
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731403
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admИгорь Горбонос,
Игорь Горбоноспоставить DoEvents перед каждым выполнением запроса
получается что запрос будет работать в фоне?
Да.
Только не из-за DoEvents, а из-за асинхронного его запуска.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731408
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
а если обычным запросом разве не будет в фоне?
вы говорили что в 1с grid догружается , а не разом заполняется
это и есть асинхронный метод , или это что то другое?
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731442
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admИгорь Горбонос,
Игорь Горбоноспоставить DoEvents перед каждым выполнением запроса
получается что запрос будет работать в фоне? Что значит в фоне? Собственно выполнятся будет именно запрос, а форма будет болтатся перед глазами в фоне. Это если запрос синхронно выполнять. А DoEvents нужен для отрисовки всего что нужно и больше ни для чего :)
А если запрос выполнять асинхронно, то там другая(событийная) схема работы будет. Собственно ничего сложного, но код будет выглядеть по другому
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731448
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
Игорь ГорбоносЧто значит в фоне?
не будет зависшего окна , пока не выполнится запрос
так как насколько понял DoEvents активным делает окно ,
а запрос делается и не тормозит работу
Игорь ГорбоносА DoEvents нужен для отрисовки всего что нужно и больше ни для чего :)
ну тоже самое про что я сказал выше?
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731461
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admа если обычным запросом разве не будет в фоне?
Что ты понимаешь под фоновым выполнением?
Как правило есть пользовательский интерфейс, который всегда должен быть доступен и откликатся на реакцию пользователя. Для достижения этих требований всякие долгоиграющие вычисления стараются выполнять в отдельном потоке и называют этот отдельный поток - фоновым. Из-за сложностей с реализацией отдельных потоков на VB, да и не только на VB, при долгой первоначальной загрузке программы используют метод называемый SplashScreen. Его суть заключается в следующем: при старте программы показывается обычная форма с красивым рисунком и если нужно с объяснительным текстом. Эта форма и будет имитировать работу, но на самом деле будет фоном для реальных действий, которые выполняются не в фоне, но без видимых последствий. По окончании всех первоначальных загрузок форма прячется и показывается уже окно, с которым будет работать пользователь.

aduka05admвы говорили что в 1с grid догружается , а не разом заполняется
это и есть асинхронный метод , или это что то другое?
Это что-то другое и не асинхронное. Можно сделать свой класс-datasource который будет постепенно получать данные от сервера или читать из файла и грид, присоединенный к объекту этого класса будет отображать полученные данные. А асинхронность это реализация АДО, в 1с врядли используют АДО.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731463
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admне будет зависшего окна , пока не выполнится запрос
так как насколько понял DoEvents активным делает окно ,
а запрос делается и не тормозит работу
Зависшее окно как раз будет, пока будет выполнятся запрос, но т.к. на форме ничего важного нет, это не важно. Именно для этого окно и показывается. А DoEvents всего лишь дает отрисовать новую информацию. И все.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731473
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
Игорь ГорбоносЕго суть заключается в следующем: при старте программы показывается обычная форма с красивым рисунком и если нужно с объяснительным текстом. Эта форма и будет имитировать работу, но на самом деле будет фоном для реальных действий, которые выполняются не в фоне, но без видимых последствий. По окончании всех первоначальных загрузок форма прячется и показывается уже окно, с которым будет работать пользователь.
спасибо , просто я думал запрос в фон отправляется , а оказывается все наоборот
Игорь ГорбоносА DoEvents всего лишь дает отрисовать новую информацию. И все.
просто читал где то что DoEvents передает работу Windows , не совсем понял что имелось ввиду,
щас понял спасибо
только не понятно зачем его ставить перед запросом , а не перед
Код: plaintext
Form1.Label1( 0 ).Caption = Название
короче че то я не понял зачем этот DoEvents
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731477
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admкороче че то я не понял зачем этот DoEvents
уже пишу свои попытки объяснить....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731480
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Адука запутался. Попробую я его еще больше запутать или распутать.

Давай только откажемся от термина "фоном" - это понятие относительное и диалектическое.

Итак. Синхронные действия (обычные для VB). Код выполняется последовательно, друг за другом, если выполняется долгая операция, весь остальной код тупо ждет (даже если это запрос к серверу БД, выполнение которого зависит от сервера, а не от твоей программы). Закончилась одна команда - началась следующая.
События при этом встают в очередь. Любые, кнопки, клавиши, клики, таймер. Если у тебя сработал таймер, событие от него не будет немедленно выполнено, а встанет в очередь и дождется завершения твоего текущего кода.
То есть заканчивается выполнение текущего кода (а это тоже в 99,9 случаев обработка события), начинает выполняться следующие, остальные ждут.
Вот. Это обычный синхронный режим.

А есть такая интересная штука - DoEvents. Она вовсе не вводит асинхронность и многопоточность. Она просто берет и твой текущий код переносит в конец очереди событий. То есть ты делаешь DoEvents, твоя текущая процедура останавливается, начинают выполняться все события, которые ждали своей очереди. Потом управление вернется к твоей процедуре. Если событий в очереди не было - ничего как бы не произойдет.

пока вникай, пишу далее....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731490
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С помощью DoEvents можно сымитировать многопоточность.
К примеру, у тебя прыгает по экрану чертик. Тупо в цикле:
Код: plaintext
1.
2.
3.
While True
  'команда - нарисовать чертика в следующем месте
  'проверить, не нажималась ли кнопка "отмена", если нажималась - выйти из цикла
Wend
В этом случае код зациклится, будет рисовать чертика, но с точки зрения пользователя не будет реагировать ни на какие раздражители, включая закрытие формы. Почему? Потому что события от пользователя ждут, когда закончится твой код, а он не закончится никогда.
Как сделать, чтобы реагировало.
Код: plaintext
1.
2.
3.
4.
While True
  'команда - нарисовать чертика в следующем месте
  DoEvents
  'проверить, не нажималась ли кнопка "отмена", если нажималась - выйти из цикла
Wend
Пока событий нет, цикл крутится, как и крутился. Пользователь нажал на кнопку "отмена" - после очередной прорисовки чертика управление будет передано кнопке "Отмена". Кнопка просто установит флажок (переменную), что она была нажата. Цикл увидит, что кнопка была нажата и завершится.
Кроме того, чертик будет себе прыгать, а пользователь может переключаться на другие формы того же приложения и делать там все, что хочет. Можно даже запустить несколько таких циклов, они все друг другу будут передавить управление и все чертики будут прыгать.

теперь про асинхронность....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731502
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Асинхронное выполнение запроса напоминает работу с таймером. Ты дал команду серверу выполнить запрос (завел таймер), сервер сказал "ок" и пошел думать. Твоя же программа получает управление взад и можешь дальше делать, что хочешь. Обрабатывать нажатия кнопок и т.п. Или рисовать на экране прыгающего чертика.
Когда сервер закончит возиться с твоим запросом (когда у таймера настанет время), он выдаст событие - завершил. Вот для этого и важен в рисовании чертика DoEvents - иначе ты просто не поймаешь событие от ADO, когда твой запрос будет готов.

Но лучше пойти дальше - не рисовать чертика с использование DoEvents, а рисовать его по таймеру. то есть заводишь таймер на 300 мс, и по каждому событию рисуешь новое положение чертика. Тогда у тебя программа вообще не занята ерундой. Она просто сидит в ожидании событий. Пришло событие от таймера - перерисовал чертика. Пришло событие от ADO - начинаем обрабатывать результаты запроса - вот и вся асинхронность.

ЗЫ:
Кстати, я не использую тот метод, пример которого ты нарыл. После того, как я получил от сервера событие, что данные готовы, я начинаю заполнять этими данными сетку. Но в цикле после каждой строки делаю DoEvents. В результате, я совершенно не мешаю пользователю работать с другими формами или контролами на этой же форме, включая возможность вообще отменить заполнение сетки.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731520
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05adm,

И немножко про многопоточность (мультизадачность). С помощью DoEvents ты создаешь псевдомультизадачность (но выглядит она как настоящая). С помощью асинхронного выполнения запроса - уже реальная мультизадачность. Кроме того, не очень сложно запустить в VB второй поток, и параллельно выполнять два своих кода.

Самый большой гемор - это синхронизация и изоляция потоков. Это жуткая головная боль. Хорошо сделанных многопоточных программ очень мало (могу привести в пример The Bat! - там реально отрисовка письма, проверка почты, проверка антиспамом, пересчет и индексирование папок идет независимо и при этом не глючит - это дает пользователю нормально работать, а не ждать, пока закончится какая-то операция).

В чем головная боль: вот к примеру ты сейчас организуешь, что твой пользователь может что-то делать, пока выполняется запрос. А если он пойдет, откроет еще одну форму и запустит на выполнение еще один запрос. А не выполнится ли он в том же комманде (тогда первый запрос может оказаться сброшенным). А не перепрограммирует он какие-то глобальные переменные, которые еще понадобятся первому запросу. В конце-концов, а не закроет ли пользователь форму, которая ожидает, когда закончит работать запрос? А то, если он закроет форму, а после этого придет событие от ADO - форма может загрузиться обратно без твоего желания :). То есть надо предусмотреть отмену выполнения запроса, если пользователь закрыл форму. А не может ли пользователь поменять какие-то контролы на форме, пока выполняется запрос, что окажется критичным при получении данных. А не запустит ли пользователь запрос повторно... В общем головной боли с этой многопоточностью хватает....
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731522
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Shocker.ProВ результате, я совершенно не мешаю пользователю работать с другими формами или контролами на этой же форме, включая возможность вообще отменить заполнение сетки.
то есть у вас здесь также как в цикле с чертиком , если наступает событие то передается управление пользователю?
если стоит DoEvents перед строкой кода то, она помещается в конец очереди
как например
Код: plaintext
1.
2.
DoEvents
запрос
то есть мы можем далее работать с формой
Код: plaintext
Form1.Label1( 0 ).Caption = Название
только вот еще вопрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DoEvents
запрос1
Form1.Label1.Caption = Заполняем GRID1
DoEvents
запрос2
Form1.Label1.Caption = Заполняем GRID2
......
DoEvents
запрос n
Form1.Label1.Caption = Заполняем GRID n
здесь как это все будет работать
здесь все лэйблы будут поочереди срабатывать, пока запросы очереди ждут?
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731526
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Shocker.ProВ чем головная боль: вот к примеру ты сейчас организуешь, что твой пользователь может что-то делать, пока выполняется запрос. А если он пойдет, откроет еще одну форму и запустит на выполнение еще один запрос. А не выполнится ли он в том же комманде (тогда первый запрос может оказаться сброшенным). А не перепрограммирует он какие-то глобальные переменные, которые еще понадобятся первому запросу. В конце-концов, а не закроет ли пользователь форму, которая ожидает, когда закончит работать запрос? А то, если он закроет форму, а после этого придет событие от ADO - форма может загрузиться обратно без твоего желания :). То есть надо предусмотреть отмену выполнения запроса, если пользователь закрыл форму. А не может ли пользователь поменять какие-то контролы на форме, пока выполняется запрос, что окажется критичным при получении данных. А не запустит ли пользователь запрос повторно... В общем головной боли с этой многопоточностью хватает....
читал где-то люди тоже говорили , что его надо использовать осторожно)))
но и без этого тоже трудно наверно , хотя можно вешать progressbar пусть пользователь ждет))
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731538
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05adm
только вот еще вопрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DoEvents
запрос1
Form1.Label1.Caption = Заполняем GRID1
DoEvents
запрос2
Form1.Label1.Caption = Заполняем GRID2
......
DoEvents
запрос n
Form1.Label1.Caption = Заполняем GRID n
здесь как это все будет работать
здесь все лэйблы будут поочереди срабатывать, пока запросы очереди ждут?
Ща почитал повнимательней, о чем вы переписывались с Игорем....
Там DoEvents не служит никакой асинхронности и лучше его, наверное, не использовать...
просто после каждого
Form1.Label1.Caption =
поставить
Form1.Label1.Refresh или Form1.Refresh
Просто, как правило, отрисовка экрана не происходит, пока не закончатся все события в очереди или кто-нить не даст DoEvents или Refresh. Но так как имеет другие побочные эффекты, можно обойтись Refresh для ясности.

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

aduka05admесли стоит DoEvents перед строкой кода то, она помещается в конец очереди
как например
Код: plaintext
1.
2.
DoEvents
запрос
то есть мы можем далее работать с формой
Код: plaintext
Form1.Label1( 0 ).Caption = Название


Нет, недоразобрался ты....
Не строка, которая следует за DoEvents помещается в конец очереди, а вся твоя процедура. То есть последовательность выполнения строк в твоей процедуре никак измениться не может.
Будут выполняться другие события, но не код твоей процедуры. До тех пор, пока другие события не закончатся.
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731546
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
спасибо большое , еще вопрос задать хотел
в этой процедуре я заношу данные в две таблицы
код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
FlexGridPlus4.FixedRows =  0 
strsql = "insert into documents (name) values ('" + Text1.Text + "')"
query strsql
strsql = "Select * from documents"
query strsql
rs.MoveLast
naklnum = rs.Fields("id")
strsql = ""
'Debug.Print "массив цена " & massprice(FlexGridPlus4.TextMatrix(1, 4)) & " usluga_id " & FlexGridPlus4.TextMatrix(1, 4) _
'& " amount " & Str(FlexGridPlus4.TextMatrix(1, 2))
For i =  1  To FlexGridPlus4.Rows -  1 
strsql = "insert into registr (doc_id,client_id, usluga_id, price , amount,date, time) values " _
+ "(" + Str(naklnum) + "," + Str(Combo1.ItemData(Combo1.ListIndex)) + "," + Str(FlexGridPlus4.TextMatrix( 1 ,  4 )) + "," _
 + Str(massprice(FlexGridPlus4.TextMatrix( 1 ,  4 ))) + "," + Str(FlexGridPlus4.TextMatrix( 1 ,  2 )) + "," + _
 "'" + Text2.Text + "'" + "," + "'" + Text3.Text + "')"
Debug.Print strsql
query strsql
FlexGridPlus4.RemoveItem  1 
Next i
Debug.Print strsql
FlexGridPlus4.Rows = FlexGridPlus4.Rows +  1 
FlexGridPlus4.FixedRows =  1 
Set rs = Nothing
Combo2.Visible = False

так вот может быть ситуация что какой сбой и в первую таблицу данные занеслись
а во вторую нет (как вы сами такое реализуете )?
то есть хочется все или ничего (транзакция называется по мойму)
но как это на VB реализуется
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731549
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05adm
так вот может быть ситуация что какой сбой и в первую таблицу данные занеслись
а во вторую нет (как вы сами такое реализуете )?
то есть хочется все или ничего (транзакция называется по мойму)
но как это на VB реализуется
Напомни, какой СУБД ты пользуешься?
...
Рейтинг: 0 / 0
Окно загрузки файла
    #36731551
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
все понял поэтому Shamanus говорил что у него никаких процедур
Shamanusв коде формы 1 никаких процедур нет
только еще вопрос
ИгорьТы забыл сделать рефреш для лейбла и поставить DoEvents перед каждым выполнением запроса

Shocker.ProТам DoEvents не служит никакой асинхронности и лучше его, наверное, не использовать...
просто после каждого
Form1.Label1.Caption =
поставить
Form1.Label1.Refresh или Form1.Refresh
то есть в данном случае он не помогает
есть смысл его использовать если есть куча процедур которые должны срабатывать в то же время что и запрос с DoEvents(работа с контролами , другими гридами , или игра самописная )))
...
Рейтинг: 0 / 0
25 сообщений из 96, страница 2 из 4
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Окно загрузки файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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