使用XNA KeyboadInput在C#中进行线程化

时间:2012-10-26 23:38:17

标签: c# multithreading xna-4.0

我对线程有点新手(不是C#的新手,只是没有做太多的线程)。有人可以向我解释为什么这不起作用吗?

我有一个调用方法的线程,我称之为“循环”。循环包含一个将继续运行的while循环,并且在我想要它检查A Key是否关闭的每个循环上(使用XNA Framework中的Microsoft的Keyboard类)。但由于某种原因,它从未注意到任何事情都被压迫了。

static Thread thread = new Thread(Loop);
static bool abort = false;

public static void Begin()
{
    thread.Start();
}

private static void Loop()
{
    while (!abort)
    {
        if (Keyboard.GetState().IsKeyDown(Keys.A))
            Console.WriteLine("A pressed.");
    }
}

可能有人知道为什么从不调用Console.WriteLine()?

编辑:

我想我应该解释一下。我实际上要做的是在C#中创建类似于ActionScript事件的东西。所以我想传递一个“条件”和一个“动作”来调用,如果在包含这个线程的这个单独的类中满足该条件。这样做会让我只是向对象添加“事件监听器”,它会自动不断检查其中一个事件是否被触发,而不是让我在代码中编写If语句来检查事件。

在尝试这样做时,我测试的第一件事是关于这个XNA键盘的东西,因为这是我最初想要构建这个系统的原因之一,但它没有用。所以我创建了上面发布的独立代码,看看我是否在之前的代码中出错,但仍然没有用。

1 个答案:

答案 0 :(得分:2)

我从不使用XNA所以我没有真正“知道”但是我遇到了类似的情况,你无法从工作线程获得键盘(和其他)输入。我用谷歌搜索,发现在XNA中似乎确实如此。见this for example

因此,您需要(并且可能希望)在GUI线程中处理您的游戏输入。只检查每个更新刻度的输入应该没问题。我怀疑即使它确实有效,你也会获得任何性能 - 你可能会引入一些有趣的同步错误; - )

看起来你正确地创建了你的工作线程 - 这只不是它的应用程序。