0

我制作了一个机器人程序,我想在某个时间间隔之间发送一些键盘键。

这是我线程中的代码。我记录了:“F”点击然后等待 4 秒然后“S”、“A”、“Q”点击。问题是等待时间(4秒),然后所有后者都以“fsaq”的顺序弹出......

public void Run()
    {
        Thread.Sleep(3000);
        for (int i = 0; i <= Form.BotEvents.Items.Count - 1; i++)
        {
            string[] EventText = Form.BotEvents.Items[i].ToString().Split(' ');
            if (EventText[2] == "Time")
            {
                Thread.Sleep(Convert.ToInt32(EventText[3]));
            }
            else
            {
                SendKey(EventText[3]);
            }
            Thread.Sleep(100);
        }
        Run();
    }
4

2 回答 2

0

这是因为通过让您的 UI 线程进入休眠状态,您可以防止消息循环处理“F”键按下。您需要在不同的线程上运行您的代码,或者避免使用 Thread.Sleep,尝试使用 System.Windows.FOrms.Timer。

于 2012-06-12T18:34:32.040 回答
0

给定代码的另一个问题是您遇到了无限递归的情况。

public void Foo
{
    for(int i = 1; i < 100; i++)
    {
        if( i % 2 == 0 )
        {
            Console.WriteLine("Foo: " + i);
        }
        else
        {
            Console.WriteLine("Bar: " + i);
        }
    }

    Foo();
}

看到这里的问题了吗?没有终止条件。这个机器人将运行,运行,直到它最终耗尽内存(这会发生,因为该方法永远不会结束,因此垃圾收集永远不会发生,除非在 if 和 for 循环的边界内。)

在短期内,最好为某种 End 或 Done 命令添加解释指令,该指令将从调用方法返回。从长远来看,考虑重构以在具有终止条件的无限循环中运行。

于 2012-06-12T18:55:34.380 回答