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

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

02.09.2014, 09:48. Показов 11410. Ответов 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
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
02.09.2014, 16:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от StepInLik Посмотреть сообщение
1. Вы перешли в код
2. Запустили функцию fЗапускТеста
3. Перешли в функцию fФункцияТаймера
4. Установили брекпоинт на строке "dСчетчик& = dСчетчик& + 1"
5. Выполнение кода у вас упало на эту строку
6. Вы подождали пару секунд ... (быть может еще и) отредактировали строчку добавив что-то еще ...
7. Нажали F5 в этой функции и выполнение продолжилось дальше ...
так?
Все так. В анимации все видно. Собственно вопрос - а почему это не должно работать?
Цитата Сообщение от StepInLik Посмотреть сообщение
То, что OnTime работает на основных принципах работы ОС - вполне очевидная вещь, о чем вообщем, даже говорить не стоит.
Помимо SetTimer'а есть и другие таймеры.
Цитата Сообщение от StepInLik Посмотреть сообщение
Про вывод на лист, в StatusBar, в дебаг
Конечно. Слышал про маршаллинг что-нибудь? Мой пример с дебагом также некорректный, я его написал для теста и он заработал. Потоки не будут стабильно работать без инициализации.
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
02.09.2014, 16:51  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Все так. В анимации все видно. Собственно вопрос - а почему это не должно работать?
Потому, что это не видно. Это не работает. На десятках разных компов - не работает (эксель валится). Проверено не только мною. Пусть нас рассудит кто-то еще ...
Цитата Сообщение от The trick Посмотреть сообщение
Помимо SetTimer'а есть и другие таймеры.
Речь шла про использование обсуждаемого. Другие - другой разговор.
Цитата Сообщение от The trick Посмотреть сообщение
Слышал про маршаллинг что-нибудь? Мой пример с дебагом также некорректный, я его написал для теста и он заработал.
Маршаллинг? для вывода в файл? буду благодарен если дадите ссылки и поясните причины моего недопонимания.
Цитата Сообщение от The trick Посмотреть сообщение
Потоки не будут стабильно работать без инициализации.
Так же. Буду благодарен за дополнителную информацию.
По сути - это и была тема топика.

Не по теме:

(все, что писалось году этак в 2008 по этой теме - было давно и не правда ... тему помню плохо)

0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
02.09.2014, 17:28
Цитата Сообщение от StepInLik Посмотреть сообщение
Это не работает
Это работает.

Цитата Сообщение от StepInLik Посмотреть сообщение
Речь шла про использование обсуждаемого. Другие - другой разговор.
Цитата Сообщение от StepInLik Посмотреть сообщение
если хотите использовать виндовый таймер - 100 раз подумайте.
Цитата Сообщение от StepInLik Посмотреть сообщение
Маршаллинг? для вывода в файл? буду благодарен если дадите ссылки и поясните причины моего недопонимания.
Для вывода в файл маршаллинг не нужен, но не факт что Open в VBA не использует объектную модель на внутреннем уровне. Просто так ссылку между потоками/процессами нельзя передавать для этого существует маршаллинг. Почитать можно в сети - это довольно большая тема.
Цитата Сообщение от StepInLik Посмотреть сообщение
Так же. Буду благодарен за дополнителную информацию.
Для VBA я знаю только единственный способ - создать поток в DLL, я про него написал - ты не захотел, других известных мне способов нет. Есть еще в ассемблерных вставках.

Добавлено через 21 минуту

Не по теме:

StepInLik, давай на "Ты", вроде все свои здесь.

0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
02.09.2014, 17:30  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Сообщение от StepInLik
Речь шла про использование обсуждаемого. Другие - другой разговор.
Сообщение от StepInLik
если хотите использовать виндовый таймер - 100 раз подумайте.
здесь что-то не так?
Цитата Сообщение от The trick Посмотреть сообщение
создать поток в DLL
Я хочу ... да не могу. Это код VBA, который может оказаться на рабочем столе любого сотрудника, может оказаться в Китае или на компе без сети и связи ... и код должен работать. Мы работаем несколько в других обстоятельствах. Примите это не как за желание или нежелание, а как за факт.
Цитата Сообщение от The trick Посмотреть сообщение
но не факт что Open в VBA не использует объектную модель на внутреннем уровне
Потому и говорил, что VBA - не тождественен VB. Это тот же VB, но со своими ограничениями и возможностями. И проблема решения работы Open - не решит всех ограничений работы потоков в VBA.
В вопросе было
Цитата Сообщение от StepInLik Посмотреть сообщение
кто пробовал и каких добился результатов на запуск нескольких потоков ...
, а не то, можно ли потоки создать (примеров попыток - полно).

Сам ратую за то, что пользователи изучают и раскапывают темы. Но не для нашего с вами уровня и не для того свободного времени, которое имеется в наличии (которого попросту нет). Вопрос стоял в готовом решении. Потому как тема не проста и слишком избыточна (с особенностями которой в VBA вы столкнулись в этой ветке).
(на счет видео - отвечу позднее. его пока не видно)
0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
02.09.2014, 17:55
Цитата Сообщение от StepInLik Посмотреть сообщение
здесь что-то не так?
Ну виндовый таймер он разный, есть ожидающие таймеры (WaitableTimer), есть таймеры высокого разрешения. Вот
Ты пишешь что обсуждаем SetTimer, но сначала тема звучала как виндовый таймер, значит любой из 3-х типов.
Цитата Сообщение от StepInLik Посмотреть сообщение
Я хочу ... да не могу. Это код VBA, который может оказаться на рабочем столе любого сотрудника, может оказаться в Китае или на компе без сети и связи ... и код должен работать.
Код будет работать, при чем тут вообще DLL? Или есть системы где DLL не работают, как тогда там работает VBA?
Цитата Сообщение от StepInLik Посмотреть сообщение
Потому и говорил, что VBA - не тождественен VB. Это тот же VB, но со своими ограничениями и возможностями. И проблема решения работы Open - не решит всех ограничений работы потоков в VBA.
Это почти одно и тоже, даже структура объектов не изменилась внутри. VBA не предназначен для написания многопоточных программ (в данном случае макросов), все что ты будешь делать - это хак. Чтобы хак работал на всех машинах - нужно очень постараться, и знать работу VBA. Это не VB6 где скомпилировав EXE получил полноценное приложение не зависящее от чего-либо. В общем случае задача написания многопоточного кода на VBA (именно VBA, шеллкод не рассматриваю) нерешаема без реверс-инжиниринга среды. Поэтому нужно брать конкретный алгоритм и его "затачивать" под многопоточность. Зачем тебе многопоточность - для меня загадка. Практически любую задачу можно сделать в однопоточной среде. К тому же не умея работать с многопоточностью ничего хорошего не получится.
Цитата Сообщение от StepInLik Посмотреть сообщение
а не то, можно ли потоки создать (примеров попыток - полно).
Я привел в первом посте пример, он работает у меня. Это не результат?
Цитата Сообщение от StepInLik Посмотреть сообщение
Сам ратую за то, что пользователи изучают и раскапывают темы. Но не для нашего с вами уровня и не для того свободного времени, которое имеется в наличии (которого попросту нет). Вопрос стоял в готовом решении. Потому как тема не проста и слишком избыточна (с особенностями которой в VBA вы столкнулись в этой ветке).
Я тебе могу дать класс, который я уже давно написал, вот там используется поток для копирования файла, в VBA должен работать. Готовое решение, которое нужно тебе (макрос в другом потоке), ты вряд ли найдешь, т.к., повторюсь, VBA не предназначен для написания многопоточных макросов, и вряд ли кто станет реверсить какой-то офис (я бы не стал к примеру, т.к. офисов много) для такой возможности, которая будет работать через раз.
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
02.09.2014, 22:21  [ТС]
Посмотрел видео. На видео все работает. Действительно. Ни на работе (и в 2007 и в 2010), ни дома (в 2010) - все то же самое не работает. Постараюсь в ближайшее время тоже подготовить видео.
Цитата Сообщение от The trick Посмотреть сообщение
Ты пишешь что обсуждаем SetTimer, но сначала тема звучала как виндовый таймер, значит любой из 3-х типов.
Тема топика - продолжение закрытой темы Аналог Excel-метода "OnTime", в которой давал ссылку на класс с использованием SetTimer. Поэтому, речь, как продолжение закрытой темы - шла только про него (соглашусь, если вы скажете, что возможно нужно было уточнить ... но все же, речь шла для тех, кто в курсе). За ссылку спасибо. Позже - посмотрю.
Цитата Сообщение от The trick Посмотреть сообщение
Код будет работать, при чем тут вообще DLL? Или есть системы где DLL не работают, как тогда там работает VBA?
Уважаемый, моя фраза "Я хочу ... да не могу. Это код VBA, который может оказаться на рабочем столе любого сотрудника, может оказаться в Китае или на компе без сети и связи ... и код должен работать." без контекста - ни о чем. Она была ответом на ваш аргумент "создать поток в DLL". Может быть я что-то не понимаю. Или можно создать поток в какой-то особенной/выбранной/или случайной DLL? Или все же нужна DLL, которую надо притащить с собой (в Китай или на рабочий стол/компьютер, где окажется мое приложение-книга)? Тогда если ее не притащить - как вы предлагаете создать поток и в какой DLL? Только не надо рассказывать как ее притащить. Скажу скажу - работаю только с бинарниками ... а что-то засунуть в бинарник - это еще надо постараться.
Цитата Сообщение от The trick Посмотреть сообщение
... Поэтому нужно брать конкретный алгоритм и его "затачивать" под многопоточность.
Вот только об этом и шла речь ... - шла о том, у кого какие есть наработки и какие результаты. Какие есть ограничения или что работает?
Цитата Сообщение от The trick Посмотреть сообщение
Зачем тебе многопоточность - для меня загадка.
Зачастую, необходимо выполнить 2-5-20 и даже 50 однотипных задач, нужно взять файл и выжать из него для определенного типа данных - связанные с ним данные ... и времени, чтобы все это ждать в однопоточной среде - нет ... нет времени ждать пока выполнятся какие-то агрегации, которые нужны этой книге (которые работают только на ресурсах кратно 1 процессорному ядру), и т.д. - множество задач ... и во многих из них нужно что-то решать в параллель. Решать, что можно отжать только что освободившееся процессорное время и запускать поток на еще и еще один расчет ... - задач много ... ставить задачи в очереди на расчеты мощному компу в облаке, но чтобы он не просто работал в однопотоке и не просто на каждую задачу запускал свое приложение экселя (как сейчас), а делал это нормально ...
Цитата Сообщение от The trick Посмотреть сообщение
К тому же не умея работать с многопоточностью ничего хорошего не получится.
Мы всему когда-то учимся и когда-то чего-то не знали, поэтому аргумент не принят (или это было что-то другое?). Опыт создания многопоточной обработки в прошлом имеется ... вопрос времени чтобы поднять знания.
Цитата Сообщение от The trick Посмотреть сообщение
Я привел в первом посте пример, он работает у меня. Это не результат?
Извините, а я разве сказал, что это не результат? К чему ваше замечание?
Цитата Сообщение от The trick Посмотреть сообщение
Я тебе могу дать класс, который я уже давно написал, вот там используется поток для копирования файла, в VBA должен работать.
С удовольствием изучу ваше решение. Тем более. надеюсь, вы не откажете с комментариями если возникнут вопросы (так?).
0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
03.09.2014, 00:13
Цитата Сообщение от StepInLik Посмотреть сообщение
Тогда если ее не притащить - как вы предлагаете создать поток и в какой DLL?
Про "таскать" ничего не было сказано, в том посте. Фразу
Цитата Сообщение от StepInLik Посмотреть сообщение
Я хочу ... да не могу. Это код VBA, который может оказаться на рабочем столе любого сотрудника, может оказаться в Китае или на компе без сети и связи ... и код должен работат
я понял как-будто где-то DLL код не будет работать, по сути он будет работать везде и всегда.
Цитата Сообщение от StepInLik Посмотреть сообщение
Вот только об этом и шла речь ... - шла о том, у кого какие есть наработки и какие результаты. Какие есть ограничения или что работает?
С удовольствием изучу ваше решение. Тем более. надеюсь, вы не откажете с комментариями если возникнут вопросы (так?).
Вот класс с подробными комментариями.
Цитата Сообщение от StepInLik Посмотреть сообщение
Мы всему когда-то учимся и когда-то чего-то не знали, поэтому аргумент не принят (или это было что-то другое?). Опыт создания многопоточной обработки в прошлом имеется ... вопрос времени чтобы поднять знания.
Нет. Ты, я и я уверен многие здесь совершенно не знают как работает VBA изнутри. Посмотри у меня в блоге (если интересно) как я писал многопоточные программы на VB6 и какие там не очевидные вещи делаются в плане оптимизации и т.п. Ты вызывал из другого потока методы без маршаллинга - это пример того, что ты не разбираешься в MT.
Цитата Сообщение от StepInLik Посмотреть сообщение
К чему ваше замечание?
Прочитай сообщение которое я процитировал и ответил на него.
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
03.09.2014, 09:06  [ТС]
Спасибо за ответы и ссылки. Обязательно со ознакомлюсь с предложенной вами информацией.
Цитата Сообщение от The trick Посмотреть сообщение
Ты вызывал из другого потока методы без маршаллинга - это пример того, что ты не разбираешься в MT.
Скажите, а то что вы без маршаллинга работали с окном дебага - это тоже что-то значит? Но ведь без маршаллинга с ваших слов - потому оно и не работает в моих примерах. Как же так?
Вам не кажется, что ваши выводы слишком скоротечны?
Цитата Сообщение от The trick Посмотреть сообщение
Про "таскать" ничего не было сказано, в том посте. Фразу ...
Аргумента не понял. Если вы не правильно поняли фразу - зачем нужно было что-то писать и писать про то, что что-то не было сказано. Говоря про то, что на рабочем месте нет возможности работать со своей DLL - получаю от вас аргумент, что потоки можно запускать в DLL ... о чем бы подумали вы? Очевидно, либо что-то не понимаю я ... либо меня не поняли, что DLL использовать возможности нет. Вывод - надо написать, что DLL притащить с собой не получится (так же, как и встроить ее в качестве ресурса). Или это опять было лишнее?
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
03.09.2014, 09:20
Может создателю темы это не интересно будет.. я честно не понял
что надо, вот класс UGTimer, для
множественного использования в различных целях
ссылка ✰

