Вот довольно стандартная схема для асинхронной фоновой обработки в VB6. (Например, он находится в книге Дэна Эпплмана и VB6 семплов Microsoft .) Вы создаете отдельный EXE-файл ActiveX для выполнения работы: таким образом, работа автоматически выполняется в другом потоке, в отдельном процесс (что означает, что вам не нужно беспокоиться о растоптанных переменных).
- Объект VB6 ActiveX EXE должен предоставлять событие CheckQuitDoStuff (). Для этого используется логическое значение ByRef Quit.
- Клиент вызывает StartDoStuff в объекте ActiveX EXE. Эта процедура запускает таймер в скрытой форме и немедленно возвращает . Это разблокирует вызывающий поток. Интервал таймера очень короткий, поэтому событие таймера срабатывает быстро.
- Обработчик событий Timer отключает Timer, а затем вызывает метод DoStuff объекта ActiveX. Это начинает длительную обработку.
- Периодически метод DoStuff вызывает событие CheckQuitDoStuff. Обработчик событий клиента проверяет специальный флаг и устанавливает Quit True, если необходимо прервать операцию. Затем DoStuff прерывает вычисление и возвращает рано, если Quit имеет значение True.
Эта схема означает, что клиент на самом деле не должен быть многопоточным, поскольку вызывающий поток не блокируется, пока происходит DoStuff. Сложная задача - убедиться, что DoStuff вызывает события через соответствующие промежутки времени - слишком долго, и вы не можете выйти, когда хотите: слишком коротко, и вы без необходимости замедляете DoStuff. Кроме того, когда DoStuff завершает работу, он должен выгружать скрытую форму.
Если DoStuff действительно удается выполнить все, что было сделано до того, как его прервать, вы можете вызвать другое событие, чтобы сообщить клиенту, что задание завершено.