1

Пишу змейку на WPF. Всё просто: сетка grid и зелёная точка (голова змеи). Хочу чтобы змейка, а для начала хотя бы её без брюшная часть, двигалась в заданном направлении, а при нажатии клавиш передвижения менялось направление её движения. Движение змейки хочу сделать в отдельный поток: змейка двигается постоянно, а в другом потоке обрабатывалось событие нажатия клавиши для смены направления.

    int x = 6;
    int y = 6;
enum Direction
{
    Left = 1, Right = 2, 
    Up   = 3, Down  = 4, Stop = 0
}
Direction DirectionMove;


public MainWindow()
{
    InitializeComponent();
    DirectionMove = Direction.Right;
    StartPosition(x, y);
    Thread moveSnake = new Thread(MoveSnake);
    moveSnake.Start();
}
public void MoveSnake()
{
    Random rnd = new Random();
    int r = rnd.Next(1, 13);
    Grid.SetColumn(SnakeHead, r);
}

Запускаю поток в MainWindow. Когда собираю проект не выдаёт никаких ошибок и пишет об успешной компиляции, но не появляется окна приложения.

Как угодно меняю код метода MoveSnake, но игра разве что может начать запускаться ненадолго и закрываться.

public void MoveSnake()
    {
        int i = 0;
        while (i < 5)
        {
            i++;
            Grid.SetColumn(SnakeHead, i);
        }
    }

Ощущение, будто после выполнения действий в потоке программа прекращает жизнь

  • В диспетчере задач процесса программы тоже нету, значит программа всё-таки запускается, а потом закрывается – Алексей Карпунов May 14 '23 at 16:06
  • 3
    В UI приложениях обычно есть основной UI поток и остальные не-UI потоки. Так вот менять UI элементы можно только из UI потока, а вы просто запускаете какой то новый поток и что то делать с гридом пытаетесь. Так это не сработает. У вас WPF? Вот и пользуйтесь проверенными годами приемами для WPF - читайте про привязки, MVVM и прочее – tym32167 May 14 '23 at 16:15
  • хорошо, начну рыть в эту сторону. Спасибо – Алексей Карпунов May 14 '23 at 16:16
  • 1
    https://ru.stackoverflow.com/a/1222168/373567 вы не можете работать с напрямую контролами из фонового потока – aepot May 14 '23 at 17:19
  • помимо указанной тут проблемы с изменением визуальной части (неправда, что это можно делать только из основного потока, главное из того, который создал контрол, так называемая STA модель), есть и другая проблема. исключения в дополнительных потоках по умолчанию не обрабатываются и о проблемах без регистрации своего обработчика не узнать. – Алексей Обухов May 14 '23 at 18:07
  • @АлексейОбухов я специально построил свой комментарий так, чтобы он не противоречил нескольким UI потокам (приглядитесь к тексту и увидите это), но при этом не перегружал автора этой информацией, так как она для него бесполезна. – tym32167 May 14 '23 at 19:33
  • @АлексейОбухов STA модель - это маршаллирование выполняемого кода в управляемом потоке в основной физический UI поток, разницы ноль, оно даже и называется Single-Threaded Apartment, однопоточное оно. И дедлоки те же, все как при работе с одним потоком. – aepot May 14 '23 at 21:54
  • UI поток может быть не один, как раз для избежания дедлоков – Алексей Обухов May 14 '23 at 22:36

0 Answers0