0

フォームがロードされたときにmyMethod()呼び出され、いくつかのステートメントを実行します。if ステートメントに到達した時点で停止し、ユーザーが何らかのボタンを押すのを待ってから、ユーザーの操作に従って実行を継続します。私はThread.Sleep()ManualResetEvent objのWaitOne()メソッドを使用しましたが、プロセス全体がフリーズしているように見えますが、期限が切れるまで何もできません。KeyEventHandler はバックグラウンドで実行する必要があると思います。

public partial class Form1 : Form
{
    bool pressed = false;
    public Form1()
    {
        InitializeComponent();
        this.KeyPreview = true;
        this.KeyDown +=new KeyEventHandler(Form1_KeyDown);
    }

    void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.E)
        {
            pressed = true;
        }
    }

    void myMethod()
    { 
        while (someBool)
        {
            //do something
            if (pressed)
            //do this
            else 
            //do that
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        myMethod();
    }
}
4

3 に答える 3

0

メソッドを次のように開始してみてくださいTask

private void Form1_Load(object sender, EventArgs e)
{
    System.Threading.Tasks.Task t = new Task(() => myMethod());
    t.Start();
}

メソッドでテストするときは、次pressedのように設定しますfalse

void myMethod()
{ 
    while (someBool)
    {
        //do something
        if (pressed)
        {
            pressed = false;
            //do this
        }
        else 
        //do that
    }
}

もちろん、実際に で何をするかによっては、さまざまなマルチスレッド エラーが発生する可能性がありますmyMethod()。複数のスレッドで作業を開始する前に、スレッドの同期について調べることをお勧めします。

于 2012-12-09T12:28:05.113 に答える
0

タイマー コンポーネントをフォームに追加し、その間隔をユーザー入力を待機する期間 (ミリ秒単位) に設定します。

bool someBool = true;

public Form1()
{
    InitializeComponent();
    KeyPreview = true;
    timer1.Interval = 1000;
}

フォームのロード時にタイマーを開始:

private void Form1_Load(object sender, EventArgs e)
{
    timer1.Start();
}

タイマー Tick イベント ハンドラーを追加します。このイベントは、指定された待機タイムアウト (timer1.Interval) 中にユーザーがキーを押さなかった場合に発生します。また、このイベントはあなたのwhileループの代わりに定期的に発生します:

private void timer1_Tick(object sender, EventArgs e)
{
    if (someBool)    
        //do that
    else
        timer1.Stop();       
}

KeyDown イベント ハンドラーでタイマーを停止し、押されたキーを処理し、タイマーを開始して次のユーザー入力を待ちます (または入力do thatがない場合):

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    timer1.Stop();
    if (!someBool)
        return;

    if (e.KeyCode == Keys.E)
        // do this
    else
        // do that

    timer1.Start();
}
于 2012-12-09T13:14:47.027 に答える
0

ユーザー入力を待っている間、GUI スレッドをブロックしてはならないので、この問題に取り組む方法は良くありません。GUIスレッドがメッセージを処理できるように、できることは何でもしてからすぐに戻る必要があります。

  • Form1_Load で myMethod() を実行し、「何かを実行」(初期化) してからすぐに戻ります。ここでブロックしないでください。
  • KeyDown イベントで E を押すと、「これを行う」ことができます。その部分は簡単なはずです。
  • 「do that」をいつ実行するか (つまり、キーが押されていないとき) について少し混乱しています。このケースがいつ発生するかを明確にできますか?
于 2012-12-09T11:13:25.490 に答える