Когда я знаю, чтобы позвонить в DoEvents? - PullRequest
3 голосов
/ 08 ноября 2010

Если я зацикливаюсь на длительной операции (скажем, обрабатываю файлы) и хочу обновить индикатор выполнения, мне нужно использовать DoEvents, насколько я понимаю.

Но вызов его во время каждого цикла функции приводит только к тому, что анимация индикатора выполнения воспроизводится очень быстро (или медленно, в зависимости от операции). Я понимаю, что это связано с тем, что DoEvents позволяет индикатору выполнения «дышать» из-за отсутствия более подходящего слова, в результате чего оно и остальная часть формы обновляются.

У меня вопрос: откуда вы знаете, что уместно звонить в DoEvents? Очевидно, что вы не можете просто назвать это по прихоти, хотя часто вам это нравится - это приводит к спорадической анимации, между прочим. Так есть ли какой-нибудь быстрый способ проверить, нужно ли для формы / приложения вызывать DoEvents?

Ответы [ 3 ]

8 голосов
/ 08 ноября 2010

О, да, я просто ударил себя.

Я должен просто использовать фоновый поток для обработки и оставить поток пользовательского интерфейса в покое.

1 голос
/ 08 ноября 2010

Вместо того, чтобы возиться с потоками, вы можете использовать BackgroundWorker . Это упрощает выполнение работы и обновление элементов управления в форме, поскольку вы не можете обновить элемент управления UI напрямую из потока, не являющегося пользовательским интерфейсом. Пример в документации обновляет элемент управления Label, но вы можете легко изменить его для использования ProgressBar.

1 голос
/ 08 ноября 2010

Если вы не хотите возиться с потоками и не возражаете против небольшого бета-тестирования, Visual Studio Async CTP может стоить посмотреть - это в основном " DoEvents сделано правильно"(и более).

Для ознакомления с этими новыми асинхронными функциями я рекомендую проверить блог Эрика Липперта .

...