VBA + Темы в MS Access

Как создать процесс, выполняющийся в отдельном потоке в MS Access VBA? Я хотел бы создать процесс, который будет просто сидеть и ждать сообщения.

Ответ 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, которая позволяет системе обрабатывать события. Просто назовите это вспомогательное устройство время от времени, и основной поток не замораживается.