Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,656
Записей в блоге: 2

Многопоточность в VBA

01.07.2023, 15:39. Показов 7395. Ответов 102

Почему VBA? Про VB в принципе уже все давно расписано и исследовано за десятки лет. На VBA тема менее популярна, по в принципе понятным причинам, по скольку, там она не сильно так уж и нужна. Мне также в ней нет особой необходимости, просто некоторый интерес прощупать эту тему с точки зрения "простого обывателя", на сколько далеко можно зайти и т.д.
Вообще, говоря, на VBA есть довольно простая и удобная не очень изящная возможность организовать "потоки" за счет запуска нескольких копий приложения, также можно делать на VBS.
Далее простой пример (в файле), назовем "Игра - Останови колобка если сможешь!" ). В примере все не очень оптимально, и нет какого-то полезного шаблона, но как мне кажется хорошо видно работу т.н. маршаллинга, его усточивую работу, даже при не очень, как бы правильной ситации. При запуске множества экземпляров Экселя и их одновременному обращению к одному и тому же объекту, все продолжает работать довольно устойчиво при том, что объектная модель отдельного Экселя "общается" со всеми в одном потоке или точнее из одного потока. Видимо маршаллинг все разруливает.
В данном примере, не мало важно, что рабоает пропуск ошибок и doevents. Если попытаться реализовать подобное с помощью win-api то с этим уже появляются некоторые проблеммки.. и бог весть еще с чем, а вот при работе разных экземпляров Эксель все очень просто.
Вложения
Тип файла: zip Колобок.zip (20.7 Кб, 32 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.07.2023, 15:39
Ответы с готовыми решениями:

VBA → SSMS → VBA. Вызов хранимой процедуры SSMS из VBA с возвратом 2ух и более параметров
Приветствую! Учусь наполнять таблицу SQL из таблицы Excel. Беру таблицу в массив и построчно вызываю хранимку с передачей очередного...

Программа в VBA для проверки гипотез про равенство средних - VBA
В своё время прогулял лекции по VBA, а теперь жалею! Кто может помочь с написанием проги по проверке гипотез про равенство средних?

VBA и Oracle: stored procedure из VBA и сохранение текста в переменной
Добрый день, Кто-нибудь сталкивался с проблемой выполнения функции Oracle, т.н. Oracle stored procedure, и сохранением результата в...

102
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
13.07.2023, 16:20
Цитата Сообщение от testuser2 Посмотреть сообщение
Вот, кстати, хороший пример Трика - создание окон в разных потоках
Да я давно уже видел, именно этот пример Трика мне больше всего и понравился, очень легко тут можно разобраться как создавать несколько потоков, в отличии от других его примеров, таких как TrickMTDownloader... Я на основе этого примера для себя и создал уже свою пробную программку где одна и та же процедура у меня выполняется в разных потоках.
0
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,656
Записей в блоге: 2
13.07.2023, 16:28  [ТС]
Еще забыл упомянуть, там используется такая вот интересная конструкция, как я понял, еще одна вариация доэвента.
Visual Basic
1
2
3
4
    Do While GetMessage(wMsg, 0&, 0&, 0&)
        Call TranslateMessage(wMsg)
        Call DispatchMessage(wMsg)
    Loop
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
13.07.2023, 16:45
Цитата Сообщение от testuser2 Посмотреть сообщение
Вот, кстати, хороший пример Трика
Кстати он говорил, что у него там неправильно очередь огранизована, там в примере:

Visual Basic
1
2
3
4
Do While GetMessage(wMsg, 0&, 0&, 0&)
        Call TranslateMessage(wMsg)
        Call DispatchMessage(wMsg)
    Loop
А надо примерно так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Do
        
        lRet = GetMessage(tMsg, 0, 0, 0)
        
        If lRet = -1 Then
            ' // Error
            Exit Do
        ElseIf lRet = 0 Then
            Exit Do
        Else
            TranslateMessage tMsg
            DispatchMessage tMsg
        End If
        
    Loop
Добавлено через 2 минуты
И вот на форуме Хакер говорит, что за такое надо быть по рукам:
Цитата Сообщение от testuser2 Посмотреть сообщение
там используется такая вот интересная конструкция
http://bbs.vbstreets.ru/viewtopic.php?f=9&t=42707

Добавлено через 13 минут
Цитата Сообщение от testuser2 Посмотреть сообщение
еще одна вариация доэвента
Это очередь сообщений потока, меня всегда удивляли эти бесконечные циклы если честно, первое время меня вообще помню шокировал этот код и я всё время думал о том, почему же не зависает вообще программа в этом бесконечном цикле... Do Loop сам по себе же это бесконечный цикл... А тут получается что цикл хоть как бы и бесконечный но не бесконечный и на 100% проц нагружать не будет)

