VB6 на самом деле не был разработан для того, что вы, кажется, делаете (своего рода долговременный прямой код, который не выходит обратно, чтобы обеспечить контроль цикла сообщений). Обычно такая задача делегируется рабочему потоку, а в VB6 это означает, что большую часть времени внедряется в C ++ некоторый внешний компонент.
Существует только несколько видов подходов, чтобы сделать это для вашей специальной логики:
- Хаки, создающие отдельные потоки через вызовы API, не очень надежные в VB6 по ряду причин.
- Хитрый ActiveX EXE для каждого объекта, реализующий класс для обработки вашей длительной рабочей нагрузки.
- Отдельный неинтерактивный рабочий процесс , который будет запускаться и отслеживаться программой GUI.
Вот и все.
Предписанный метод выполнения подобных действий описан в документации VB6. Вы разбиваете свой длительный цикл и инвертируете логику в повторяемый «квант» работы (например, n итераций цикла обработки) и поддерживаете состояние своей рабочей нагрузки в глобальных данных формы. Затем вы используете элемент управления Timer с его интервалом, установленным в 1 или 16 (вряд ли это имеет значение, для запуска обычно требуется не менее 16 мс), и запускаете квант рабочей нагрузки в своем обработчике событий.
Так что, если у вас просто был цикл, который в настоящее время повторяется 100 000 раз, делая что-то, вы можете разбить его так, чтобы он выполнялся 500 раз для каждого такта Таймера. Квантовый размер, вероятно, нужно будет настроить в зависимости от того, что сделано в цикле - 500 - это просто значение, выбранное для иллюстрации. Вы захотите изменить это до тех пор, пока пользовательский интерфейс не станет отзывчивым, не слишком сильно истощая фоновую нагрузку (замедляя выполнение).