Итак, я учусь создавать свои собственные SerialConsole
в начос (Java).Я научился использовать Semaphore.P()
и Semaphore.V()
для ожидания ввода пользователя.Все идет хорошо, пока я не попытался сделать функцию типа getch()
в C * conio.h
.
. Проблема в том, что всякий раз, когда я вызываю Semaphore.P (), даже если вызывается Semaphore.V (), он всегда будет ждать нажатия клавиши Enter
, прежде чем возобновить работу программы.Я хотел, чтобы программа возобновлялась всякий раз, когда я нажимал клавишу.
Ниже приведен код, который я пробовал.
Console.java
public class Console {
private SerialConsole console;
private Semaphore sem = new Semaphore(0);
private Runnable send, recv;
private char tempChar;
public Console() {
console = Machine.console();
send = new Runnable() {
@Override
public void run() {
sem.V();
}
};
recv = new Runnable() {
@Override
public void run() {
tempChar = (char) console.readByte();
sem.V();
}
};
console.setInterruptHandlers(recv, send);
}
public String nextLine() {
String result = "";
do {
sem.P();
if (tempChar != '\n') result += tempChar;
} while(tempChar != '\n');
return result;
}
public char getch() {
sem.P();
return tempChar;
}
}
Main.java
public class Main {
private Console console;
public Main() {
console = new Console();
char c = console.getch();
System.out.println(c);
}
}
Что-то, что я пропустил, или есть какой-нибудь способ программно нажать клавишу Enter
или что-то еще?
PS: java.awt.Robot
нельзя использовать внутри проекта nachos.
Буду признателен за любую помощь.