Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
 
Chizel
31 / 14 / 5
Регистрация: 19.11.2014
Сообщений: 584
1

Процесс висит - окна нет

10.11.2019, 20:25. Просмотров 462. Ответов 35
Метки нет (Все метки)

Здравствуйте. Написал небольшое приложение. Идут вычисления, затем выводятся в окно, через секунду заново. Естественно использовал для этого цикл. При запуске окно не отображается, то есть программа работает, если поставить точку останова, во время работы то видно, что вычисления идут, ничего не зависает, пересчитывает каждую секунду, вот только в диспетчере задач процесс висит не где приложения все, а ниже, в разделе background processes. Если убрать цикл, то программа нормально запускается и отрабатывает ровно один раз. При этом и окно есть и процесс появляется где надо. В wpf нельзя циклы использовать или что?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2019, 20:25
Ответы с готовыми решениями:

При закрытии окна процесс остается в диспечере задач
Доброго времени суток))) при закрытии окна процесс остается в диспечере задач. закрываю так ...

Убить процесс к которому нет доступа
Есть острая вырубать одну программу, которая работает на основе вируса. Нужно как-то убить эту...

35

Someone007
3545 / 2595 / 1137
Регистрация: 09.05.2015
Сообщений: 6,363
Завершенные тесты: 1
10.11.2019, 20:29 2
Цитата Сообщение от Chizel Посмотреть сообщение
В wpf нельзя циклы использовать или что?
Можно. Только использовать нужно правильно... Если у вас длительная операция, она должна быть либо асинхронной, либо в отдельном потоке, чтобы не блокировать основной UI поток.
0
Chizel
31 / 14 / 5
Регистрация: 19.11.2014
Сообщений: 584
10.11.2019, 20:58  [ТС] 3
Someone007, то есть если я асинхронным сделаю метод расчёта, то все заработает? Окно не появлялось только из-за этого?
0
Элд Хасп
Модератор
4013 / 2753 / 878
Регистрация: 21.04.2018
Сообщений: 8,751
Записей в блоге: 2
10.11.2019, 22:02 4
Chizel, если вы делаете расчеты в основном потоке, то пока расчёты не закончатся, основной поток не сможет заняться отображением контролов.
Все расчёты надо перенести в Модель и Модель должна из производить асинхронно.
Промежуточные результаты через ViewModel привязать к нужным контролам.
0
10.11.2019, 22:02
Chizel
31 / 14 / 5
Регистрация: 19.11.2014
Сообщений: 584
10.11.2019, 23:10  [ТС] 5
Элд Хасп, а как мне вытащить промежуточные результаты из бесконечного цикла асинхронного метода? Его return ведь не сработает никогда. Да и контролов у меня нет, мой класс рассчитывает и заполняет список координатами, а потом по этим координатам в окне надо прямоугольники рисовать.
0
Элд Хасп
Модератор
4013 / 2753 / 878
Регистрация: 21.04.2018
Сообщений: 8,751
Записей в блоге: 2
11.11.2019, 05:00 6
Chizel, ну, во-первых, меня смущает сама по себе реализация вычислений БЕСКОНЕЧНЫМ циклом.
Вы уверены что использовали правильный подход?

Во-вторых, Модель формирует данные. Это её главное функциональное предназначение. При изменении данных в Модели должно возникать событие. В простых случаях можно использовать INPC. На это событие подписывается ViewModel. В обработчике события VM считывает их Модели изменения и в ОСНОВНОМ потоке изменяет свои данные предназначенные для представления в View.

Как происходит обмен данными в MVVM я постарался объяснить в теме "INPC и получение данных из Модели" из Готовые решения, примеры и рекомендации начинающим на WPF

Для более детального ответа надо больше информации о вашей задаче.
0
Chizel
31 / 14 / 5
Регистрация: 19.11.2014
Сообщений: 584
11.11.2019, 06:28  [ТС] 7
Элд Хасп В общем сделал так. В модели создал событие и вызывал его последней строкой в цикле. Подписался на него в вьюмодели и все. Теперь я всегда знаю, когда у меня цикл итерацию делает в асинхронном методе. С точки зрения мввм это норм?
По поводу бесконечного цикла - это игра пошаговая, по другому её не реализовать
0
Элд Хасп
Модератор
4013 / 2753 / 878
Регистрация: 21.04.2018
Сообщений: 8,751
Записей в блоге: 2
11.11.2019, 06:36 8
Цитата Сообщение от Chizel
С точки зрения мввм это норм?
Да. Это типовое решение не только для WPF, а в целом для платформы Net.