Это всё очень интересно для изучения кстати. Эта очередь сообщений используется как раз для того чтобы окно висело в памяти и не закрывалось сразу же)))) Меня больше всего шокировало почему Do Loop не зависает... Оказывается функции TranslateMessage, DispatchMessage замораживают поток ровно до тех пор пока окно не получит какое-либо сообщение отклика и лишь на мгновение тогда программа размораживается чтобы что-то там выполнять в окне этом потом поток снова замораживается и снова ждёт сообщений типа того, если честно про очередь сообщений потока и очередь сообщений окна отдельную тему надо) это очень интересно)
1
1401 / 860 / 92
Регистрация: 08.02.2017
Сообщений: 3,656
Записей в блоге: 2
13.07.2023, 16:46  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
в отличии от других его примеров, таких как TrickMTDownloader...
TrickMTDownloader еще по-людски описан, а вот там, где про копирование файла конкреный брейнфак
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
13.07.2023, 16:48
testuser2, https://www.cyberforum.ru/blog... g5296.html вот тут вроде как самый лучший его пример многопоточности, но я не изучал, слишком сложно
0
Эксперт по электронике
6994 / 3310 / 341
Регистрация: 28.10.2011
Сообщений: 12,991
Записей в блоге: 7
13.07.2023, 16:52
Цитата Сообщение от testuser2 Посмотреть сообщение
Вот, кстати, хороший пример Трика - создание окон в разных потоках
Там числый WinAPI. Ни о каких окнах VB6 речь не идет.
VB6 интересен прежде всего визуальностью. А на WinAPI лучше писать на ЯП с поддержкой многопоточности.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
13.07.2023, 17:09
Цитата Сообщение от locm Посмотреть сообщение
Ни о каких окнах VB6 речь не идет
А кто тебе говорит про окна VB6? Ну да, там API'шные окна.

Цитата Сообщение от locm Посмотреть сообщение
Там числый WinAPI
Тем и прекрасно!

Цитата Сообщение от locm Посмотреть сообщение
А на WinAPI лучше писать на ЯП с поддержкой многопоточности.
Зачем? Если на VB6 The Trick уже написал итак многопоточность.

Добавлено через 13 минут
Цитата Сообщение от locm Посмотреть сообщение
VB6 интересен прежде всего визуальностью.
Я поэтому на нём и программирую, и работает на всех виндах, даже на виндовс 95. Плюс зачем мне мучиться изучать новый язык программирования если я абсолютно всё умею на vb6.
0
Эксперт по электронике
6994 / 3310 / 341
Регистрация: 28.10.2011
Сообщений: 12,991
Записей в блоге: 7
13.07.2023, 17:19
Цитата Сообщение от HackerVlad Посмотреть сообщение
Ну да, там API'шные окна.
Тогда смысл писать на VB?
Если нет визуального программирования, смысла мало.

Цитата Сообщение от HackerVlad Посмотреть сообщение
Зачем? Если на VB6 The Trick уже написал итак многопоточность.
Например на других ЯП (возьмем к примеру PB) можно писать многопоточные приложения без необходимости прибегать к WinAPI (но если нужно никто не запрещает его использовать).
В любом случае код будет проще чем на VB и работать стабильнее. Вот к примеру код с похожим функционалом как у The trick в блоге.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
CompilerIf #PB_Compiler_Thread=0
  CompilerError "Включите поддержку мнгопоточности"
CompilerEndIf
 
