Страницы: 1
RSS
Прерывание отображения работы макроса
 
Всех с наступившим новым годом годом.  

У Николая Павлова вышел новогодний выпуск (vba код, где создается "эмуляция жизни ")

Стало интересно,  скачал файл пример,  запустил. Результат следующий - n-oе количество итераций проходит как и положено, на экране отображается хаотичное  движение развития "клеток", после чего возникает стандартная картина зависшего экселя,  какое то время он думает (при этом на дисплее ничего не отображается)  и в момент отвисания,  эксель выдает конечный результат,  пропустив часть...

что бы было понятней,  на примере это выглядело бы так. Запустили макрос (задача коготорого показать числа от 1 до 10). Макро отрабатывает нормально,  показывает 1, 2 , 3, 4 затем идет зависание, эксель думает  и после отвисания сразу показывает число 10 ( пропустив процесс отображения цифр от 5 до 9). Вопрос,  как правильно это можно обозвать и второй вопрос, как от этого избавиться?  
C2-C4
 
Вопросы не очень понятны
Как можно обозвать? - обозвать что? зачем? да как хотите обзовите, что от этого поменяется..
Как от этого избавиться? - от чего конкретно? где избавиться? (в примере от Николая, или в вашем файле?)
Зачем вы от этого пытаетесь избавиться?
 
Добрый день!

По второму вопросу: скорее всего это зависит от производительности Вашего компьютера, и попробовать избавиться от зависания можно командой Application.ScreenUpdating = False, либо уменьшить количество циклов For i = 1 To 200
 
Возможно не понятно описал процесс....?

Давайте попробуем еще раз

Представьте, что смотрите фильм. Вы видите эпичную картину битвы, где протогонист с антогонистом вот вот сойдутся в схватке. Весь фильм вы ждали этого момента. Вот он первый кадр наступает, где двое сходятся не на жизни а на смерть и бац..... ЗАВИСАНИЕ.... и следующий кадр, антогинист лежит побежденный. Обломно немного.

В файле Николая Павлова история такая же. Запустил макрос, хочу понаблюдать за движением "клеток". В какой то момет эксель перестает отображать процесс движения клеток ( сам эксель становится более тусклым, на месте курсора появляется синий кружочек ожидания, да вы и сами знаете наверное) идет это самое ЗАВИСАНИЕ ... после чего эксель сразу выдает конечный результат жизни клеток. (пропустив львиную часть). Проще это представить в виде эпизодов что ли... Представьте, что у нас 10 эпизодов, с 1 по 4 макрос корректно Вам все отображает, с 5 по 9 макрос не отображает (эксель как бы висит, отображая последний 4 эпизов). После отвисания показывает сразу конечную картинку 10 эпизода. Но мне то нужно наблюдать с 1 по 10 все целиком.

Цитата
Игорь написал:
Как можно обозвать? - обозвать что? зачем? да как хотите обзовите, что от этого поменяется..
Поменяется. Как минимум смог бы загуглить

Цитата
Игорь написал:
Как от этого избавиться? - от чего конкретно? где избавиться? (в примере от Николая, или в вашем файле?)
Файл Николая Павлова (последний, новогодний, про игру - "Жизнь"). Эффект зависания - описан как в шапке так и в текущем сообщении. Перепрочтите

Цитата
Игорь написал:
Зачем вы от этого пытаетесь избавиться?
..... ну уж ... хм. Я даже незнаю какую аналогию Вам привести. Я хочу видеть процесс работы макроса. Собственно ради этого и был скачан этот файл. На примере того же фильма - вы хотите посмотреть битву двух покемонов например, вместо самой борьбы - видели момент с зависанием и последнюю картинку - где один покемон побежденный... вы негодуете .. злитесь, спрашиваете как от этого избавиться и вместо помощи, Вам задают вопрос, ЗАчем вы от этого пытаетесь избавиться?

Цитата
Dmitriy XM написал:
По второму вопросу: скорее всего это зависит от производительности Вашего компьютера,
Тоже к этому пришел вчера. Если цикл ставлю в 100 - комп не успевает "зависнуть" и могу посмотреть все до конца. Но не понятно что именно влияет. Оперы 8 гигов, проц ведьмака тянет, уж эксель то должен был....)
Цитата
Dmitriy XM написал:
Application.ScreenUpdating = False
В этом случае, - все как раз все пропущу...(

Вопрос все тот же, как избежать этого зависания ? (один вариант найден - уменьшить количество циклов For i = 1 To 100). Возможно есть еще способы?
И вопрос - 2, необязательный, как этот процесс с зависанием правильно обозвать ? Может забугорские сайты что интересного смогут подсказать, но увы, я даже вопрос правильно составить не могу, без примера...


Из характеристик (вдруг тут зарыта собака)

Эксель профессиональный 2016, 64-разрядная версия
Оперы - 8 гигов
Проц - кор2 дуо (2.33)
Изменено: Михаил Комиссаров - 02.01.2020 12:37:45
C2-C4
 
Игорь, проблема понятна: представь себе прогрессбар, который плавно показывает процесс, а на 75 процентах замирает, потом сразу 100 ))
 
Да, все верно. Собственно вопрос, с чем это связано и как избежать?
C2-C4
 
Цитата
Михаил Комиссаров написал:
вместо помощи, Вам задают вопрос, ЗАчем вы от этого пытаетесь избавиться?
вопросы вам задают не вместо помощи, а чтобы понять что за задачу вы решаете и как можно помочь вам ее решить
на форуме полно примеров тем из 3-х сообщений:
1-е: вопрос
2-е: ответ
3-е: слова благодарности
радуйтесь каждому, кто задал уточняющий вопрос, подразумевается - проявил интерес к вашей теме, получит внятные ответы на свои вопросы - решит вашу проблему. а если вместо ответа начнете обижаться (недоумевать) "а что тут не понятно?", то в лучшем случае просто пройдет мимо, в худшем отметит для себя "я  в темы этого пользователя больше не ходок"
заинтересованы в получении решения? тогда терпеливо и главное вдумчиво отвечайте на вопросы - это самый быстрый путь к получению готового решения
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Михаил Комиссаров написал: , с чем это связано и как избежать
этого  
Цитата
Юрий М написал:  на 75 процентах замирает, потом сразу 100
не избежать.  Всегда будет операция, которая занимает больше времени чем другие, Как правило процент выполнения базируется на количестве выполненных операций от общего количества, но если врем их выполнения не предсказуемо, то естественно будет дергатня. Если операций много, то можно сперва показывать процент выполонения в зависимости от количества выполненного, и копить статистику времени выполнения, после определенного количества вывести среднее время, рассчитать сколько потребуется всего и процент показывать относительно времени, но это тоже не идеально.
Изменено: БМВ - 02.01.2020 14:46:43
По вопросам из тем форума, личку не читаю.
 
Цитата
Ігор Гончаренко написал:
тогда терпеливо и главное вдумчиво отвечайте на вопросы - это самый быстрый путь к получению готового решения
Ответил максимально развернуто на сообщение Игорь, (пост 4) без какого либо желания кого либо обидеть или задеть

БМВ - спасибо за помощь, но возможно, Вы не совсем верно поняли пример от Юрий М. Вопрос несколько иной. Суть примера от Юрия поменяется, если более внимательней ознакомится с постом 4 и шапкой

Попробывал добавить команду sleep (Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) и поставить в соответствующем месте sleep(250) - (была мысль что комп неуспевает все отобразить на экране - потому уходит в это свое зависание) - не помогло
Изменено: Михаил Комиссаров - 02.01.2020 15:04:39
C2-C4
 
Миша, я ведь просто пояснил, как выглядит проблема на примере с прогрессбаром. А то, что выполнение может идти не "гладко", а с паузами, рывками - это понятно: всё зависит от конкретной ситуации.
 
Судя по всему, вам было не лень создать файл по видео.
Так поделились бы с лентяями.
 
Ссылка https://www.planetaexcel.ru/techniques/3/10648/
Файл во вложении
C2-C4
 
Юрий М,  так и я к тому что анимация и расчет связанные но разные.
По вопросам из тем форума, личку не читаю.
 
Вместо строк
Код
        t = Timer
        Do
        Loop Until (Timer - t) > 0.1

которых нет у автора, поставьте

Код
        DoEvents
Изменено: sokol92 - 02.01.2020 15:23:00
Владимир
 
Цитата
sokol92 написал:
которых нет у автора поставьте
Файл скачан по ссылке, изменений никаких не вносил

DoEvents - помогло. Файл перестал зависать, теперь все работает корректно. Спасибо!)
C2-C4
 
На моем старичке всяко работает. И с задержкой, и без, и с DoEvents.
 
Цитата
RAN написал:
всяко работает
по тому что у тебя девять жизней, без эмуляции :-)
По вопросам из тем форума, личку не читаю.
 
Мне не кажется, что название темы должно звучать с точностью до наоборот? Для "прерывания отображения..." как раз достаточно:
Цитата
Dmitriy XM написал:
Application.ScreenUpdating = False,
однако, вопрос в другом, а, так как:
Цитата
Михаил Комиссаров написал:
DoEvents - помогло. Файл перестал зависать
и, самое главное:
Цитата
Михаил Комиссаров написал:
как правильно это можно обозвать
я бы предложил название темы "Избавиться от прерывания отображения при работе с макросом".
 
результат принесла вот такая замена кода копирования диапазона в цикле

вместо        
Код
rNext.Copy Destination:=rGame


Код
rGame.Resize(30, 30).Value = rNext.Resize(30, 30).Value

причем довольно быстро работало и на поле 90х90
вне цикла это копирование тоже можно заменить, но не так существенно сказывается на быстродействии

и чтобы иметь возможность прервать макрос ...
Код
DoEvents
    Next i
Изменено: smaxus - 08.05.2020 09:30:17
Страницы: 1
Наверх