Модератор: Brickgroup
в данном случае это не так важно
Ерунда какая. Несложно дописать класс-коллекцию и вместо генерации события научить XTimer дергать ее метод, который будет генерить событие самой коллекции с идентификатором соответствующего таймера (аттач).Во-первых, его нужно объявлять Withevents, в связи с чем ни каких тебе массивов.
КАКОГО?А во-вторых, и это важнее - в этой реализации таймер каким-то образом оказался лишён своего ГЛАВНОГО достоинства.
Это таки проблема большая. Если использовать не Standart Exe, а ActiveX exe, то процесс останется висеть в памяти. Да и в стандартном я могу придумать кучу похожих ситуаций.Впрочем, при завершении программы все классы нормально терменятся, так что проблемма не большая.
стандартный таймер (как и Хтаймер) будет тупо ждать, пока ты закроешь окно, вместо того, чтобы тикать дальше
Так уж ты ответил, что с первого раза не понятно.arthur2 писал(а):Ну и зачем ты ещё раз повторил всё то же самое, на что я уже ответил?
Исправлено. Опять же без поползновений извне. Рекомендую тебе сделать аналогично: Dim iTmr() As ITimer > Dim iTmr() As Long.И о птичках
For i = 0 To 10000 ' имитируем выполнение сложной задачи
s = Space(100000)
s = vbNullString
DoEvents
Next
Безобразно - ну что есть, то есть. Никто меня оформлению не учил, самоучки мы-с...
Но может всё же вернёмся к нашим баранам?
Про ITimer() as long: Здорово. Но мне до конца не понятно - чтобы присвоить такому объекту Nothing, его нужно доставать с помощью ObjFromPtr ?
Про ХТаймерс: интересно, а в чём там мудрёная защита, что он не генерит события, пока не закончилось предыдущее? Может эту волшебную защиту можно как-то снять? До этих пор он мне как не нравился, так и не нравится.
Тебе этот способ все-таки не подойдет. У тебя ITimer'ы хранятся только в массиве, а в XTimers - в коллекции + в массиве в модуле. Из-за того, что ссылки хранились в массиве, икстаймеры не убивались при убитии коллекции. Я заменил в массиве ссылку на указатель, единственная ссылка осталась в коллекции. У тебя же все происходит только в модуле - без убития снаружи не обойтись.Про ITimer() as long: Здорово. Но мне до конца не понятно - чтобы присвоить такому объекту Nothing, его нужно доставать с помощью ObjFromPtr ?
Чтобы присвоить такой ссылке (а не объекту) Nothing, надо присвоить ей 0&, предварительно вызвав у объекта метод Release
Dim ITmr() as ITimer
Затем Set ITimer(index) = itm
dim iTmr() as long
iTmr(index)=objptr(itm)
dim tmp as ITimer
CopyMemory Tmp, itmr(index), 4
call tmp.tick (трампампам)
CopyMemory Tmp, 0&, 4
Приведи мне пример, когда бы тебе (конкретно тебе, arthur2) понадобился такой таймер, который работает допускает рекурсивно зацикливаться?
Да нет, это пользоваться стандартным таймером - всё равно что ездить с надутой подушкой безопасности. Если эта "защита" мешает нормальному выполнению задачи, то лучше уж рискнуть. Тем более, что особого риска я лично не вижу, а ты мне так и не хочешь показать.Всё равно что выдирать из своей машины подушку безопасности.
arthur2 писал(а):Но я програмистом не работаю, и в лени меня обвинять не надо - я может пашу по-больше твоего, в том числе и в бейсике, иногда пробивая-таки стену лбом (хотя дверь рядом, но пробегающие мимо Хакеры обычно считают, что для меня полезней будет додолбиться как-нибудь самому)
arthur2 писал(а):Чтобы присвоить такой ссылке (а не объекту) Nothing, надо присвоить ей 0&, предварительно вызвав у объекта метод Release
У меня было:
- Код: Выделить всё
Dim ITmr() as ITimer
Затем Set ITimer(index) = itm
Мне предложили:dim iTmr() as long
iTmr(index)=objptr(itm)
А затем, когда понадобится сам объект:
- Код: Выделить всё
dim tmp as ITimer
CopyMemory Tmp, itmr(index), 4
call tmp.tick (трампампам)
CopyMemory Tmp, 0&, 4
Вот мне и интересно, когда в itm придёт Nothing, как нужно обрабатывать такую ситуацию? И вообще, кстати, безопасен ли такой метод? А то может всё же оставить как было?
В тесте - только пример, демонстрирующий саму проблемму.
Мне не нужно, чтобы таймер рекурсивно зацикливался. Я только допускаю ситуацию (конкретную ситуацию), когда один из тиков (не каждый!) может обрабатываться довольно долго. И я не хотел бы, чтобы таймер в этот момент замер. И уж совсем бы не хотелось, чтобы всякий раз, когда я вызываю какое-нибудь модальное окно (не обязательно msgbox), все мои таймеры замирали. Если уж на то пошло, копать в сторону апи-таймера я и начал как раз тогда, когда столкнулся с задачей, в которой стандартный таймер начал выделывать кренделя.
Да нет, это пользоваться стандартным таймером - всё равно что ездить с надутой подушкой безопасности. Если эта "защита" мешает нормальному выполнению задачи, то лучше уж рискнуть. Тем более, что особого риска я лично не вижу, а ты мне так и не хочешь показать.
Ты хоть сам понял, что сказал?Ну ладно. Представь в что у тебя в обработчике таймера произошла ошибка. Out of memory. А таймер всё ещё работает. И открывает мессаги, открывает, открывает. Пока ресурсы "оконное подсистемы" не закончатся.
Конечно, это самое важное в данном обсуждении. Достойно комментария, занесения в цитаты и коллекцию избранных топиков.Проблему
Не "приложение замирало", а были бы недоступны юзеру ранее открытые формы. Если нужно - пусть работает.Модальное окно на то и модальное, чтобы приложение замирало, пока оно открыто.
Случается, что мешает. Не помню, что делал, но тоже наткнулся на то, что обычный таймер замирал при выводе модальной формы. Пришлось передать ссылку на вызвавшую форму в модальную и дергать ее процедуру таймером из модальной формы.Эта защита никому, похоже, кроме тебя не мешает.
Честно говоря, я пока не въехал как это работает.А кроме того, что исправил некорректное убиение, не желаешь выдрать из ХТаймера дуратскую подушку безопасности? А то п.2 так и остался в силе.
Ты хоть сам понял, что сказал?
Во-первых, кому надо в каждом тике выводить модальное окно? Я лично не могу представить такой надобности. А один-два раза могу вполне.
Во-вторых, нормальные люди ошибки обрабатывают.
Конечно, это самое важное в данном обсуждении. Достойно комментария, занесения в цитаты и коллекцию избранных топиков.Проблему
Не "приложение замирало", а были бы недоступны юзеру ранее открытые формы. Если нужно - пусть работает.
Случается, что мешает. Не помню, что делал, но тоже наткнулся на то, что обычный таймер замирал при выводе модальной формы. Пришлось передать ссылку на вызвавшую форму в модальную и дергать ее процедуру таймером из модальной формы
Честно говоря, я пока не въехал как это работает.
Вспоминается метафора про "мочение в сарти..." Или нет, стой, это не метафора и не твоё... У тебя была другая - что-то про спать в туалете.Вспоминается пословица про плохого танцора и его туфли.
Ты никому и ничего не должен. Просто когда ты нагрянешь с очередной метафорой вроде "это всё равно что прыгать с крыльца без парашюта", у меня возникает интерес: что конкретно имеется ввиду под парашютом и под крыльцом? Я свой интерес озвучиваю (можно, надеюсь?). Отвечать или нет - твой выбор (и ты, как правило выбираешь второе). Вообще-то как-то принято в нормальной дискуссии - если говоришь, что всё хреново, поясняешь, что конкретно. А иначе все цветастые метафоры - сотрясение воздуха, даже если глубоко внутри себя ты и прав. Впрочем, никому не запрещено сотрясать воздух.Почему ты постоянно считаешь, что если я что-то сказал, я обятельно должен привести 10 примеров, выложит сотни сток кода, чтобы дополнить этим сказанное?
Представил. Очень страшно. И? Если произойдёт этот самый аут, то мало в какой проге не повылазиют глюки. И мало какой юзер оценит, что именно твоя прога мужественно выстояла. Попробуй уронить мой код чем-нибудь менее экзотическим. Мне кажется, сейчас тот случай, когда возразить тебе просто нечего, а признавать это не хочется.Ну ладно. Представь в что у тебя в обработчике таймера произошла ошибка. Out of memory.
1) Для начала надо определиться...
2) Случай, когда itm будет ссылаться ...
Здесь:Где я говорил о создание в каждом тике модального окна?
Если это не создание модального окна в каждом тике, никак не ограниченное условиями, то что это?А таймер всё ещё работает. И открывает мессаги, открывает, открывает.
Ы.
А а не нужно писать фразы, допускающие двоякое толкование, при обсуждении строго конкретного вопроса. Приостановка выполнения кода и блокирование окон - разные вещи, которые в данном случае должны называться своими именами, а не собирательным термином.А не нужно понимать фразу "приложение замирало" в буквальном смысле.
Если ты собираешься исправлять за мной все ошибки орфоргафии, то напоминаю - я дисграфик, и ты скоро задолбаешься. Это не отмазка (я в теме. Скажу тебе что в нашей стране до 80% людей дисграфики в той или иной степени. Издержки "стандартной" методики обучения чтению в начальных классах). Ты ведь тоже наверняка знаешь правило постановки мягкого знака в глаголах на -ся? Пройти проверить твои очипятки? Благо, опыт есть, чужие тетрадки стопками проверял.
1. Когда ты высказываешься на какую-то тему, ты хочешь убедить собеседника в том, что говоришь? Тогда приводи аргументы, а не метафоры. Или и аргументы, и метафоры.
Попробуй уронить мой код чем-нибудь менее экзотическим.
Мне кажется, сейчас тот случай, когда возразить тебе просто нечего, а признавать это не хочется.
Вот за это - спасибо! Когда по делу - всегда приятно тебя послушать.
Стоп! Придумал, как спросить: как уничтожить ссылку на объект, созданную таким способом?
Antonariy писал(а):Во-первых, кому надо в каждом тике выводить модальное окно? Я лично не могу представить такой надобности.Хакер писал(а):Где я говорил о создание в каждом тике модального окна?Antonariy писал(а):Здесь:Если это не создание модального окна в каждом тике, никак не ограниченное условиями, то что это?А таймер всё ещё работает. И открывает мессаги, открывает, открывает.
2) Это означает, что такие ошибки нелься обработать не только в таймере. Зачем тогда о них упоминать как аргумент, что этот таймер - отстой?
Еще бы, ты никогда не говоришь менее, чем двусмысленно. Достала меня эта словесная эквилибристика.Путаешься...
Мне пока что очевидно только то, что ты игнорируешь все, что я писал про Err.Raise. Ну не выскакивает в exe системное сообщение об ошибке, хоть тресни.Тебе не очевидно хотя бы то, что мессаги, которые таймер "открывает, открывает" будут выводиться не потому, что это кому-то хотелось или было нужным, а потому, что ошибка произошла, и никто не спрашивает у вас, хотите ли вы вывод мессаги.
По пунктам.Слушай, а как уничтожать ссылку на объект, созданную тем интересным способом?
Мне пока что очевидно только то, что ты игнорируешь все, что я писал про Err.Raise. Ну не выскакивает в exe системное сообщение об ошибке, хоть тресни.
Объект может храниться только в объектной переменной или коллекции.
Или не хочешь понимать? Если бы ты хотя бы смотрел кирпич, тебе было бы понятно.Да. Там речь идёт о каких-то тестах. О каких тестах? Я не понимаю, о чем речь.
Ведь так и знал, что придерешьсяОбъект не может храниться ни там ни там. Храниться в объектных переменных и коллекциях могут ссылки на интерфейсы объектов.
Считай, кто ж тебе мешает. В программировании ты для меня несомненный авторитет. Но "не сотвори себе кумира"- гуру тоже ошибаются. И - как и простые смертные - они тоже не любят своих ошибок признавать, тем более когда были столь категоричны. Надувание щёк не убеждает - убеждают довыды. И кстати, не твоё ли кредо - ни кому не верить на слово и до всего доходить самому? А я и в школе с преподами спорил, и в институте. Причём - вот совпадение - почему-то именно с теми, кто для меня был авторитетом. Странно, правда? Правда, и среди авторитетных преподов попадаются те, кому не нравится, что на слово им не верят. Это, кстати, и называется снобизм.Я считаю, что если я достаточно автиритетен для человека, что он мочла согласится с моим мнением, то доказательства не нужно писать.
А мне почему-то кажется, что тебе самому не мешало бы обращать внимание на свой тон. Ты не напомнишь, где я позволял себе в отношении кого бы то ни было скабрезные и туалетные метафоры? И не досочиняй за меня моё к тебе отношение, тем более в таких выражениях. "Юпитер, ты сердишься?" Помнишь, как дальше?Мне кажется, что тебе не стоит говорить со мной в подобном тоне
Пример какой-то вымученый. Ну ладно, в такой ситуации апи-таймер не годится, и что? А в другой - очень даже годится. Используя твою логику, и так любимый тобой язык метафор (в котором ты плаваешь), можно сказать, что "туфельки у вас дрянь, потому что в них по крышам лазить не удобно". Если поднапречься, можно, наверное, и для стандартного таймера придумать ситуацию, после которой винду переставлять придётся.Таймер с интервалом 100 мс, открывает файл, читает первую половину файла, делает DoEvents, читает вторую половину, закрывает файл.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14