【问题标题】:c# while loop prevents form from loadingc#while循环阻止表单加载
【发布时间】:2014-08-30 17:59:50
【问题描述】:

我正在 C# 中的 WindowsForms 应用程序中创建“Main()”函数。我一直在关注一本关于 C# 游戏编程的书。当我运行示例时,一切正常,但当我尝试制作自己的版本时,一切都没有。

这是 Main() 函数:

    public void Main()
    {
        while (!gameOver)
        {
            // Non timed code:           
            int ticks = Environment.TickCount;
            if (ticks > lastTick + 16)
            {
                lastTick = ticks;
                //Timed (60FPS) code here:
                Application.DoEvents();  
            }
        }
    }

当我把它放在“Form1_Load”函数中时,当我启动程序时,表单甚至不显示,同时没有给出任何错误或警告(在运行的示例中也是如此)。如果我将“Main()”移动到例如“MouseClick”并显示表单,当我单击时,该函数开始正常运行。

我真的不知道为什么会发生这种情况。我在这里遗漏了一些非常明显的东西吗?

【问题讨论】:

  • 如果这是您的全部主要功能(假设它在 Program.cs 文件中),那么您永远不会加载要显示的表单。
  • 在页面加载时设置一个断点,然后检查您的代码。可能一个因素是check that gameOver 返回 false
  • 这本书有多久了?无论如何,DoEvents 都是一个坏主意。

标签: c# winforms while-loop main


【解决方案1】:

表单的 Load 事件并不是开始游戏循环的最佳位置。 Load 将被触发有两个基本原因。 “好”的方式是在响应 Show() 调用时发生,通常出现在 Program.Main() 方法中。您的游戏循环将起作用。

“糟糕”的方式是表单构造函数中的代码要求表单的 Handle 属性有效。这迫使 Winforms 创建本机窗口并触发 Load。这仍然通常会有一个好的结局,越复杂,几率就越低。

在您的情况下会出错,因为 Load 事件处理程序不会返回。这意味着构造函数无法完成。这意味着窗口不能变得可见。这意味着“gameOver”永远不会成为现实。游戏结束。您使用调试器对此进行诊断,在 Load 事件处理程序上设置断点并查看 Call Stack 窗口。期望您会在构造函数中看到导致问题的语句。

最后但同样重要的是,要非常警惕this failure mode

真正的解决方法是将此代码放在正确的位置。在 Program.Main() 方法中。大致:

    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        // Application.Run(new Form1());   Not this anymore
        var window = new Form1();
        window.Show();
        // Your game loop here
        //...
    }

【讨论】:

    【解决方案2】:

    您可以尝试将循环逻辑放在静态 void 方法中并在线程上执行它

    这样它会以它快乐的方式进行,表单会继续加载

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多