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

指定されたコードのもう 1 つの問題は、無限再帰のケースがあることです。

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 に答える