Вот довольно стандартная схема асинхронной обработки фона в VB6. (Например, это book и Microsoft VB6 samples.) Вы создаете отдельный ActiveX EXE для выполнения этой работы: таким образом, работа выполняется автоматически в другом потоке в отдельном процессе (что означает, что вам не нужно беспокоиться о перетаскиваемые переменные).
- Объект VB6 ActiveX EXE должен выставлять событие CheckQuitDoStuff(). Это берет ByRef Boolean, называемый Quit.
- Клиент вызывает StartDoStuff в объекте ActiveX EXE. Эта процедура запускает таймер по скрытой форме, и немедленно возвращает. Это разблокирует вызывающий поток. Интервал таймера очень короткий, поэтому событие Timer срабатывает быстро.
- Обработчик событий Timer отключает таймер, а затем вызывает метод DoStuff объекта ActiveX. Это начинает длительную обработку.
- Периодически метод DoStuff вызывает событие CheckQuitDoStuff. Обработчик события клиента проверяет специальный флаг и устанавливает Quit True, если это необходимо для прерывания. Затем DoStuff прерывает вычисление и возвращает раньше, если Quit is True.
Эта схема означает, что на самом деле клиент не должен быть многопоточным, поскольку вызывающий поток не блокируется, пока происходит «DoStuff». Трудная часть заключается в том, чтобы DoStuff поднимал события через соответствующие промежутки времени - слишком долго, и вы не можете уйти, когда захотите: слишком короткий, и вы замедляете DoStuff без необходимости. Кроме того, когда DoStuff завершает работу, он должен выгрузить скрытую форму.
Если DoStuff действительно удалось получить все, что было сделано до того, как оно прервано, вы можете поднять другое событие, чтобы сообщить клиенту, что задание завершено.
Это VB6, а не vb.net. – GSerg 2008-09-30 23:11:34
Я думаю, что вы были заблокированы, потому что вы сказали, что он «будет лучше использовать отдельный поток». – MusiGenesis 2008-09-30 23:34:33
согласен и исправлен. – TheSoftwareJedi 2008-10-01 00:41:36