Многопоточность в VBA01.07.2023, 15:39. Показов 8277. Ответов 102
Метки multithreading in vba (Все метки)
Почему VBA? Про VB в принципе уже все давно расписано и исследовано за десятки лет. На VBA тема менее популярна, по в принципе понятным причинам, по скольку, там она не сильно так уж и нужна. Мне также в ней нет особой необходимости, просто некоторый интерес прощупать эту тему с точки зрения "простого обывателя", на сколько далеко можно зайти и т.д.
Вообще, говоря, на VBA есть довольно простая и удобная не очень изящная возможность организовать "потоки" за счет запуска нескольких копий приложения, также можно делать на VBS. Далее простой пример (в файле), назовем "Игра - Останови колобка если сможешь!" ). В примере все не очень оптимально, и нет какого-то полезного шаблона, но как мне кажется хорошо видно работу т.н. маршаллинга, его усточивую работу, даже при не очень, как бы правильной ситации. При запуске множества экземпляров Экселя и их одновременному обращению к одному и тому же объекту, все продолжает работать довольно устойчиво при том, что объектная модель отдельного Экселя "общается" со всеми в одном потоке или точнее из одного потока. Видимо маршаллинг все разруливает. В данном примере, не мало важно, что рабоает пропуск ошибок и doevents. Если попытаться реализовать подобное с помощью win-api то с этим уже появляются некоторые проблеммки.. и бог весть еще с чем, а вот при работе разных экземпляров Эксель все очень просто.
0
|
|
| 01.07.2023, 15:39 | |
|
Ответы с готовыми решениями:
102
VBA → SSMS → VBA. Вызов хранимой процедуры SSMS из VBA с возвратом 2ух и более параметров Программа в VBA для проверки гипотез про равенство средних - VBA VBA и Oracle: stored procedure из VBA и сохранение текста в переменной |
| 04.07.2023, 16:02 [ТС] | ||||||||
|
Кликните здесь для просмотра всего текста
Добавлено через 12 минут На самом деле работают параллельные потоки в VBA если взять не googletranslate а какой-то простой код, цикл do loop и выводить в одном потоке, допутим, время, в другом счетчик, в третьем бибипку - работает, завершается корректно. А вот на сколько это может быть стабильно при реальных нагружных задачах и если запустить, допустим, 10 потоков, это конечно вопрос.
0
|
||||||||
|
|
|||
| 04.07.2023, 16:09 | |||
|
2
|
|||
| 04.07.2023, 17:28 [ТС] | ||||||||
Добавлено через 9 минут
0
|
||||||||
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
|
| 04.07.2023, 18:04 | |
|
1
|
|
| 04.07.2023, 19:10 [ТС] | ||
|
Добавлено через 8 минут Хотя подожди, Дидье эти функции использует, должны быть хорошие.. Добавлено через 50 минут В общем много чего еще надо будет проверить. Дополнительную память потоками не отхапать. Если в одном потоке создаю массив arr(131000000), то второй уже жалуетс на "Out of memory", елси только расширяемую память использовать.. или многопроцессный подход
0
|
||
|
Модератор
|
|||
| 04.07.2023, 20:10 | |||
|
2
|
|||
| 04.07.2023, 23:53 [ТС] | ||
|
Не по теме: ЗЫ. Как тебе такое Илон Маск?
0
|
||
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
|
| 05.07.2023, 02:16 | |
|
testuser2, я если честно без понятия, я не спец по VBA
0
|
|
| 05.07.2023, 18:03 [ТС] | ||||||
|
В общем, по итогу нескольких дней мытарств можно подвести некоторые итоги. Авторитеты высказались, можно даже не спорить, все действительно так и выглядит. Особенно остро стит вопрос стабильности, когда дело касается ком-объектов, это такие сложные и капризные штуки, которые требуют к себе должного внимания и отношения. С ними в потоках лучше не связываться, хотя я думаю ,все-таки читать, брать от них информацию все-таки можно, безопаснее, а вот что-то посылать на ком-объект в потоке, не стоит.
А так выглядят 4 (следом 3) одновременно запущенных пустых цикла. 4 я не смог завершить корректно, а 3 спокойно завершились по нажатию кнопки. Кликните здесь для просмотра всего текста
1
|
||||||
| 06.07.2023, 03:36 [ТС] | |||||||
|
Кликните здесь для просмотра всего текста
0
|
|||||||
| 06.07.2023, 07:48 [ТС] | |
|
100 потоков получилось запустить, и корректно остановить (но с большим риском чувствуется
) главное паузы по больше проставлять, чтобы не в коем случае потоки сами н завершались, а только через Terminate.Добавлено через 3 часа 7 минут А вот реальные вычисления не вывозит, для проверки брал тест уважаемого Майкла и поместил его в цикл поточной процедуры. Вышибает в процессе либо при завершении. Примерно понимаю, что наверное лучше процедуры для потоков лучше брать из разных мест (или вообще весь код помещать в поточной процедуре). В общем еще один вывод напрашивается, что вызов простых вычислительных процедур из потока чреват..
0
|
|
|
|
||||
| 06.07.2023, 12:12 | ||||
В пределах процесса у потоков общее адресное пространство и у потоков есть доступ ко всем переменным. Процессы изолированы и переменные в отдельных адресных пространствах. Это создает дополнительные сложности и увеличивает накладные расходы обмена данными.
2
|
||||
| 06.07.2023, 12:14 [ТС] | ||
|
0
|
||
| 06.07.2023, 13:32 [ТС] | |
|
Касаемо #35, вот еще какая мысль из наблюдений заметил такое, что созданный поток очень зависит от запустившей его процедуры и если она прерывается, то поток, становится как бы более нестабильным. Бегло смотрел справку, вроде бы там есть про это. Причем если из процедуры, создавшей поток, вызвать другую процедуру, то она как быпрерывается и рушится связь с потоком или что, в общем вызывающая процедура должна быть все время в активном состоянии. Собственно я этот шаблон увидел у Трика в данной теме и с этого-то мне стало интересно проверить, что может быть возможно создать хотябы какой-нибудь устойчивый колхоз. Плюс к этому я скачал на одном сайте код с аннотацией "простой пример", где показано как создать две анимированные картинки. Код 2001 года, там нет инициализации в com и ожидания завершения потока запускающей процедурой, а потоки запускаются в экземпляре класса при том анимация работает. Я пробовал перетащить этот класс в vba, но в vba поток не запускается из класса.
0
|
|
|
Модератор
|
|
| 06.07.2023, 13:37 | |
|
locm, многопоточность в vba/vb6 основывается на COM, а именно на Single-threaded апартаментах. Свободная модель потоков не поддерживается (в вб6 только с ограничениями). Для программиста в COM нет разницы где расположен апартамент - в другом потоке текущего процесса (in-proc) или потке другого процесса (out-of-proc) или даже компьютера. Для него доступ к объекту осуществляется прозрачно. https://learn.microsoft.com/en... apartments
Как написал testuser2 через расшаренную память все также быстро и параллельно работает. Более того без проблем работают потоки с разной битностью, т.е. потоки могут иметь разную разрядность. testuser2, стабильной работы ты точно не добьёшься через сырые потоки, т.к. поддерживается только STA причём виртуальная машина вба работает в своём главном sta. Любой прямой вызов -это нарушение потоковой модели COM.
1
|
|
| 06.07.2023, 13:37 | |
|
VBA-проект для создания эл. сообщения в MS Outlook из-под любого VBA-приложения. VBA AutoCad - как снять (изменить) ограничение времени выполнения VBA Макроса? VBA SDK. Как включить в проект на VBA конструкторы? Купил книгу По VBA Программирование на VBA 2003 В.Г.Кузьменко Как получить ссылку на VBA-объект Application в DLL, которая привязана к этому VBA-приложению Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки.
Добавлено:
- Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
|
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы.
Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
|
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|