без использования DoEvents, как определить, была ли нажата кнопка? - PullRequest
0 голосов
/ 03 января 2012

В настоящее время я вызываю DoEvents, чтобы проверить, была ли нажата кнопка Foo в Панель форм .Этот подход работает, но он требует слишком много вычислительной мощности, что задерживает программу.

Я считаю, что задержку можно было бы уменьшить, если бы я мог только проверить, имеет ли Button Foo щелкнули, вместо всех других форм, которые DoEvents должен пройти.

Есть идеи, как проверить, нажата ли кнопка Foo ?

Ответы [ 2 ]

6 голосов
/ 03 января 2012

VB6 на самом деле не был разработан для того, что вы, кажется, делаете (своего рода долговременный прямой код, который не выходит обратно, чтобы обеспечить контроль цикла сообщений). Обычно такая задача делегируется рабочему потоку, а в VB6 это означает, что большую часть времени внедряется в C ++ некоторый внешний компонент.

Существует только несколько видов подходов, чтобы сделать это для вашей специальной логики:

  • Хаки, создающие отдельные потоки через вызовы API, не очень надежные в VB6 по ряду причин.
  • Хитрый ActiveX EXE для каждого объекта, реализующий класс для обработки вашей длительной рабочей нагрузки.
  • Отдельный неинтерактивный рабочий процесс , который будет запускаться и отслеживаться программой GUI.

Вот и все.

Предписанный метод выполнения подобных действий описан в документации VB6. Вы разбиваете свой длительный цикл и инвертируете логику в повторяемый «квант» работы (например, n итераций цикла обработки) и поддерживаете состояние своей рабочей нагрузки в глобальных данных формы. Затем вы используете элемент управления Timer с его интервалом, установленным в 1 или 16 (вряд ли это имеет значение, для запуска обычно требуется не менее 16 мс), и запускаете квант рабочей нагрузки в своем обработчике событий.

Так что, если у вас просто был цикл, который в настоящее время повторяется 100 000 раз, делая что-то, вы можете разбить его так, чтобы он выполнялся 500 раз для каждого такта Таймера. Квантовый размер, вероятно, нужно будет настроить в зависимости от того, что сделано в цикле - 500 - это просто значение, выбранное для иллюстрации. Вы захотите изменить это до тех пор, пока пользовательский интерфейс не станет отзывчивым, не слишком сильно истощая фоновую нагрузку (замедляя выполнение).

1 голос
/ 03 января 2012

Если ваш код достаточно тяжел, чтобы не вызывать DoEvents или просто периодически завершать работу, тогда ваше приложение даже не узнает, что кнопка была нажата. Вызов DoEvents позволяет окнам и вашему приложению отслеживать все уведомления.

Правильный способ решить эту проблему - рабочий поток (см. в этой статье о том, как сделать что-то подобное в VB6), но в случае неудачи требуется периодический DoEvents и, в свою очередь, некоторый повторный вход блокировка при вызове в долго работающий код.

...