Цитата Сообщение от Chizel
По поводу бесконечного цикла - это игра пошаговая, по другому её не реализовать
А вот по этому поводу у меня большие сомнения.
Что такого делает ваш цикл, что его пришлось делать вечным?
1
Chizel
31 / 14 / 5
Регистрация: 19.11.2014
Сообщений: 584
11.11.2019, 06:55  [ТС] 9
Элд Хасп, ну, игровой ход рассчитывает, завершает расчёты, затем следующий начинает. Как же по другому сделать?

https://ru.m.wikipedia.org/wiki/%D0%...BD%D1%8C%C2%BB
0
Элд Хасп
Модератор
4013 / 2753 / 878
Регистрация: 21.04.2018
Сообщений: 8,751
Записей в блоге: 2
11.11.2019, 07:13 10
Chizel, посмотрите в разделе примеры реализаций игр 2048 и 15.
Это тоже пошаговые игры.
Игра же подразумевает реакцию на действия Игрока.
Игрок сделал ход. Этот ход отправляется в Модель. Модель его отрабатывает. Делает свой ход. Отрабатывает свой ход. Работа Модели на этом заканчивается. На следующий ход игрока всё повторяется.
0
Chizel
31 / 14 / 5
Регистрация: 19.11.2014
Сообщений: 584
11.11.2019, 07:22  [ТС] 11
Элд Хасп, там по ссылке описание моей игры, игрок в ней ходы не делает, а только смотрит
0
Элд Хасп
Модератор
4013 / 2753 / 878
Регистрация: 21.04.2018
Сообщений: 8,751
Записей в блоге: 2
11.11.2019, 07:34 12
Chizel, посмотрел.
Ну, тут как минимум напрашивается таймер.
И каждый ход должен делаться по событию таймера.
В противном случае скорость изменений будет очень высокая и наблюдать, собственно, будет не зачем.
А регулированием интервала таймера можно будет менять скорость игры.
0
Defences
169 / 113 / 36
Регистрация: 28.12.2016
Сообщений: 584
Завершенные тесты: 3
11.11.2019, 08:08 13
Chizel, если цикл вечный и нужно получать результат. 2 способа
1)yield return
2)события
0
Someone007
3545 / 2595 / 1137
Регистрация: 09.05.2015
Сообщений: 6,363
Завершенные тесты: 1
11.11.2019, 08:25 14
Цитата Сообщение от Defences Посмотреть сообщение
2 способа
А как же async streams, Observables и т.д.?
0
Defences
169 / 113 / 36
Регистрация: 28.12.2016
Сообщений: 584
Завершенные тесты: 3
11.11.2019, 08:38 15
Someone007, ну это те же события.
0
Chizel
31 / 14 / 5
Регистрация: 19.11.2014
Сообщений: 584
11.11.2019, 16:34  [ТС] 16
Элд Хасп, я для простоты задержку делал на секунду в конце цикла. Таймер конечно же будет лучше, чем задержка в конце, но...дело в том, что для тестов я расставил 6 живых клеток, к 300-му ходу у меня их было 10000,выводил я тогда их в консоли, то есть каждый ход чистил её и заполнял символами квадрат 70 на 70 - пустая клетка - точка, живая - буква О. Так вот, на этом квадрате у меня было порядка 3000 живых клеток, остальные 7000 за пределами экрана, а так как в консоли максимум 80 символов в строке то я решил переехать в окно. Так вот, я это к чему, когда живых клеток 10000,то обсчет каждого хода занимает 5-10 секунд, тут не о задержке надо думать уже через таймер, а о ускорении
Defences, не понял, что за первый способ?
0
Элд Хасп
Модератор
4013 / 2753 / 878
Регистрация: 21.04.2018
Сообщений: 8,751
Записей в блоге: 2
11.11.2019, 17:12 17
Chizel, такой алгоритм распараллелить очень просто.
Но на мой взгляд, даже для одного потока 5-10 секунд это очень много.
К сожалению я сейчас без компа.
А так обязательно бы поэкспериментировал.
Мне кажется вы что-то не так делаете.

Поле у вас какого размера? Или безграничное?
0
Chizel
31 / 14 / 5
Регистрация: 19.11.2014
Сообщений: 584
11.11.2019, 17:38  [ТС] 18
Элд Хасп, поле безграничное, чуть позже, доберусь до компа и скину свою реализацию
0
Defences
169 / 113 / 36
Регистрация: 28.12.2016
Сообщений: 584
Завершенные тесты: 3
11.11.2019, 21:39 19
Chizel, https://metanit.com/sharp/tutorial/4.12.php
0
Chizel
31 / 14 / 5
Регистрация: 19.11.2014
Сообщений: 584
12.11.2019, 07:13  [ТС] 20
Элд Хасп, вот моя реализация. Есть класс Point, который содержит координаты точки и ее статус, если он false, то клетка "умирает" перед следующим ходом. Самая первая клетка имеет координаты (0;0), остальные уже от нее пляшут. Есть List с этими точками, есть два метода StillAlive - определяет выживает ли точка на этом ходу и NewBorn который определяет, рождается ли в заданных координатах новая клетка. Ну, собственно и все, шерстим по списку и проверяем клетки на условия. Буду рад, если кто подскажет, как ускорить процесс.
C#
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
    public class Game
    {
        public List<Point> Gameboard {get;set;}
        readonly List<Point> newPoints;
        public delegate void DrawDelegate();
        public event DrawDelegate onDraw;
        public Stopwatch TimeInterval{get;set;}
        
        public Game()
        {
            Gameboard = new List<Point>();
            newPoints = new List<Point>();
            Gameboard.Add(new Point(0,0));
            Gameboard.Add(new Point(-1,-1));
            Gameboard.Add(new Point(-1,0));
            Gameboard.Add(new Point(0,1));
            Gameboard.Add(new Point(1,-1));
            Gameboard.Add(new Point(2,-1));         
        }
        public async void CalcAsync()
        {
            await Task.Run(() => Calc());
        }
        private void Calc()
        {
            while (true)
            {
                TimeInterval = Stopwatch.StartNew();
                foreach (Point p in Gameboard)
                {
                    if (StillAlive(p, "old") < 2 || StillAlive(p, "old") > 3) p.Status = false;
                    NewBorn(new Point(p.X - 1, p.Y - 1));
                    NewBorn(new Point(p.X , p.Y - 1));
                    NewBorn(new Point(p.X + 1, p.Y - 1));
                    NewBorn(new Point(p.X + 1, p.Y));
                    NewBorn(new Point(p.X + 1, p.Y + 1));
                    NewBorn(new Point(p.X, p.Y + 1));
                    NewBorn(new Point(p.X - 1, p.Y + 1));
                    NewBorn(new Point(p.X - 1, p.Y));
                }
                Gameboard.RemoveAll(p => p.Status == false);
                Gameboard.AddRange(newPoints);
                newPoints.Clear();
                TimeInterval.Stop();
                onDraw();
            }
        }
        private int StillAlive(Point check, string newOrOld)
        {
            int i;
            if (newOrOld == "new") i = 0;
            else i = -1;
            foreach (Point p in Gameboard)
            {
                if (p.X > check.X - 2 && p.X < check.X + 2 && p.Y > check.Y - 2 && p.Y < check.Y + 2) i++;
            }
            return i;
        }
        private void NewBorn(Point check)
        {
            bool b = true;
            if (Gameboard.FirstOrDefault(p => p.X == check.X && p.Y == check.Y) != null) b = false;
            if (newPoints.FirstOrDefault(p => p.X == check.X && p.Y == check.Y) != null) b = false;
            if (b && StillAlive(check, "new") > 2 ) newPoints.Add(check);
        }       
    }
Добавлено через 3 минуты
Так, уже сам заметил, что в 31 строке два прохода по списку можно одним заменить
0
12.11.2019, 07:13
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2019, 07:13

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

Или воспользуйтесь поиском по форуму:

20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.