gpt4 book ai didi

java - 以编程方式按住java键

转载 作者:太空宇宙 更新时间:2023-11-04 06:54:18 26 4
gpt4 key购买 nike

好吧,我已经找了一整天了,但没有结果。也许有人可以帮忙。

我正在尝试以编程方式在我的java程序中生成一个按键“按住”的情况。让我解释一下情况:

我不断地监听某个事件。考虑 2 个事件“A”和“B”。如果发生事件 A,我想按住键盘键(X),如果发生事件“B”,我想释放键(X)。现在最重要的是,这一切都必须是一个副进程,所以即使 A 发生,我也可以监听事件 B。

我尝试过创建一个单独的线程,在其中创建一个无限循环,使用java中的“Robot”按键,但事实证明这是实现这一目标的最低效的方法,因为它消耗了超过60%的CPU。我尝试通过更改状态来实现此目的,但似乎没有找到一种方法来限制按键,仅在我想要的时候进行更改。

如果可能的话,我希望有一个没有任何无限循环的解决方案,因为我已经使用 1 来监听事件发生。 (欢迎提出建议)

这是我的线程代码:

public class KeyPress implements Runnable {
public String command;

public void run() {
try {
Robot r = new Robot();

while (true) {
//System.out.println(command);
if (command.equals("up")) {
r.keyPress(KeyEvent.VK_UP);
r.delay(20);
r.keyRelease(KeyEvent.VK_UP);
} else if (command.equals("finish")) {
break;
}
}

} catch (Exception e) {
System.out.println(e);
}
}
}

线程的实例像往常一样在我的主类中创建。另外,如果有人可以解释这一点 - 当我删除或注释掉

System.out.println(command);

语句(如您在代码中看到的),该线程停止工作。如果我添加这个,它就会起作用。虽然这个问题是次要的,但它仍然是一个不可行的解决方案。

最佳答案

好吧,经过漫长而疲惫的尝试来解决这个问题,我想我可能有一个解决方案。

首先,每次事件“A”发生时我都会创建一个线程,尽管它与以前相同。当事件“B”发生时,我中断线程,使其退出。由于这些事件“A”和“B”交替发生,因此这适用于 CPU 使用问题。

另一个优化,也可能是必须编写 print() 语句问题的答案,是我将变量 command 设置为 volatile 。正如所解释的here ,编译器优化很可能是我面临的问题。

以下是这些更改后的代码:

public class KeyPress implements Runnable {
public volatile String command;

public void run() {
try {
Robot r = new Robot();
while (command.equals("up") && !Thread.currentThread().isInterrupted()) {
r.keyPress(KeyEvent.VK_UP);
r.delay(20);
}
} catch (Exception e) {
System.out.println(e);
}
}
}

我希望这对某人有所帮助,并且有人可以提供有关如何改进它的建议。

关于java - 以编程方式按住java键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22950318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com