DisableDebugger
 
Procedure ThreadProc(Num)
  OpenWindow(Num, Random(500), Random(500), 220, 220, "Гаджет Канвас "+Num, #PB_Window_SystemMenu)
  CanvasGadget(Num, 10, 10, 200, 200)
  
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_Gadget And EventGadget() = Num 
      If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(Num, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
        If StartDrawing(CanvasOutput(Num))
          x = GetGadgetAttribute(Num, #PB_Canvas_MouseX)
          y = GetGadgetAttribute(Num, #PB_Canvas_MouseY)
          Circle(x, y, 2, RGB(Random(255), Random(255), Random(255)))
          StopDrawing()
        EndIf
      EndIf
    EndIf    
    
  Until Event = #PB_Event_CloseWindow
EndProcedure
 
#CountThread = 10
Dim ThID(#CountThread)
 
; Создаем потоки
For i=1 To #CountThread
  ThID(i) = CreateThread(@ThreadProc(), i)
Next
 
; Ждем завершения потоков.
For i=1 To #CountThread
  WaitThread(ThID(i))
Next
Вложения
Тип файла: zip ThreadWin.zip (55.6 Кб, 14 просмотров)
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
13.07.2023, 17:23
locm, я видел уже на другом форуме эти примеры на PureBasic и видел как The Trick спорил там с кем-то каждый доказывал где ему лучше и на чём ему лучше это писать)))))))
0
Эксперт по электронике
6994 / 3310 / 341
Регистрация: 28.10.2011
Сообщений: 12,991
Записей в блоге: 7
13.07.2023, 17:26
Я пишу что когда речь заходит об многопоточном оконном приложении, VB не лучший выбор. Код получится сложнее, уровень необходимых знаний гораздо выше и стабильность под вопросом.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
13.07.2023, 17:27
locm, а если я например не умею программировать на других языках кроме VB6. И зачем мне тратить много-много-много времени на то чтобы изучить новый язык программирования и написать на нём, когда я уже умею программировать на vb6 и всё сделаю быстро.
0
Эксперт по электронике
6994 / 3310 / 341
Регистрация: 28.10.2011
Сообщений: 12,991
Записей в блоге: 7
13.07.2023, 17:32
Цитата Сообщение от HackerVlad Посмотреть сообщение
зачем мне тратить много-много-много времени на то чтобы изучить новый язык
Ну можете тратить много-много-много времени на то чтобы писать более сложный и менее стабильный многопоточный код на VB.
The Trick может себе это позволить, т. к. уровень знаний соответствующий. Но мало кто кроме него сможет проделывать такие трюки на VB.