Добавлено через 12 минут
Как-бы это объяснить..
у самого класса есть только процедура StartTimer
но свойство у класса MultiUse это значит классов можно создать привеликое множество

в аргументах StartTimer нужно только указать объект, выполняемую процедуру
и интервал (периодичность выполнения в милисеках)
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
03.09.2014, 09:20  [ТС]
Цитата Сообщение от Антихакер32 Посмотреть сообщение
что надо, вот класс UGTimer, для множественного использования в различных целях
ссылка ✰
Спаисбо. Скажите пожалуйста, он чем-то принципиально отличается от предложенного мною класса?
Цитата Сообщение от Антихакер32 Посмотреть сообщение
я честно не понял
что надо
Речь шла про наработки в части попыток запускать несколько потоков в одном приложении-книге экселя. Все остальные темы - лишь дополнительное обсуждение к основной теме.
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
03.09.2014, 09:40
Цитата Сообщение от StepInLik Посмотреть сообщение
Спаисбо.спасибо
.
да ладно, я и сам бы не стал этого затевать, пока не пошел этот спор
еще в пр-дущих (уже закрытых) темах, позже осознал всю важность практического применения

Добавлено через 6 минут
Цитата Сообщение от StepInLik Посмотреть сообщение
он чем-то принципиально отличается от предложенного мною класса?
кстати, где можно посмотреть и сравнить, чтоб потом объективно Вам ответить ???
0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
03.09.2014, 10:42
Цитата Сообщение от StepInLik Посмотреть сообщение
Скажите, а то что вы без маршаллинга работали с окном дебага - это тоже что-то значит?
Debug в VB6 не является объектом, даже в раскрывающемся списке Print и Assert обозначены не как методы. Это тоже самое что создать модуль Test, а в нем функцию Print и обращаться к ней как Test.Print.
Цитата Сообщение от StepInLik Посмотреть сообщение
Вам не кажется, что ваши выводы слишком скоротечны?
Нет.
Цитата Сообщение от StepInLik Посмотреть сообщение
Аргумента не понял.
Я тебе написал -
Цитата Сообщение от The trick Посмотреть сообщение
Для VBA я знаю только единственный способ - создать поток в DLL, я про него написал - ты не захотел, других известных мне способов нет.
Ты ответил -
Цитата Сообщение от StepInLik Посмотреть сообщение
Я хочу ... да не могу. Это код VBA, который может оказаться на рабочем столе любого сотрудника, может оказаться в Китае или на компе без сети и связи ... и код должен работать.
Как это понимать? Если бы ты написал - "я не могу т.к. придется таскать с собой DLL, а такой возможности нет", я бы тебя прекрасно понял. Но ты написал так, как-будто код в DLL как-то влияет на работоспособность программы. Про "таскать" не было сказано ни слова.
Антихакер32, для чего там вообще словарь? Для чего лезть в реестр для запуска таймера?
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
03.09.2014, 10:48
Цитата Сообщение от The trick Посмотреть сообщение
Для чего лезть в реестр
какой еще реестр, вы покажите, где я обратился к реестру ???
а словарь нужен, чтоб модуль помнил какие классы к нему обратились..
если надо, переделаю, если увижу что есть более изящное решение
0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
03.09.2014, 11:03
Цитата Сообщение от Антихакер32 Посмотреть сообщение
какой еще реестр, вы покажите, где я обратился к реестру
Ты многократно обратился к реестру в CreateObject. Таймеры имеют параметр idEvent, в котором можно передавать пользовательскую информацию, в твоем случае идентифицирующую объект.
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
03.09.2014, 11:24  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Debug в VB6 не является объектом, даже в раскрывающемся списке Print и Assert обозначены не как методы. Это тоже самое что создать модуль Test, а в нем функцию Print и обращаться к ней как Test.Print.
Кажется мы уже единогласно пришли к единогласному мнению, что VBA и VB не суть одно и то же ... (хотя, цепляться к словам - можно еще очень долго ... в т.ч. что Open - не метод и Print тоже)
Цитата Сообщение от The trick Посмотреть сообщение
Но ты написал так, как-будто код в DLL как-то влияет на работоспособность программы.
Мне это не очевидно.

