Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/55: Рейтинг темы: голосов - 55, средняя оценка - 4.73
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458

Маленькое продолжение темы "Аналог Excel-метода "OnTime"" или про многопоточность

02.09.2014, 09:48. Показов 11474. Ответов 56
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Коллеги, хочу добавить несколько слов ... (раз уж речь зашла про 2003 офис)
Комментарий: на счет глючности версий после 2003 ... извините, IMHO - эта версия наиболее нестабильная на фоне всех после нее вышедших ... жаль, что не собирал баги раньше (их стало значительно меньше. очень значительно!).
Комментарий: если хотите использовать виндовый таймер - 100 раз подумайте. Его использование сопряжено с огромным количеством НО ...

Комментарий: когда-то ... (как раз) в бытность 2003 офиса, использовал один из сторонних OCX-таймеров. Так вот, вопреки всему здавому смыслу и опыту эксперементаторов использовать многопоточность в Экселе - могу вас заверить - получалась НОРМАЛЬНОЕ "многопотоковое"(или псевдомногопотоковое) выполнение кода. Одновременно отрабатывало 2, 3 и более экземпляров вызываемой функции если она не успевала закончить свое выполнение раньше, чем вызывалась ее копия ... Пробовал провернуть такой опыт потом на других версиях - не получалось.
Объяснить? Ни коем разом. Не могу. Но это работало и факт.
(когда-то искал, какие-то ссылки и примеры в интернете были ... но все это было не работающее или работающее сильно не стабильно)

Вопрос: кто пробовал и каких добился результатов на запуск нескольких потоков в VBA? Было бы здорово ...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.09.2014, 09:48
Ответы с готовыми решениями:

Аналог Excel-метода "OnTime"
Здравствуйте. Что можно использовать вместо Excel-метода "OnTime", чтобы запускать нужную процедуру в нужное время? Мне не нравится...

Про отсебятину (продолжение оффтопа из профильной темы)
Оффтоп из этой темы. Я просто ее решу согласно условиям. Если она будет решаться только через комплексные числа, то я решу ее через...

Осуществить автоматизированный запрос с сайта в Excel продолжение темы
Захожу на сайт по ссылке http://abri.une.edu.au/online/cgi-bin/i4.dll?1=223D2B2A&2=2431&3=56&5=2B3C2B3C3A В отличие от прошлого...

56
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
03.09.2014, 12:34
Студворк — интернет-сервис помощи студентам

Не по теме:


Цитата Сообщение от Антихакер32 Посмотреть сообщение
Ты многократно обратился...
и не надо мне (ты)-кать



Добавлено через 4 минуты
По хорошему, можно было реализовать через коллекцию,
тогда нужно в массив добавить еще и ключ в перечислении
Array(КЕУ, ClassObj, RaiseObject, ProcName)

Добавлено через 22 минуты
Переделал ! ✰

Visual Basic
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
Option Explicit
'Модуль для реализации таймеров
'© Антихакер32
Public Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
Dim Co As Collection
 
Sub StartTimer(ClassObj As Object, RaiseObject As Object, ProcName$, Interval&)
    On Error Resume Next: If IsError(ClassObj.gTmr) Then Exit Sub
    If Co Is Nothing Then Set Co = New Collection
    EndTimer ClassObj.gTmr
    ClassObj.gTmr = SetTimer(0, 0, Interval, AddressOf TimerProg)
    Co.Add Array(ClassObj.gTmr, ClassObj, RaiseObject, ProcName), CStr(ClassObj.gTmr)
End Sub
 
Sub TimerProg(ByVal hWnd As Long, ByVal msg As Long, ByVal idEvent As Long, ByVal TimeSys As Long)
    Dim v: On Error GoTo ERRR
    For Each v In Co
        If v(1) Is Nothing Then
            EndTimer v(0)
        ElseIf idEvent = v(1).gTmr Then
            CallByName v(2), v(3), VbMethod
        End If
    Next: Exit Sub
ERRR:
    Debug.Print "errr"
End Sub
 
Sub EndTimer(ByVal VarTMR&)
    On Error Resume Next
    If VarTMR = 0 Then Exit Sub
    KillTimer 0, VarTMR: Co.Remove CStr(VarTMR)