Язык это инструмент и его подбирают под задачу.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
13.07.2023, 20:14
locm, на вб6 многопоточность в activex exe без всякого winapi из коробки работает. И формы можно создавать и классы - все что угодно.
1
Эксперт по электронике
6994 / 3310 / 341
Регистрация: 28.10.2011
Сообщений: 12,991
Записей в блоге: 7
13.07.2023, 20:19
Цитата Сообщение от The trick Посмотреть сообщение
на вб6 многопоточность в activex exe без всякого winapi из коробки работает.
Много тут на форуме тем с кодами имеющими многопоточность и компилируемыми в activex exe?
Кроме ваших конечно же.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
13.07.2023, 20:56
Цитата Сообщение от locm Посмотреть сообщение
Много тут на форуме тем с кодами имеющими многопоточность и компилируемыми в activex exe?
А при чем тут это? Ты написал:
Цитата Сообщение от locm Посмотреть сообщение
Например на других ЯП (возьмем к примеру PB) можно писать многопоточные приложения без необходимости прибегать к WinAPI (но если нужно никто не запрещает его использовать).
В любом случае код будет проще чем на VB и работать стабильнее. Вот к примеру код с похожим функционалом как у The trick в блоге.
Я же тебе ответил что на вб6 можно еще проще сделать.
Вложения
Тип файла: zip honestMultiThread.zip (7.2 Кб, 7 просмотров)
1
Эксперт по электронике
6994 / 3310 / 341
Регистрация: 28.10.2011
Сообщений: 12,991
Записей в блоге: 7
13.07.2023, 21:29
В коде неявная многопоточность. Не совсем понятно как создать несколько потоков без окон, в которых выполнять фоновые задачи, например качать что-то с сети, сканировать диск, обрабатывать данные пересылая их между несколькими потоками и т. д.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
13.07.2023, 21:42
Цитата Сообщение от locm Посмотреть сообщение
В коде неявная многопоточность.
Понятно, "ваша многопоточность - не многопоточность". Если тебе интересно изучи этот момент, в справке все это описано, за что отвечает вкладка Threading Model в свойствах проекта.
0
Эксперт по электронике
6994 / 3310 / 341
Регистрация: 28.10.2011
Сообщений: 12,991
Записей в блоге: 7
13.07.2023, 21:52
Цитата Сообщение от The trick Посмотреть сообщение
Понятно, "ваша многопоточность - не многопоточность".
Я такого не писал.
Видно что при открытии/закрытии окон число потоков изменяется.
Но т. к. создание потоков неявное, не совсем ясно как все это происходит.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
13.07.2023, 23:19
Цитата Сообщение от locm Посмотреть сообщение
Я такого не писал.
Видно что при открытии/закрытии окон число потоков изменяется.
Но т. к. создание потоков неявное, не совсем ясно как все это происходит.
Еще раз - это почти тоже самое что ты привел выше с окнами и потоками. Каждое окно создается в своем потоке. Thread Per Object - обозначает что каждый VB6 публичный-объект будет жить в своем STA (считай потоке) и необязательно это должна быть форма - любой пользовательский класс. Создаешь 10 объектов - каждый в своем потоке, в каждом выполняешь любые операции - они друг друга не блокируют. В примере выше в форме просто можно гонять либо цикл большой, либо Sleep. Т.к. объекты используют STA модель, для них не нужно обеспечивать атомарный доступ к данным - все на себя берет система. Программист работает с блоками - объектами. И единственный вариант в данном конкретном случае выстрелить в ногу - это дедлоки.
Еще раз - изучи этот момент, если тебе действительно интересно, чтобы не писать больше дезинформацию.

Добавлено через 1 час 1 минуту
Цитата Сообщение от HackerVlad Посмотреть сообщение
Вообще отсубклассировать можно любое чужое окно (если совпадает битность приложений), как это делает любимая ваша программа Spy+ там что-то там не помню название.
Тут уже публиковались несколько вариантов на вб6. Более того можно сделать даже с разной битностью при желании.
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
13.07.2023, 23:56
Цитата Сообщение от The trick Посмотреть сообщение
Более того можно сделать даже с разной битностью при желании.
Ты мне говорил что нельзя. Ну если и можно то слишком сильно сложно.

Добавлено через 6 минут
The trick, у тебя создаётся окно в новом потоке без единой API-функции вообще!? как такое возможно!?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.07.2023, 23:56

VBA-проект для создания эл. сообщения в MS Outlook из-под любого VBA-приложения.
Охотно поделюсь этим своим проектом, который можно скачать с http://moscowjobs.narod.ru/mailmngr.html. Вам понадобится WinZip и MS Word...

VBA AutoCad - как снять (изменить) ограничение времени выполнения VBA Макроса?
Столкнулся с проблемой в Автокад 2012 х64 win7 Run-time error(...): Automation error System call failed - возникает если макросы...

VBA SDK. Как включить в проект на VBA конструкторы?
Всем, добрый день! Если кто-то работал с сабжом - не могу понять, как включить в проект на VBA конструкторы, как-то: DataEnvironment,...

Купил книгу По VBA Программирование на VBA 2003 В.Г.Кузьменко
Поздравьте меня я купил книгу По VBA Программирование на VBA 2003 В.Г.Кузьменко, могу процитировать нужную Вам справку

Как получить ссылку на VBA-объект Application в DLL, которая привязана к этому VBA-приложению
Т.е. ситуация обычная - имеем DLL, сделанную в VB, которая может быть привязана к MsOffice приложениям - Access,Word,Excel . Как в этой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru