|
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
|
|
Процесс висит - окна нет10.11.2019, 20:25. Показов 3327. Ответов 39
Метки нет (Все метки)
Здравствуйте. Написал небольшое приложение. Идут вычисления, затем выводятся в окно, через секунду заново. Естественно использовал для этого цикл. При запуске окно не отображается, то есть программа работает, если поставить точку останова, во время работы то видно, что вычисления идут, ничего не зависает, пересчитывает каждую секунду, вот только в диспетчере задач процесс висит не где приложения все, а ниже, в разделе background processes. Если убрать цикл, то программа нормально запускается и отрабатывает ровно один раз. При этом и окно есть и процесс появляется где надо. В wpf нельзя циклы использовать или что?
0
|
|
| 10.11.2019, 20:25 | |
|
Ответы с готовыми решениями:
39
Процесс висит в памяти
Висит процесс после запуска в XE 5 |
|
Модератор
|
|
| 12.11.2019, 07:22 | |
|
Chizel, вы используете очень медленнее методы: удаление/добавление в list, поиск по листу и т.д.
Вместо листа надо использовать матрицу. Также нужно сохранять список штампов матрицы для определения конца игры. Чуть по позже накидаю примеры кода.
0
|
|
|
Модератор
|
|
| 12.11.2019, 08:12 | |
|
Chizel, вам нужен в Модели класс для хранения штампа поля Жизни.
Проще всего использовать булеву матрицу. К ней надо добавить методы сравнения и хеш-кода так на каждом шаге надо будет сравнивать с предыдущими матрицами. Нужны свойства извещающие о наличии жизни в крайних клетках. Нужен метод шага с клонированием. Создаёт следующий штамп поля. Если жизнь есть в крайних клетках, то штамп расширяется в этом направлении. Копируются значения всех клеток согласно правил игры. Попробуем накидать сейчас код. Пишу со смарта - могут быть мелкие ошибки.
0
|
|
|
Модератор
|
||||||
| 12.11.2019, 09:04 | ||||||
|
Начальная реализация
Будет время - продолжу На смарте очень долго получается
0
|
||||||
|
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
|
|
| 13.11.2019, 01:40 [ТС] | |
|
Элд Хасп, о, новые темы для меня, пойду изучать что такое хеши
0
|
|
|
Модератор
|
|
| 13.11.2019, 02:25 | |
|
Chizel, хеш код используется для быстрой выборки, сравнения объектов.
Сначала сравниваются хеш коды объектов, если они равны, то сравниваются уже непосредственно сами объекты. На этом построены хеш-списки, словари, методов работы с множествами и т.д. Так как для условия конца игры надо проверять текущую матрицу со всеми ранее созданными, то быстрое сравнение очень ускорит приложение. Правила для хеш-кода. 1) хеш-код должен считаться очень быстро 2) для одинаковых объектов (для тех которым метод Equals возвращает true) должен возвращать один и тот же код. 3) для разных объектов должен стремиться возвращать разные коды, но может вернуть и одинаковые. Для матрицы я специально анализ не делал - нет компа. Но вроде я правильно написал. Если есть возможность - проверьте для нескольких примеров.
0
|
|
|
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
|
|||||||||||
| 13.11.2019, 05:04 | |||||||||||
|
Chizel, а зачем вечный цикл?
Добавлено через 11 минут Перечитал тему, извините поторопился с вопросом. Я не совсем понял концепцию, но можно внести такие изменения для оптимизаций. Вот тут передавать не string, a bool или enum
Если для отображения времени в игре, то лучше будет сделать таймер. А если это какая-то костылеобразная пауза, то проще через await Task.Delay() А так же я бы отказался от foreach в пользу for с индексом. P.s может быть в вашем случае будет полезен Parralel for(если массив большой, то потоки ускорят процесс) И как выше писал ув. Элд Хасп делать проверку по хешам, а уже в случае не совпадения делать фулл проверку по элементам.
0
|
|||||||||||
|
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
|
|
| 13.11.2019, 07:47 [ТС] | |
|
Элд Хасп, я, если честно, так до сих пор и не понял, что это и как работает. Вернее понял, что по хешу можно быстро сравнить два объекта, в данном случае матрицу, но зачем? Она итак каждый ход меняться будет априори, клетки с каждым ходом умирают и рождаются.
Defences, а что не понятно с концепцией, я объясню. Переделаю стринг на бул. Неужели в 10 раз? Тогда переделаю на циклы for, обязательно, сравню скорость работы. Stopwatch считает время выполнения одной итерации цикла, почему это костыль? Parallel for почитаю, спасибо. по хешам выше писал, нет смысла сравнивать, каждый ход будет на поле ситуация меняться
0
|
|
|
Модератор
|
|
| 13.11.2019, 09:17 | |
|
Chizel, если не надо сравнивать - тогда конечно всё упрощается.
Просто по указанной вами ссылке в программе игры было сравнение с целью определения конца игры. Без этого хеш не будет нужен. Добавлено через 7 минут Chizel, что касается string, то если нет явной в нём необходимости его лучшее не использовать. Создание каждого экземпляра string это запрос на выделение памяти. string неизменяемый тип. Поэтому под каждое изменение надо создавать новый экземпляр. А старый отправляется в мусор. Большое количество таких экземпляров (а у вас из десятки тысяч) могут очень сильно "подвешивать" приложение. StringBuilder в этом отношении конечно лучше. Но вам потом всё равно придется получать его string представление. Количество мусора уменьшиться, но лучше всё равно отказаться от строкового представления. Chizel, у вас игра бесконечная? Конец игры не надо определять?
0
|
|
|
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
|
||||||
| 13.11.2019, 09:28 | ||||||
|
Chizel,
00:00:00.0016628 00:00:00.0000941
0
|
||||||
|
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
|
|
| 13.11.2019, 17:41 [ТС] | |
|
Элд Хасп, да, все будет бесконечно работать. Сегодня протестирую, насколько по времени будет ускорение. К 500-му ходу у меня около 20000 живых клеток, считает около 200 секунд один ход.
0
|
|
|
Модератор
|
|
| 13.11.2019, 19:49 | |
|
Chizel, а как вы поле расширяете?
Когда на краю поля появляется жизнь, то увеличиваете размер поля? Добавлено через 1 минуту Chizel, на смарте такое кодить ужасно долго. Если завтра будет время - попробую сделать на основе матрицы.
0
|
|
|
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
|
|
| 13.11.2019, 21:14 | |
|
Chizel, это не прикол?
200 сек?? Киньте сайты где можно почитать за игру, я сделаю для демонстрации.
0
|
|
|
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
|
|
| 13.11.2019, 21:52 [ТС] | |
|
Defences, я выше кидал ссылку на википедию, игра жизнь можно загуглить, это старая математическая штука, суть такова. Есть поле с клетками пустыми, как шахматная доска, на поле ставятся фишки - это живые клетки и начинается игра. Каждый ход вычисляется, если вокруг живой клетки нет других живых или есть только одна, то она помечается, как умершая, если вокруг четыре или более, то тоже погибает от перенаселения. Если вокруг какой-то пустой клетки три и более живых, то эта пустая становится живой, типо новорожденная. Так и играется, за один ход помечается клетки, которые погибают, затем те, которые рождаются, затем единомоментно картина на поле меняется, то есть убираются мёртвые и добавляются живые и считаем все заново. Реализуете если, то для проверки даю координаты начальной фигуры, она долго играющая и постоянно растёт, а не отмирает к сотому ходу. (0,0) (-1,-1) (-1,0), (0,1), (1,-1), (2,-1). Само поле безграничное.
Элд Хасп, а никак не расширяю, у меня ведь не матрица. Я когда обдумывал, как реализовать, чтобы массив сам расширялся ничего придумать не смог, поэтому решил хранить не поле с клетками, а список с клетками, тогда не надо думать о границах массива, ибо все операции будут на координатной сетке, а она бесконечна. Заменил linq на циклы for и string на bool, к 150 ходу этой фигуры у меня 1733 живых клетки, время 1266 мс в старой версии, в новой 1125 мс, чёт какой-то мизерный выигрыш. Снял скрины, выложить завтра могу, если интересно Добавлено через 5 минут Для тестов ещё можно три в ряд положить фишки - это бесконечная фигура, которая на каждом ходе будет поворачиваться на 90 градусов, типо, сначала так - затем так | потом опять - и до бесконечности, я баги именно на такой вылавливал, очень удобно
0
|
|
|
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
|
|
| 14.11.2019, 06:49 | |
|
Chizel, нашел вот такую реализацию WPF. Возможно вы сможете что-то взять себе оттуда
0
|
|
|
Модератор
|
|||||||||||
| 15.11.2019, 12:05 | |||||||||||
|
Chizel, попробую со смарта накидать метод для создания штампов булевых матриц с "Жизнью".
Отладить сам не смогу - нет компа. Проверьте сами и сообщите результат. Метод проверки жизни на границах. Если есть жизнь - возвращает расширенную матрицу Иначе - исходную.
0
|
|||||||||||
|
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
|
|
| 21.11.2019, 17:38 [ТС] | |
|
Элд Хасп, долго не мог добраться из-за работы
![]() Соседние клетки по диагонали надо тоже учитывать, всего восемь клеток вокруг каждой. Правильно ли я понял, что в вашей реализации мы будем проверять вообще каждую клетку матрицы? Разве это рационально? Или я чего то недопонял? Не могли бы вы накидать общую концепцию, как вы это видете, алгоритм, так сказать, чтобы я при отладке понимал, что работает верно, а что не так?
0
|
|
|
Модератор
|
|
| 21.11.2019, 19:16 | |
|
Chizel, клетки по диагонали тоже проверяются.
Проверяются все ячейки матрицы. Быстрее ли это чем проверка списка.... Зависит от заполненности матрицы. Проверка ячеек массива многократно быстрее чем поиск и проверка элементов списка. Но список может быть много короче массива. Без экспериментальных проверок сравнения скорости обоих методов не обойтись. Даже если работа со списком окажется быстрее, нужно будет вместо List использовать HashSet или Dictionary. Добавлено через 22 минуты Общая концепция алгоритма. На каждом шаге формируется штамп матрицы Жизни. Значение ячеек где есть Жизнь = true. Шаг начинается с метода CheckBorder - проверки Жизни на границах матрицы. Если где-то на краю есть жизнь, то создаётся новая расширенная матрица и в неё копируются значения. Если Жизнь сверху или слева, то копирование со смещением. В следующий метод NextStepLive передаётся матрица полученая из предыдущего метода. В этой матрице граничные клетки всегда "мертвые". Поэтому они не проверяются. Создаётся матрица с такими же размерами и в ней создаётся/копируется Жизнь согласно состоянию полученной матрицы и правил Игры. Полученная матрица является следующим штампом. Изменять его нельзя. Он поступает как исходные данные для следующего шага. А также отправляется в View. В котором асинхронно по штампу создаётся рисунок в типе ImageSource. И уже этот тип в основном потоке отображается. Тоесть, кроме основного потока, будет ещё два. В одном генерируются штампы. В другом по ним создаются рисунки. На каждом шаге создаётся одна, иногда две матрицы. Это генерирует мусор. Я не знаю насколько он может тормозить приложение. Это надо проверить экспериментально. Если будет тормозить, то можно сделать пул матриц. И отработавшие штампы отправлять в него и потом использовать их вместо создания новых. Это усложняет алгоритм, но значительно уменьшит мусор. Добавлено через 7 минут Пропустил в описании алгоритма. Граничные клетки всегда "мертвые", поэтому на Жизнь они не проверяются. Но возникнуть жизнь в них может. И проверка на рождение Жизни производится. Жизнь на первой краю линии может возникнуть только если есть жизнь во всех соседних трёх ячейках из второй линии. Так как условия жизни на краях и в центре разные, то для ускорения проверок используются разные циклы с разными проверками: - Вертикальные края. Только на рождение - Горизонтальные края. Только на рождение - Некрайние ячейки. На рождение и сохранение жизни.
0
|
|
|
Модератор
|
|
| 22.11.2019, 07:08 | |
|
Chizel, ещё есть один нюанс при работе со штампами.
Алгоритм очень легко параллелить. Так как штамп создаётся один раз и он неизменяемый, то для работы с ним можно создать пул потоков. Разбить матрицу на регионы и каждый регион формировать в отдельной задаче в индивидуальном потоке.
0
|
|
| 22.11.2019, 07:08 | |
|
В диспетчере задач висит странный процесс После окончания работы висит процесс Отловить процесс из-за которого висит сервер Delphi 7 and Windows 10: после закрытия висит процесс
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
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.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|