End Sub
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
03.09.2014, 12:47
Цитата Сообщение от Антихакер32 Посмотреть сообщение
Где вы там увидели многократное обращение
Мы вызываем CreateObject.
CreateObject вызывает CLSIDFromProgID, чтобы получить CLSID из ProgId-а — это первое обращение к реестру, требующее регистрации.
CreateObject вызывает CoCreateInstance.
CoCreateInstance вызывает CoGetClassObject.
CoGetClassObject ищет в реестре имя dll-файле на базе CLSID-а (ключ «InprocServer32») — это второе обращение к реестру, требующее регистрации.
Также при получении списка методов загружается tlb - это 3-е обращение к реестру.
Цитата Сообщение от StepInLik Посмотреть сообщение
В ответ на мой пример по ссылке
Это был ответ не на пример, а на высказывание которое я процитировал в том посте. Debug не является объектом, поэтому ему не нужен маршаллинг вызовов.
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
03.09.2014, 12:53
Цитата Сообщение от The trick Посмотреть сообщение
Мы вызываем CreateObject.
CreateObject вызывает CLSIDFromProgID, чтобы получить CLSID из ProgId-а — это первое обращение к реестру, требующее регистрации.
CreateObject вызывает CoCreateInstance.
CoCreateInstance вызывает CoGetClassObject.
CoGetClassObject ищет в реестре имя dll-файле на базе CLSID-а (ключ «InprocServer32») — это второе обращение к реестру, требующее регистрации.
Одним словом Жесть
ну переделал-же..
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
03.09.2014, 12:54
Антихакер32, ты специально игнорируешь полезные советы? В таком случае я не буду тебе разъяснять причины "кривости" твоих кодов.
Код плохой, очень ресурсоемкий и медленный.
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
03.09.2014, 13:01
Цитата Сообщение от The trick Посмотреть сообщение
В таком случае я не буду тебе разъяснять причины "кривости" твоих кодов.
обычно вы и не разъясняете, к тому-же я не стремлюсь их от вас получать
я понимаю, ресурсы и прочее, но вы уже перегибаете
зачем мне знать куда какой байт перекинулся на машинном уровне, когда реч идет
о квантах времени, и минимальном использовании памяти
0
03.09.2014, 13:05  [ТС]

Не по теме:

Цитата Сообщение от The trick Посмотреть сообщение
Код плохой, очень ресурсоемкий и медленный.
Извините, не могу согласиться. Мы что, работаем в жестких условиях ограничения процессорного времени?
Насколько понимаю, коллега что-то пишет без четких "технических требований" на оптимизацию работы кода. Почему ему нужно следовать этим требованим?
Безусловно, качество повышается при внутренней самоорганизации и повышении требований к самому себе ... но на все это - нужно время ... и не месяц и не два ... и эти требования он должен предъявить себе сам, а не мы с вами. И уж если мы взялись и хотим помочь человеку с чем-то столь фундаментальным - давайте наберемся терпения, уважения и запасемся аргументами.
Причина в том, что он над этим не думает и в том, что не попадал в ситуации, когда начинаешь экономить чуть ли не каждый такт и байт ресурсов компьютера.
Возможно, стоит говорить, что его код не кривой, а не оптимизированный ... ведь по сути он выполняет сформулированную задачу?