Коллега, мне жаль, что обсуждение темы уходит за рамки поставленного вопроса. Ваш пример и рассуждения на тему VBA понятны, все ссылки записаны - потом изучу их, а мнение о том, что не разбираюсь в MT - услышано.

Цитата Сообщение от Антихакер32 Посмотреть сообщение
кстати, где можно посмотреть и сравнить, чтоб потом объективно Вам ответить ???
Уменьшение размера активного окна, передвижение вдоль границ экрана
0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
03.09.2014, 11:30
Цитата Сообщение от StepInLik Посмотреть сообщение
Кажется мы уже единогласно пришли к единогласному мнению, что VBA и VB не суть одно и то же ... (хотя, цепляться к словам - можно еще очень долго ... в т.ч. что Open - не метод и Print тоже)
Попробуй написать Debug.Print ObjPtr(Debug)
Если Debug является объектом - то все законно, также как к примеру App и т.п.
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
03.09.2014, 11:34  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Попробуй написать Debug.Print ObjPtr(Debug)
Если Debug является объектом - то все законно, также как к примеру App и т.п.
Коллега, это не я, а вы написали что это метод.
Вот ваша фраза:
Цитата Сообщение от The trick Посмотреть сообщение
Ты вызывал из другого потока методы без маршаллинга
Единственное, что могло быть расценено в моем примере как метод я вижу только работу с Debug.
0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
03.09.2014, 11:40
Цитата Сообщение от StepInLik Посмотреть сообщение
Коллега, это не я, а вы написали что это метод.
Это не метод, я не писал такого, и код Debug.Print ObjPtr(Debug) доказывает что Debug не является объектом. Так что Print является не методом а просто функцией.
Цитата Сообщение от StepInLik Посмотреть сообщение
Единственное, что могло быть расценено в моем примере как метод я вижу только работу с Debug.
Не понял.
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
03.09.2014, 11:56
Цитата Сообщение от The trick Посмотреть сообщение
Ты многократно обратился к реестру в CreateObject
Где вы там увидели многократное обращение ???

вот модуль !!!
где вы можете увидеть эту строчку

Visual Basic
1
If Dic Is Nothing Then Set Dic = CreateObject("scripting.dictionary"): Dic.CompareMode = 1
Кликните здесь для просмотра всего текста
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 Dic As Object
 
Sub StartTimer(ClassObj As Object, RaiseObject As Object, ProcName$, Interval&)
    On Error Resume Next: If IsError(ClassObj.gTmr) Then Exit Sub
    If Dic Is Nothing Then Set Dic = CreateObject("scripting.dictionary"): Dic.CompareMode = 1
    EndTimer ClassObj.gTmr
    ClassObj.gTmr = SetTimer(0, 0, Interval, AddressOf TimerProg)
    Dic.Add CStr(ClassObj.gTmr), Array(ClassObj, RaiseObject, ProcName)
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 Dic.keys
        If Dic(v)(0) Is Nothing Then
            EndTimer v
        ElseIf idEvent = Dic(v)(0).gTmr Then
            CallByName Dic(v)(1), Dic(v)(2), 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: Dic.Remove CStr(VarTMR)
End Sub


вот класс !!!
Кликните здесь для просмотра всего текста
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Option Explicit
'Класс ТАЙМЕР
'© Антихакер32
Public gTmr&
Dim b As Boolean, mEnabled As Boolean
Dim mRaiseObject As Object, mProcName$, mInterval&
 
Public Property Get Interval() As Long
    'Получить значение Interval
    Interval = mInterval
End Property
 
Public Sub StartTimer(RaiseObject As Object, ProcName$, Interval&)
    'Запускает таймер
    'Арг: Объект с вызываемой процедурой // имя процедуры // интервал
    '*Примечание, имя процедуры должно быть объявленно глобально
    Set mRaiseObject = RaiseObject
    mProcName = ProcName
    Me.Interval = Interval
End Sub
 
Public Property Let Interval(ByVal vNewValue As Long)
    'Изменение интервала ускорения таймера этого класса
    If Not (mRaiseObject Is Nothing) And Len(mProcName) And mEnabled Then Else Exit Property
    mInterval = vNewValue: If Not mEnabled Then Exit Property
    mTimer.StartTimer Me, mRaiseObject, mProcName, mInterval
End Property
 
Public Property Let Enabled(ByVal vNewValue As Boolean)
    'Включение или остановка действующего таймера этого класса
    If Not (mRaiseObject Is Nothing) And Len(mProcName) Then Else Exit Property
    mEnabled = vNewValue
    If mEnabled Then
        mTimer.StartTimer Me, mRaiseObject, mProcName, mInterval
    Else: mTimer.EndTimer gTmr
    End If
End Property
 
Public Property Get Enabled() As Boolean
    'Получить значение Enabled
    Enabled = mEnabled
End Property
 
Private Sub Class_Initialize()
    mEnabled = True 'По умолчанию таймер активен
End Sub
 
Private Sub Class_Terminate()
    'Завершение таймера этого класса
    If gTmr Then EndTimer gTmr
End Sub
0
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
03.09.2014, 11:58  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Не понял.
В ответ на мой пример по ссылке Маленькое продолжение темы "Аналог Excel-метода "OnTime"" или про многопоточность вы написали
Цитата Сообщение от The trick Посмотреть сообщение
Ты вызывал из другого потока методы без маршаллинга -
Что еще в моем примере может быть расценено как вызов метода если не Print? Вот и пишу, что Print - это не метод.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.09.2014, 11:58

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru