Окно Winforms зависает - PullRequest
       8

Окно Winforms зависает

0 голосов
/ 16 декабря 2018

Winforms C #

Я внедряю систему включения в мою игру со змеями, и каждый раз, когда я запускаю метод, чтобы вызвать включение питания, окно полностью останавливается, как будто оно обрабатывает что-то тяжелое, но навсегда.я не получаю ни ошибки, ни окна, просящие закрыть окно.

это мой сценарий:

        private void spawn_powerup()
    {
        int r = random.Next(0, Powers.Length);
        foreach (Power_Up item in Powers)
        {
            if (item.code == r)
            {
                bool done = false;
                do
                {
                    int X = random.Next(0, grid_size);
                    int Y = random.Next(0, grid_size);
                    if (matriz[X, Y] == background_color)
                    {
                        matriz[X, Y] = item.Pixel_color;
                        done = true;
                        item.placed = true;
                    }
                } while (done);
                return;
            }
        }
    }

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

Вы никогда не устанавливаете done на false внутри вашего do-while-loop.

Так что, если на первой итерации ваше выражение if оценивается как true, done устанавливается на true иваш do-while работает вечно

Для того, что, я думаю, вы хотите достичь, измените ваше do-while условие на !done, но затем вы должны убедиться, что ваше условие if выполнено через некоторое время (но в игре со змеями это не должно быть проблемой).

0 голосов
/ 16 декабря 2018

Ваши условия цикла никогда не позволят ему остановиться, так как вы написали while(done), что означает: "while done установлен в true", что всегда так и есть.Вы должны изменить свой цикл на это:

bool done = false;
do
{
    (- your code here -)
} while (!done);
0 голосов
/ 16 декабря 2018

Прежде всего, ваша логика в то время как неправильно.Пока цикл продолжается, когда он установлен на true, и завершается всякий раз, когда он получает команду false или break;.

Также вы используете шаблон синхронного программирования.Таким образом, ваше приложение работает в одном потоке, и всякий раз, когда вы вызываете долго выполняющуюся функцию, оно начинает ждать завершения этой долго работающей функции.Затем возобновление продолжается.

Пожалуйста, обратите внимание на Асинхронное программирование на C # Другой Ссылка

...