0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
03.09.2014, 13:05
Цитата Сообщение от Антихакер32 Посмотреть сообщение
но вы уже перегибаете
зачем мне знать куда какой байт перекинулся на машинном уровне, когда реч идет
о квантах времени, и минимальном использовании памяти
Ты глубоко заблуждаешься. Когда задача стоит вроде этой, то в принципе это не имеет значения, но в более больших проектах это будет заметно. Тем более никто хорошего тона в программировании не отменял.
Цитата Сообщение от Антихакер32 Посмотреть сообщение
обычно вы и не разъясняете, я понимаю, ресурсы и прочее
Что? По-моему я один из немногих кто тестирует твои коды. Я не буду спорить с тобой, пиши что хочешь.
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
03.09.2014, 13:15
Цитата Сообщение от StepInLik Посмотреть сообщение
..не попадал в ситуации, когда начинаешь экономить чуть ли не каждый такт и байт ресурсов компьютера.
помню-помню.. страшно вспоминать
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
03.09.2014, 13:16
Цитата Сообщение от StepInLik Посмотреть сообщение
Извините, не могу согласиться. Мы что, работаем в жестких условиях ограничения процессорного времени?
Я уже приводил пример кода с присвоением переменной на этот счет в этой теме. И все что я думаю на этот счет там же отписал. Это мое право - высказываться, тем более я это делаю не без оснований.
Цитата Сообщение от StepInLik Посмотреть сообщение
но на все это - нужно время ... и не месяц и не два ... и эти требования он должен предъявить себе сам, а не мы с вами.
Я ему написал совет как сделать лучше (я думаю так считают многие), но он не сделал как я просил. Я выставил свою оценку его "творчеству". Я не вижу в этом ничего плохого. Опять-таки - это мое право. Я бы мог ему понизить репу за это, но я не стал, т.к. знаю что он ей очень дорожит и что он не такой опытный программист чтобы его "наказывать" за плохие решения.
Цитата Сообщение от StepInLik Посмотреть сообщение
Причина в том, что он над этим не думает и в том, что не попадал в ситуации, когда начинаешь экономить чуть ли не каждый такт и байт ресурсов компьютера.
Он этот код выложил на всеобщее обозрение как готовое решение, этим кодом будут пользоваться люди - этот код должен быть хорошим, я помогаю в этом ему если никто так этого не понял.
0
03.09.2014, 13:16  [ТС]

Не по теме:

Цитата Сообщение от The trick Посмотреть сообщение
По-моему я один из немногих кто тестирует твои коды.
Коллега, можно вопрос не по теме? Тестируя код Антихакер32 - это ваша созидательная деятельность в развитии вашего коллеги? или в этом есть что-то еще?
Мне кажется в вашем общении есть что-то ограничивающее это общение ... может быть это стоит перезагрузить и в дальнейшем с уважением общаться на тему продуктивности и обменом знаниями?

0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
03.09.2014, 13:23
The trick, вы просто разъясните,
как можно по другому (не так, как у меня) реализовать, многократное использование таймера
тоесть из одного модуля вызывать паралелно разные процедуры в разных классах
и с разным интервалом..
а лучше напишите готовый пример (как сделал я), и я даже вам спасибо скажу (переплюну через себя, и скажу)
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
03.09.2014, 13:24
Цитата Сообщение от StepInLik Посмотреть сообщение
Тестируя код Антихакер32 - это ваша созидательная деятельность в развитии вашего коллеги?
Я тестирую все коды из раздела VB6, а не только его и даю им свою оценку. Но т.к. основная масса кодов от него, то получается он в основном его коды. И тестирую их для других, а не для авторов, для тех кто будет пользоваться ими.
Цитата Сообщение от StepInLik Посмотреть сообщение
Мне кажется в вашем общении есть что-то ограничивающее это общение ...
Ничего, по крайней мере с моей стороны.

По моему, коллеги, мы с вами ушли от темы.
По-теме, у меня есть предположение что можно сделать рабочий поток используя MSVBVM60, но там столько ньюансов (я как-то делал это в VB6), что думаю этот метод вряд ли кому-нибудь понравится. Могу рассказать, если интересно.

Добавлено через 34 секунды
Цитата Сообщение от StepInLik Посмотреть сообщение
может быть это стоит перезагрузить и в дальнейшем с уважением общаться на тему продуктивности и обменом знаниями?
Цитата Сообщение от Антихакер32 Посмотреть сообщение
и я даже вам спасибо скажу (переплюну через себя, и скажу)
Что тут можно сказать?
0
03.09.2014, 13:27

Не по теме:

переплюнуть через себя, это оборот речи такой, что значит, усмирить свою гордость
это не в обиду было сказанно

0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
03.09.2014, 13:30  [ТС]

Не по теме:

Цитата Сообщение от Антихакер32 Посмотреть сообщение
(переплюну через себя, и скажу)
Уважаемый, а вам сложно сказать спасибо? Для этого надо переплевывать? Возможно вам тоже стоит перезагрузить свое отношение к нашему коллеге The trick. У вас у обоих есть знания. У кого-то больше, у кого-то меньше ... все равно мы все живем здесь в одной комнате. Зачем какие-то распри? Насколько понимаю - цель форума делиться знаниями, а не эмоциями ...



