Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 13.06.2015
Сообщений: 10
1
WPF

Разная скорость выполнения потока

02.04.2019, 15:21. Показов 1476. Ответов 5

Author24 — интернет-сервис помощи студентам
Здравствуйте! недавно начал изучать WPF и программировать на нём. Задался задачей портировать одно приложение с паскаля на wpf(кода много, но благодаря привязке данных wpf это позволяет писать более компактный код).
И Собственно суть: есть класс Game, содержащий позиции и скорости 2 объектов на "поле": цель и курсор. Запуск поиска цели или демонстрации движения происходит в отдельном потоке(вызывается функция из класса). И! Со старта движения курсора и/или цели идут быстро и плавно, но затем резко замедляется раза в 3-5. Но если водить мышкой по RadioButton`ам, или по кнопке на окне(заставляя перерисовываться окно) курсор начинает бежать как и со старта, быстро.
Вопрос: с чем связан такой прикол? И в какую сторону копать, чтобы скорость была постоянной?

Код проекта в прикрепленном файле.
Вложения
Тип файла: zip SeekAndDestroy.zip (16.6 Кб, 3 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2019, 15:21
Ответы с готовыми решениями:

Разная скорость работы приложения
Есть приложение, которое работает с виртуальным Serial портом. Написано под .Net 3.5 и любую...

Многопоточная программа. Разная скорость работы потоков
Здравствуйте! Изучаю многопоточное программирование и столкнулся вот с такой проблемой. Есть...

CallBack после окончания выполнения потока
Вот тут я создаю поток: public void Turn() { if (!VirualCoreStarted) ...

Скорость выполнения операций
Загадали мне загадку Посчитать скорость выполнения мат операций (сложение, вычитание, умножение,...

5
Модератор
Эксперт .NET
15466 / 10712 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
04.04.2019, 17:20 2
Linder666, несколько замечаний-рекомендаций.

1) Первое, что надо изучить в WPF это компоновка UI элементов. Свойство Margin нужно для задания расстояния между элементами, а не их положения. Не изучив WPF компоновку идти дальше бессмысленно.

2) WPF дефолтно предназначено для использования с MVVM. Без MVVM это подобно забиванию гвоздей микроскопом. Конечно, можно, но ужасно неудобно.

3) Вы пишите за скорость. Скорость это производная от времени. Но я что-то не увидел у Вас в проекте ни одного таймера.
Я или что-то пропустил, или Вы под скоростью что-то другое имеете ввиду?

Добавлено через 1 минуту
P.S. Прочитайте темы из цикла Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп]
0
0 / 0 / 0
Регистрация: 13.06.2015
Сообщений: 10
05.04.2019, 15:09  [ТС] 3
Элд Хасп, Запустите программу, и выберите любой вид движения под графой статический вид. Поводите мышкой над этими Radoibutton`ами, а потом уберите её за пределы окна, и сравните как быстро бежит зеленый квадрат по полю
0
Модератор
Эксперт .NET
15466 / 10712 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
05.04.2019, 15:19 4
Лучший ответ Сообщение было отмечено Linder666 как решение

Решение

Цитата Сообщение от Linder666 Посмотреть сообщение
Запустите программу, и выберите любой вид движения под графой статический вид. Поводите мышкой над этими Radoibutton`ами, а потом уберите её за пределы окна, и сравните как быстро бежит зеленый квадрат по полю
Я это вижу и понял сразу.
Я Вам пишу за другое. Если Вы хотите обеспечить одинаковую СКОРОСТЬ, то надо учитывать, что скорость это производная от времени. В для определения времени нужны ТАЙМЕРЫ. А у Вас их нет.

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

Вам перед каждым шагом надо определять прошедшее время с предыдущего шага. И перемещаться на расстояние пропорциональное прошедшему промежутку.
1
0 / 0 / 0
Регистрация: 13.06.2015
Сообщений: 10
05.04.2019, 16:10  [ТС] 5
Элд Хасп, Благодарю за совет.
Действительно, как у меня и были задумки насчёт этого, нужно было считать время выполнения кода. Возможно многим это покажется костылем, но... :

Кликните здесь для просмотра всего текста
Модификация CursorAndTarget.cs
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
namespace SeekAndDestroy {
   class CursorAndTarget :  INotifyPropertyChanged {
   ...
       public void Demostration() {
            Stopwatch stopWatch = new Stopwatch();
            while (true) {
                this.Cur_X = this.points[0, 0];
                this.Cur_Y = this.points[0, 1];
                for (int step = 0; step < this.points.GetLength(0) - 1; step++) {
                    double max = Math.Abs(this.points[step, 0] - this.points[step + 1, 0]) > Math.Abs(this.points[step, 1] - this.points[step + 1, 1]) ?
                        Math.Abs(this.points[step, 0] - this.points[step + 1, 0]) + 1 : Math.Abs(this.points[step, 1] - this.points[step + 1, 1]) + 1;
                    this.Cur_dx = (this.points[step + 1, 0] - this.points[step, 0]) / max;
                    this.Cur_dy = (this.points[step + 1, 1] - this.points[step, 1]) / max;
                    int count = 0;
                    while (count < max) {
                        stopWatch.Restart();
                        this.Cur_X += this.Cur_dx;
                        this.Cur_Y += this.Cur_dy;
                        while (stopWatch.ElapsedMilliseconds < 10) ; //выделение на блок кода 10 миллисекунд
                        count++;
                    }
                } //цикл шагов по точкам
            } //цикл проходов
        }
...
0
Модератор
Эксперт .NET
15466 / 10712 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
05.04.2019, 16:19 6
Цитата Сообщение от Linder666 Посмотреть сообщение
нужно было считать время выполнения кода. Возможно многим это покажется костылем, но...
Вообще, для ООП надо делать немного другую реализацию.

Что-то в таком духе.
Функция перемещения - это функция объекта (зелёного ромба).
Должен быть объект. В нём функционал его перемещения. Перемещение основано на внутреннем таймере.
Внешний код передаёт в это объект направление и скорость перемещения.
Объект во внешний код сообщает через события о изменении состояния (новых координатах), коллизиях (достижения границы, захват).

Добавлено через 1 минуту
Вот этот цикл while (stopWatch.ElapsedMilliseconds < 10) ; откровенный костыль.
0
05.04.2019, 16:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.04.2019, 16:19
Помогаю со студенческими работами здесь

Перенаправление выполнения с одного потока в другой. Не UI потоки
Всем привет. Знает кто-нибудь, как такое можно осуществить? Признаюсь, не сильно копал в эту...

Приостановка потока до выполнения какого либо события
Пишу клиент - серверное приложение где в методе для продолжение работы нужно дождаться ответа от...

Как получить скорость потока (kbps/s) wav файла
Как получить скорость потока (kbps/s) *.wav файла без использования сторонних библиотек?

Не могу достать данные из потока во время выполнения цикла
Доброго времени суток. Проблема вот в чём: есть код формы private void button1_Click(object...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru