0

キーボードとマウスの入力を監視するスレッドがあります。ユーザーが私のプログラムのボタンをクリックすると、このスレッドがアクティブになり、ユーザーが特定の組み合わせを入力すると、以下のサンプルコードのメソッドtest()が呼び出されます。したがって、このtest()メソッドにある間、スレッドは明らかに私の入力を監視できません。したがって、このスレッドは、これが終了するまで別のメソッドを呼び出すことができないため、spacePressedがtrueになることはありません。

 public void test()
{
    spacePressed = false; 
    while(!spacePressed)
    {
        pasteAtCursorLocation("Test");
        sleepy(1000);
    }
}

したがって、入力を監視する別のスレッドを作成して、スペースを押すと、特定の関数呼び出しにtrueを返すことができます。それが私が望むことをするように?

public void test()
{
    SpaceWatcher sw = new SpaceWatcher();
    sw.start();
    while(!sw.SpacePressed())
    {
        pasteAtCursorLocation("Test");
        sleepy(1000);
    }
}

しかし、これはSpaceWatcherを頻繁に効果的に呼び出すように呼びますか?つまり、スペースウォッチには、スペース入力の呼び出しの間に入力を監視するのに十分な時間がありますか?

編集:pasteAtCursorLocationはそれが言うように動作し、sleepyはThread.sleep(ms)を呼び出します

4

2 に答える 2

0

1000 ミリ秒のスリープは、コンピューターにとって非常に長い時間であるため、その間に他の作業を行うための十分な時間があります。関数はブール値のみを返します。SpacePressed()これは非常に安価なことです。

あなたのやり方は、スレッドが他の人に反応するための正しい方法です (物事があなたがしていることよりも複雑になると、他の多くの方法があります)。spacePressedただし、スレッド間でデータ (この場合は ) を共有する場合は、同期に注意する必要があります。それらは同期する必要があります。これは、 synchronizedキーワードを使用して実行できます。もう 1 つのオプションはspacePressed volatileを宣言することです。これは、非常に特殊な場合 (1 回だけ変更される単一のフラグや、true-false-true の変更を見逃してもかまわない場合など) でのみ使用できます。

于 2013-02-05T14:59:49.810 に答える
0

おそらく、メソッドを新しいスレッドに移動し、イベント ハンドラーからtest()共有フィールドを操作する必要があります。spacePressed

そうすれば、変数が false になり、イベント ハンドラーが OS によって駆動されるまで、いくつかの魔法を実行するバックグラウンド スレッドが作成されます。

通常、スレッドを使用してキーボードとマウスを監視することはお勧めできません。OS から送信されたイベントはすでに非同期です。特別なスレッドでそれらを待つことは、同じことを 2 回行うようなものです。

代わりに、イベント ハンドラによって送信された「イベント」に応答するワーカー スレッドを使用します。キューを調べます

イベント ハンドラー:

if( spaceWasPressed( keyboardEvent ) ) {
    queue.put( new SpaceWasPressed() );
}

ワーカー スレッド:

while( queue.poll( 1, TimeUnit.SECONDS ) == null ) {
    pasteAtCursorLocation("Test");
}
于 2013-02-05T14:57:02.823 に答える