我制作一个机器人程序,我想在一段时间间隔内发送一些键盘键。
这是我的帖子中的代码。我记录了:" 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();
}
答案 0 :(得分:0)
那是因为通过让你的UI线程处于睡眠状态,你会阻止消息循环处理'F'键按下。您需要在不同的线程上运行代码,或者避免使用Thread.Sleep,请尝试使用System.Windows.FOrms.Timer。
答案 1 :(得分: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命令添加解释指令是个好主意,它将从调用方法返回。从长远来看,考虑重构以无限循环运行并具有终止条件。