Как создать процесс, выполняющийся в отдельном потоке в MS Access VBA? Я хотел бы создать процесс, который будет просто сидеть и ждать сообщения.
VBA + Темы в MS Access
Ответ 1
Нет прямого способа сделать это непосредственно в VBA. Вот обсуждение форума MSDN, об этом подробно расскажем. Office никогда не показывал какие-либо расширения VBA для многопоточности.
Однако вы можете сделать это, обратившись к Windows API или создав свой собственный COM-объект в VBA (написанный в другом месте), который выполняет многопоточные вызовы для вас. Просто убедитесь, что вы все-таки перенаправляете все на вызывающий поток (возможно, опрос на ваш COM-объект или что-то подобное).
Кроме того, вы можете проверить ссылку bendewey на потоке COM, поскольку это очень важно для этого.
Ответ 2
Возможно, вы захотите проверить это обходное решение: http://www.excelhero.com/blog/2010/05/multi-threaded-vba.html
Это Excel, но он должен быть практически таким же. Он работает, создавая "агенты" VBScript и выполняйте их задачи. Проверьте пример, он впечатляет.
-Viggo
Ответ 3
Хороший вопрос, но я думаю, что это невозможно.
Ответ 4
Как насчет использования чего-то вроде ShellOpen() для запуска оболочки script, например Visual Basic Script x раз, которая будет выполнять задание, сообщая с файлом Script через файл (и механизм объединения для обнаружения когда результаты приходят)? Я думаю, что это проще сделать, чем писать COM-компонент. Кроме того, VB Script очень похож на VBA. Плохих сторон довольно много, однако - писать и читать файл занимает больше времени, чем совместное использование памяти, объединение может заставить VBA Script казаться невосприимчивым и т.д.
Ответ 5
Самый быстрый способ, который я могу придумать, - создать форму и поместить на нее существующий или самостоятельный элемент управления.
Ответ 6
Если MS Access VBA позволяет использовать формы, отбрасывать таймер в форме и устанавливать задержку на действительно низкое значение, например 10 мс. Затем поместите свой код в функцию события таймера, и он будет выполнен в отдельном потоке.
Ответ 7
Вы также можете использовать процедуру DoEvents, которая позволяет системе обрабатывать события. Просто назовите это вспомогательное устройство время от времени, и основной поток не замораживается.