So che posso utilizzare ReadKey per questo, ma congelerà l'app fino a quando l'utente non preme un tasto. È possibile (nell'app della console) avere un ciclo in esecuzione e continuare a essere in grado di reagire? Posso solo pensare agli eventi ma non sono sicuro di come usarli in console. La mia idea era che il ciclo controllasse l'input durante ogni iterazione.C# durante la lettura dell'input dell'utente senza interrompere un'app
6
A
risposta
7
Essi modo in cui mi hanno fatto questo per la mia propria applicazione era di avere un thread dedicato che mette in System.Console.ReadKey(true)
e mette i tasti premuti (ed eventuali altri eventi) in una coda di messaggi.
Il thread principale serve quindi questa coda in un ciclo (in modo simile al ciclo principale in un'applicazione Win32), assicurando che il rendering e l'elaborazione degli eventi siano tutti gestiti su un singolo thread.
private void StartKeyboardListener()
{
var thread = new Thread(() => {
while (!this.stopping)
{
ConsoleKeyInfo key = System.Console.ReadKey(true);
this.messageQueue.Enqueue(new KeyboardMessage(key));
}
});
thread.IsBackground = true;
thread.Start();
}
private void MessageLoop()
{
while (!this.stopping)
{
Message message = this.messageQueue.Dequeue(DEQUEUE_TIMEOUT);
if (message != null)
{
switch (message.MessageType)
{
case MessageType.Keyboard:
HandleKeyboardMessage((KeyboardMessage) message);
break;
...
}
}
Thread.Yield(); // or Thread.Sleep(0)
}
}
+0
Hmm, vedo, quindi non credo che sia un modo semplice per farlo. Grazie – Ptr
1
Far eseguire il ciclo in una filettatura separata.
class Program
{
private static string input;
public static void Main()
{
Thread t = new Thread(new ThreadStart(work));
input = Console.ReadLine();
}
private static void work()
{
while (input == null)
{
//do stuff....
}
}
}
Sicuramente si desidera che l'app sia pronta ad accettare l'input dell'utente, quindi premendo un tasto è possibile eseguire alcune funzionalità. O è come premere un pulsante per annullare l'elaborazione ?? – jimplode
Sì, ma un buon esempio è un gioco - è necessario eseguire un ciclo (movimento nemico, qualunque), ma registrare ancora l'ingresso del giocatore – Ptr