Добавлено через 3 минуты
Цитата Сообщение от The trick Посмотреть сообщение
По-теме, у меня есть предположение что можно сделать рабочий поток используя MSVBVM60, но там столько ньюансов (я как-то делал это в VB6), что думаю этот метод вряд ли кому-нибудь понравится. Могу рассказать, если интересно.
Безусловно интересно. Тема живая и поддерживается производственными требованиями.
Цитата Сообщение от The trick Посмотреть сообщение
Ничего, по крайней мере с моей стороны.
Рад ошибаться!
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
03.09.2014, 13:35
Цитата Сообщение от Антихакер32 Посмотреть сообщение
The trick, вы просто разъясните,
как можно по другому (не так, как у меня) реализовать, многократное использование таймера
тоесть из одного модуля вызывать паралелно разные процедуры в разных классах
и с разным интервалом..
Цитата Сообщение от The trick Посмотреть сообщение
Таймеры имеют параметр idEvent, в котором можно передавать пользовательскую информацию, в твоем случае идентифицирующую объект.
Сколько раз мне продублировать чтобы это было прочитано? Больше не буду.
Цитата Сообщение от Антихакер32 Посмотреть сообщение
переплюнуть через себя, это оборот речи такой, что значит, усмирить свою гордость это не в обиду было сказанно
Это видимо было ответом на
Цитата Сообщение от StepInLik Посмотреть сообщение
Мне кажется в вашем общении есть что-то ограничивающее это общение ...
Добавлено через 4 минуты
Цитата Сообщение от StepInLik Посмотреть сообщение
Безусловно интересно. Тема живая и поддерживается производственными требованиями.
Идея в том, что возможно VBA (32 bit) использует такую же схему инициализации потока как и VB6. Для инициализации потока нужно вызвать VBDllGetClassObject из MSVBVM60 (в самом простом случае), передавая хидер в одном из параметров. Вот если в VBA есть хидер от VB6-проекта, то тогда можно попытаться инициализировать контекст. Но там есть свои траблы с данными, котороые нужно смотреть на месте.
1
03.09.2014, 13:39

Не по теме:

Цитата Сообщение от StepInLik Посмотреть сообщение
Мне кажется в вашем общении есть что-то ограничивающее это общение ...
конечно есть эта трудность :)
Кликните здесь для просмотра всего текста




совместно, дружно, можно было бы решить любую даже самую невероятную проблему
только *бы* мешает

0
03.09.2014, 13:56  [ТС]

Не по теме:

Цитата Сообщение от Антихакер32 Посмотреть сообщение
только *бы* мешает
Поговите с модераторами и получите от них условия, при которых они будут готовы обнулить ваши нарушения. Они тоже люди и уверен! - оценят ваше желание и стремление. Это форум, а не калькулятор.
Если же речь за ваш показатель репутации - то IMHO это не те сантиметры ... на которые надо смотреть.
Больше уделяйте внимания вашей работе, а не каким-то абстрактным цифрам ... и постарайтесь прислушаться к этому совету.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.09.2014, 13:56

Аналог Application.OnTime в OutLook
нужен аналог функции Application.OnTime в Outlook, по аналогии Excel такое решение подходит так как грузит зря процессор Public Sub...

Продолжение темы PictureBox
В недавнем сообщении давалась ссылка на навороченный ScrollPictureBox. Вопрос знатокам - а можно ли его юзать вместе с VC++ или Builder.

Продолжение темы сортировки
Сортировка строк. Ха, несколько дней гугла помогли, встретил фразу "неуклюжее решение быстрой сортировки Хоара", стал разбираться...

Продолжение темы: 1С Профессионал
Помогите пожалуйста с ответом на вопрос из комплекта сертификационных вопросов по экзамену 1С:Бухгалтерия 7,7. И расскажите подробне почему...

Продолжение темы сортировки
Все равно не работает сортировка правильно, хотелось бы понять в чем проблема. Перенес с Delphi 7 на Delphi 10.2, символы ошибок...


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

Или воспользуйтесь поиском по форуму:
57
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru