Форма C # не загружается до тех пор, пока анимация OpenGL не перестанет работать

#c# #forms #events #opengl #load

#c# #формы #Мероприятия #opengl #загрузить

Вопрос:

В настоящее время я работаю над проектом, который позволяет мне сравнивать некоторые выделенные для игр искусственные интеллекты (которые являются классами C #), заставляя их сравнивать одни с другими. Проект включает анимацию OpenGL для просмотра совпадений между этими классами.

Итак, в основном у меня есть форма, содержащая анимацию OpenGL, и другая форма, содержащая параметры и информацию о сравнении. Но, похоже, из-за моей анимационной формы остальная часть проекта зависает во время вычисления.

Вот код, когда я начинаю сопоставление:

         FormGL formGL = new FormGL();
        formGL.Show();


        // Variables declaration
        //
        // Variable declaration

        while (verifVictoire(plateau, _playerTurn) == false amp;amp; nombreTours < 64)
        {
            if (_playerTurn == 1) _playerTurn = 2;
            else _playerTurn = 1;
            try
            {
                // Calculation part
                if (_playerTurn == 1) resultat = _AIPlayer1.Joue(plateau, _playerTurn);
                else resultat = _AIPlayer2.Joue(plateau, _playerTurn);
                pion = resultat[2] * 16   resultat[1] * 4   resultat[0]   1;
                plateau[resultat[0], resultat[1], resultat[2]] = _playerTurn;
                nombreTours  ;

                formGL.affichPion(_playerTurn, pion); // Send the move to display in the animation
                Thread.Sleep(100); // Pause before next move
            }
            catch (IndexOutOfRangeException)
            {
                // Exception management
            }
        }
  

Когда я использую этот код, открываются обе формы, но ни одна из них не завершает загрузку до того, как анимация перестанет работать. Итак, я вижу только две формы (пустые), анимация обновляется корректно, но любой другой контент (ярлыки, меню, кнопки, …) невидим, пока анимация не перестанет работать.
Я знаю, что поток.Спящий режим влияет на текущий поток и может быть причиной, но даже если я удалю его, проблема все равно возникнет.

FormGL содержит эти методы (среди прочих, но я не думаю, что они могут быть ответственны за это)

 public FormGL()
    {
        this.CenterToScreen();
        InitializeComponent();
    }

private void FormGL_Load(object sender, EventArgs e)
    {
        GLPanel.InitializeContexts();
        Gl.glShadeModel(Gl.GL_SMOOTH);
        Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        Gl.glClearDepth(1.0f);
        Gl.glEnable(Gl.GL_DEPTH_TEST);
        Gl.glDepthFunc(Gl.GL_LEQUAL);
        GLWindow_Resize(this, null);
        Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
    }

public void affichPion(int Player, int Pion)
    {
        if (Pion != 0)
        {
            joueur[Pion - 1] = Player;
            positionJeton[Pion - 1] = Pion;
            GLWindow_Resize(this, null);
            GLPanel.Refresh();
        }
    }

public void GLWindow_Resize(object sender, EventArgs e)
    {
        float aspect = (float)GLPanel.Width / (float)GLPanel.Height; 
        Gl.glMatrixMode(Gl.GL_PROJECTION);
        Gl.glLoadIdentity();
        Gl.glViewport(0, 0, GLPanel.Width, GLPanel.Height);
        Glu.gluPerspective(60, aspect, 1.0, 300);
        Gl.glMatrixMode(Gl.GL_MODELVIEW);
        Gl.glLoadIdentity();

        Glu.gluLookAt(x, y, z, centerX, centerY, centerZ, upX, upY, upZ);
        Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
    }

private void FormGL_Resize(object sender, EventArgs e)
    {
        GLWindow_Resize(this, null);
        GLPanel.Refresh();
    }
  

Ответ №1:

Вы не даете форме никакого времени для рисования самой себя. Попробуйте поместить Application.DoEvents() прямо перед переходом в режим ожидания.

Однако я бы рекомендовал запустить цикл while в другом потоке, чтобы в первую очередь избежать этой проблемы.

Комментарии:

1. Вау, я даже не знал, что могу это сделать. Это именно то, что я искал, теперь моя проблема решена. Большое спасибо за вашу помощь, вы помогли мне сэкономить драгоценное время!