Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
> Автор: Shamanus Ты забыл сделать рефреш для лейбла и поставить DoEvents перед каждым выполнением запроса Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 10:55 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
Игорь Горбонос > Автор: Shamanus Ты забыл сделать рефреш для лейбла и поставить DoEvents перед каждым выполнением запроса Сделал doevents все заработало. Спасибо Игорь. а что значит рефреш для лейбла, разве строка Код: plaintext не есть рефреш? или должна быть какая то команда типа .update ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 10:59 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
> Автор: Shamanus > а что значит рефреш для лейбла, Код: plaintext Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 11:27 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
Игорь Горбонос > Автор: Shamanus > а что значит рефреш для лейбла, Код: plaintext Игорь спасибо, Вы очень помогли ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 15:49 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
Можно еще AutoRefresh форме поставить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 15:53 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
Игорь Горбонос, Игорь Горбоноспоставить DoEvents перед каждым выполнением запроса получается что запрос будет работать в фоне? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 21:46 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
aduka05admИгорь Горбонос, Игорь Горбоноспоставить DoEvents перед каждым выполнением запроса получается что запрос будет работать в фоне? Да. Только не из-за DoEvents, а из-за асинхронного его запуска. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 21:49 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro, а если обычным запросом разве не будет в фоне? вы говорили что в 1с grid догружается , а не разом заполняется это и есть асинхронный метод , или это что то другое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 21:53 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
aduka05admИгорь Горбонос, Игорь Горбоноспоставить DoEvents перед каждым выполнением запроса получается что запрос будет работать в фоне? Что значит в фоне? Собственно выполнятся будет именно запрос, а форма будет болтатся перед глазами в фоне. Это если запрос синхронно выполнять. А DoEvents нужен для отрисовки всего что нужно и больше ни для чего :) А если запрос выполнять асинхронно, то там другая(событийная) схема работы будет. Собственно ничего сложного, но код будет выглядеть по другому ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 22:28 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
Игорь Горбонос, Игорь ГорбоносЧто значит в фоне? не будет зависшего окна , пока не выполнится запрос так как насколько понял DoEvents активным делает окно , а запрос делается и не тормозит работу Игорь ГорбоносА DoEvents нужен для отрисовки всего что нужно и больше ни для чего :) ну тоже самое про что я сказал выше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 22:33 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
aduka05admа если обычным запросом разве не будет в фоне? Что ты понимаешь под фоновым выполнением? Как правило есть пользовательский интерфейс, который всегда должен быть доступен и откликатся на реакцию пользователя. Для достижения этих требований всякие долгоиграющие вычисления стараются выполнять в отдельном потоке и называют этот отдельный поток - фоновым. Из-за сложностей с реализацией отдельных потоков на VB, да и не только на VB, при долгой первоначальной загрузке программы используют метод называемый SplashScreen. Его суть заключается в следующем: при старте программы показывается обычная форма с красивым рисунком и если нужно с объяснительным текстом. Эта форма и будет имитировать работу, но на самом деле будет фоном для реальных действий, которые выполняются не в фоне, но без видимых последствий. По окончании всех первоначальных загрузок форма прячется и показывается уже окно, с которым будет работать пользователь. aduka05admвы говорили что в 1с grid догружается , а не разом заполняется это и есть асинхронный метод , или это что то другое? Это что-то другое и не асинхронное. Можно сделать свой класс-datasource который будет постепенно получать данные от сервера или читать из файла и грид, присоединенный к объекту этого класса будет отображать полученные данные. А асинхронность это реализация АДО, в 1с врядли используют АДО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 22:51 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
aduka05admне будет зависшего окна , пока не выполнится запрос так как насколько понял DoEvents активным делает окно , а запрос делается и не тормозит работу Зависшее окно как раз будет, пока будет выполнятся запрос, но т.к. на форме ничего важного нет, это не важно. Именно для этого окно и показывается. А DoEvents всего лишь дает отрисовать новую информацию. И все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 22:55 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
Игорь Горбонос, Игорь ГорбоносЕго суть заключается в следующем: при старте программы показывается обычная форма с красивым рисунком и если нужно с объяснительным текстом. Эта форма и будет имитировать работу, но на самом деле будет фоном для реальных действий, которые выполняются не в фоне, но без видимых последствий. По окончании всех первоначальных загрузок форма прячется и показывается уже окно, с которым будет работать пользователь. спасибо , просто я думал запрос в фон отправляется , а оказывается все наоборот Игорь ГорбоносА DoEvents всего лишь дает отрисовать новую информацию. И все. просто читал где то что DoEvents передает работу Windows , не совсем понял что имелось ввиду, щас понял спасибо только не понятно зачем его ставить перед запросом , а не перед Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 23:03 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
aduka05admкороче че то я не понял зачем этот DoEvents уже пишу свои попытки объяснить.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 23:05 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
Адука запутался. Попробую я его еще больше запутать или распутать. Давай только откажемся от термина "фоном" - это понятие относительное и диалектическое. Итак. Синхронные действия (обычные для VB). Код выполняется последовательно, друг за другом, если выполняется долгая операция, весь остальной код тупо ждет (даже если это запрос к серверу БД, выполнение которого зависит от сервера, а не от твоей программы). Закончилась одна команда - началась следующая. События при этом встают в очередь. Любые, кнопки, клавиши, клики, таймер. Если у тебя сработал таймер, событие от него не будет немедленно выполнено, а встанет в очередь и дождется завершения твоего текущего кода. То есть заканчивается выполнение текущего кода (а это тоже в 99,9 случаев обработка события), начинает выполняться следующие, остальные ждут. Вот. Это обычный синхронный режим. А есть такая интересная штука - DoEvents. Она вовсе не вводит асинхронность и многопоточность. Она просто берет и твой текущий код переносит в конец очереди событий. То есть ты делаешь DoEvents, твоя текущая процедура останавливается, начинают выполняться все события, которые ждали своей очереди. Потом управление вернется к твоей процедуре. Если событий в очереди не было - ничего как бы не произойдет. пока вникай, пишу далее.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 23:09 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
С помощью DoEvents можно сымитировать многопоточность. К примеру, у тебя прыгает по экрану чертик. Тупо в цикле: Код: plaintext 1. 2. 3. Как сделать, чтобы реагировало. Код: plaintext 1. 2. 3. 4. Кроме того, чертик будет себе прыгать, а пользователь может переключаться на другие формы того же приложения и делать там все, что хочет. Можно даже запустить несколько таких циклов, они все друг другу будут передавить управление и все чертики будут прыгать. теперь про асинхронность.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 23:18 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
Асинхронное выполнение запроса напоминает работу с таймером. Ты дал команду серверу выполнить запрос (завел таймер), сервер сказал "ок" и пошел думать. Твоя же программа получает управление взад и можешь дальше делать, что хочешь. Обрабатывать нажатия кнопок и т.п. Или рисовать на экране прыгающего чертика. Когда сервер закончит возиться с твоим запросом (когда у таймера настанет время), он выдаст событие - завершил. Вот для этого и важен в рисовании чертика DoEvents - иначе ты просто не поймаешь событие от ADO, когда твой запрос будет готов. Но лучше пойти дальше - не рисовать чертика с использование DoEvents, а рисовать его по таймеру. то есть заводишь таймер на 300 мс, и по каждому событию рисуешь новое положение чертика. Тогда у тебя программа вообще не занята ерундой. Она просто сидит в ожидании событий. Пришло событие от таймера - перерисовал чертика. Пришло событие от ADO - начинаем обрабатывать результаты запроса - вот и вся асинхронность. ЗЫ: Кстати, я не использую тот метод, пример которого ты нарыл. После того, как я получил от сервера событие, что данные готовы, я начинаю заполнять этими данными сетку. Но в цикле после каждой строки делаю DoEvents. В результате, я совершенно не мешаю пользователю работать с другими формами или контролами на этой же форме, включая возможность вообще отменить заполнение сетки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 23:32 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
aduka05adm, И немножко про многопоточность (мультизадачность). С помощью DoEvents ты создаешь псевдомультизадачность (но выглядит она как настоящая). С помощью асинхронного выполнения запроса - уже реальная мультизадачность. Кроме того, не очень сложно запустить в VB второй поток, и параллельно выполнять два своих кода. Самый большой гемор - это синхронизация и изоляция потоков. Это жуткая головная боль. Хорошо сделанных многопоточных программ очень мало (могу привести в пример The Bat! - там реально отрисовка письма, проверка почты, проверка антиспамом, пересчет и индексирование папок идет независимо и при этом не глючит - это дает пользователю нормально работать, а не ждать, пока закончится какая-то операция). В чем головная боль: вот к примеру ты сейчас организуешь, что твой пользователь может что-то делать, пока выполняется запрос. А если он пойдет, откроет еще одну форму и запустит на выполнение еще один запрос. А не выполнится ли он в том же комманде (тогда первый запрос может оказаться сброшенным). А не перепрограммирует он какие-то глобальные переменные, которые еще понадобятся первому запросу. В конце-концов, а не закроет ли пользователь форму, которая ожидает, когда закончит работать запрос? А то, если он закроет форму, а после этого придет событие от ADO - форма может загрузиться обратно без твоего желания :). То есть надо предусмотреть отмену выполнения запроса, если пользователь закрыл форму. А не может ли пользователь поменять какие-то контролы на форме, пока выполняется запрос, что окажется критичным при получении данных. А не запустит ли пользователь запрос повторно... В общем головной боли с этой многопоточностью хватает.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 23:52 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro, Shocker.ProВ результате, я совершенно не мешаю пользователю работать с другими формами или контролами на этой же форме, включая возможность вообще отменить заполнение сетки. то есть у вас здесь также как в цикле с чертиком , если наступает событие то передается управление пользователю? если стоит DoEvents перед строкой кода то, она помещается в конец очереди как например Код: plaintext 1. 2. Код: plaintext Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. здесь все лэйблы будут поочереди срабатывать, пока запросы очереди ждут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 23:54 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro, Shocker.ProВ чем головная боль: вот к примеру ты сейчас организуешь, что твой пользователь может что-то делать, пока выполняется запрос. А если он пойдет, откроет еще одну форму и запустит на выполнение еще один запрос. А не выполнится ли он в том же комманде (тогда первый запрос может оказаться сброшенным). А не перепрограммирует он какие-то глобальные переменные, которые еще понадобятся первому запросу. В конце-концов, а не закроет ли пользователь форму, которая ожидает, когда закончит работать запрос? А то, если он закроет форму, а после этого придет событие от ADO - форма может загрузиться обратно без твоего желания :). То есть надо предусмотреть отмену выполнения запроса, если пользователь закрыл форму. А не может ли пользователь поменять какие-то контролы на форме, пока выполняется запрос, что окажется критичным при получении данных. А не запустит ли пользователь запрос повторно... В общем головной боли с этой многопоточностью хватает.... читал где-то люди тоже говорили , что его надо использовать осторожно))) но и без этого тоже трудно наверно , хотя можно вешать progressbar пусть пользователь ждет)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2010, 23:58 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
aduka05adm только вот еще вопрос Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. здесь все лэйблы будут поочереди срабатывать, пока запросы очереди ждут? Ща почитал повнимательней, о чем вы переписывались с Игорем.... Там DoEvents не служит никакой асинхронности и лучше его, наверное, не использовать... просто после каждого Form1.Label1.Caption = поставить Form1.Label1.Refresh или Form1.Refresh Просто, как правило, отрисовка экрана не происходит, пока не закончатся все события в очереди или кто-нить не даст DoEvents или Refresh. Но так как имеет другие побочные эффекты, можно обойтись Refresh для ясности. Однако, насколько я помню, что твои запросы выполняются разное время, а ты хотел, чтобы твоя форма отображала процесс равномерно. Тогда нужно запускать запросы асинхронно, а на форме рисовать то, что тебе нравится.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2010, 00:11 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
aduka05admShocker.Pro, Shocker.ProВ результате, я совершенно не мешаю пользователю работать с другими формами или контролами на этой же форме, включая возможность вообще отменить заполнение сетки. то есть у вас здесь также как в цикле с чертиком , если наступает событие то передается управление пользователю? Не пользователю - а событию, которое мог вызвать пользователь (нажать кнопку, закрыть форму...) aduka05admесли стоит DoEvents перед строкой кода то, она помещается в конец очереди как например Код: plaintext 1. 2. Код: plaintext Нет, недоразобрался ты.... Не строка, которая следует за DoEvents помещается в конец очереди, а вся твоя процедура. То есть последовательность выполнения строк в твоей процедуре никак измениться не может. Будут выполняться другие события, но не код твоей процедуры. До тех пор, пока другие события не закончатся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2010, 00:23 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
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. так вот может быть ситуация что какой сбой и в первую таблицу данные занеслись а во вторую нет (как вы сами такое реализуете )? то есть хочется все или ничего (транзакция называется по мойму) но как это на VB реализуется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2010, 00:23 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
aduka05adm так вот может быть ситуация что какой сбой и в первую таблицу данные занеслись а во вторую нет (как вы сами такое реализуете )? то есть хочется все или ничего (транзакция называется по мойму) но как это на VB реализуется Напомни, какой СУБД ты пользуешься? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2010, 00:26 |
|
||
|
Окно загрузки файла
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro, все понял поэтому Shamanus говорил что у него никаких процедур Shamanusв коде формы 1 никаких процедур нет только еще вопрос ИгорьТы забыл сделать рефреш для лейбла и поставить DoEvents перед каждым выполнением запроса Shocker.ProТам DoEvents не служит никакой асинхронности и лучше его, наверное, не использовать... просто после каждого Form1.Label1.Caption = поставить Form1.Label1.Refresh или Form1.Refresh то есть в данном случае он не помогает есть смысл его использовать если есть куча процедур которые должны срабатывать в то же время что и запрос с DoEvents(работа с контролами , другими гридами , или игра самописная ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2010, 00:32 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=36731545&tid=2159589]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 144ms |

| 0 / 0 |
