|
ProgressBar и окончание выполнения
|
|||
---|---|---|---|
#18+
Всем доброго дня. Мой вопрос прозвучит странно, но помогите разобраться. Есть на форме Progressbar1, и кнопка Button1. При нажатии кнопки делаю цикл для примера от 1 до 10 (с засыпанием, чтобы было наглядно виднее), и по окончанию цикла Progressbar1 надо сделать невидимым. Вот код на кнопку: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Проблема в том, что полоса визуально не доходит до конца, и Progressbar1 становится невидимым раньше. Сразу говорю - потоки и всякие backgroundworker не предлагать. Помогите разобраться ИМЕННО В ЭТОМ КОДЕ. Всем заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 10:11 |
|
ProgressBar и окончание выполнения
|
|||
---|---|---|---|
#18+
Настенька, Application.DoEvents() нужно вызвать внутри цикла ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 11:39 |
|
ProgressBar и окончание выполнения
|
|||
---|---|---|---|
#18+
Поставила для гарантии 3 DoEvents - а воз и ныне там. Вот код: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Результат тот же. Попробуйте у себя это и скажите результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 11:45 |
|
ProgressBar и окончание выполнения
|
|||
---|---|---|---|
#18+
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
у меня вот так работает, какой у вас FW? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 12:02 |
|
ProgressBar и окончание выполнения
|
|||
---|---|---|---|
#18+
FW 4.0. И ваш код тоже не работает. Какой FW поставить - чтобы заработало? Правильно я понимаю (с C# на Vb.net), await Task.Delay(200) = Threading.Thread.Sleep(200)? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 12:09 |
|
ProgressBar и окончание выполнения
|
|||
---|---|---|---|
#18+
НастенькаFW 4.0. И ваш код тоже не работает. Какой FW поставить - чтобы заработало? Правильно я понимаю (с C# на Vb.net), await Task.Delay(200) = Threading.Thread.Sleep(200)? неправильно понимаете Thread.Sleep() приостанавливает текущий поток, в вашем случае это Main Tread (UI поток), потому у вас и не обновляется форма, так как потом отвечающий за её обновление спит в этот момент. А Task.Delay() создает Task который выполняется в отдельном потоке, а await ожидает его завершения, при этом UI поток не блокируется. Вообще использовать Thread.Sleep() для таких задач не самая лучшая идея. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 12:17 |
|
ProgressBar и окончание выполнения
|
|||
---|---|---|---|
#18+
Погуглила, пишут, что аналог C# delay - это sleep. Тогда вообще ничего не понимаю. Как вот эту строку await Task.Delay(200); правильно написать на Vb??? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 12:41 |
|
ProgressBar и окончание выполнения
|
|||
---|---|---|---|
#18+
НастенькаПогуглила, пишут, что аналог C# delay - это sleep. Тогда вообще ничего не понимаю. Как вот эту строку await Task.Delay(200); правильно написать на Vb??? На 4,0 никак. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 15:53 |
|
ProgressBar и окончание выполнения
|
|||
---|---|---|---|
#18+
Настенька, На 4.5 можно использовать Async/Await. В вашем случае (на Win7 как минимум) код в таком виде, как он есть, логически не будет работать правильно. После присваивания значения ProgressBar нужно время, чтобы элемент отрисовал анимацию заполнения. Sleep напрочь блокирует поток, а DoEvents лишь даёт возможность сообщению "отрисоваться" дойти до назначения, до контрола, а время на отрисовку уже не будет, происходит выход из цикла и сокрытие контрола с экрана. Нужна задержка, например такая: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 19:42 |
|
ProgressBar и окончание выполнения
|
|||
---|---|---|---|
#18+
в 4.0 есть TPL и таски используйте их ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 23:10 |
|
ProgressBar и окончание выполнения
|
|||
---|---|---|---|
#18+
Настенька Код: vbnet 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2016, 10:30 |
|
ProgressBar и окончание выполнения
|
|||
---|---|---|---|
#18+
VSVLADНастенька, На 4.5 можно использовать Async/Await. В вашем случае (на Win7 как минимум) код в таком виде, как он есть, логически не будет работать правильно. После присваивания значения ProgressBar нужно время, чтобы элемент отрисовал анимацию заполнения. Sleep напрочь блокирует поток, а DoEvents лишь даёт возможность сообщению "отрисоваться" дойти до назначения, до контрола, а время на отрисовку уже не будет, происходит выход из цикла и сокрытие контрола с экрана. Нужна задержка, например такая: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Избыточно. У ТС не перерисовывается только завершение ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2016, 10:34 |
|
ProgressBar и окончание выполнения
|
|||
---|---|---|---|
#18+
Cat2VSVLAD...Избыточно. У ТС не перерисовывается только завершение По крайней мере работает, через ProgressBar1.Refresh() ведёт себя также, концовка не перерисовывается ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2016, 13:53 |
|
ProgressBar и окончание выполнения
|
|||
---|---|---|---|
#18+
Cat2, переделала вот так, теперь все работает супер. Огромное спасибо. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2016, 05:24 |
|
|
start [/forum/topic.php?fid=20&gotonew=1&tid=1400141]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
12ms |
get first new msg: |
7ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 269ms |
total: | 423ms |
0 / 0 |