Wie mache ich einen 60 sekunden Timer in batch der im Hintergrund läuft?
Ich programmiere ein kleines Spiel mit Batch (Ich weiß man kann sehr viel einfacher Spiele programmieren aber zur Abwechslung wollte ich mal eins in Batch machen) der Spieler soll in einer bestimmten zeit möglichst viele Punkte bekommen. Ich bekomm aber keinen Timer hin da mit timeout auch auf die abfrage für wasd und den rest gewartet wird.
3 Antworten
Schwere Kost...
Batch ist nicht Multithreading fähig. Damit kann ein Batchprozess auch nur brav ein Kommando nach dem anderen abarbeiten .
startet man einen Prozess mit start "" "programm" wird dieser von der aufrufenden Batch entkoppelt und läuft parallel. ...aber bekommt ein eigenes Set an Umgebungsvariablen und kann nicht mehr mit der aufrufenden Batch über diese kommunizieren.
Da Batch über keinen Mechanismus verfügt irgendwelche Asynchronen Ereignisse abzufragen muss man sich etwas basteln, das irgendwie als generiertes Ereignis gelten könnte, zum Beispiel die Existenz einer zuvor nicht vorhandenen Datei.
Das nutze ich auch, denn die Existenz einer Datei lässt sich sehr leicht abfragen.
if exist "fileName.ext" machwas
dann muss noch geregelt werden, das wenn keine Taste gedrückt wird die Batch auch weiter läuft.
Das kann Choice mit dem Parametern /t und /d (mit /t 1 läuft choice nach einer Sekunde ohne Tastendruck weiter)
Die folgende Batch beinhaltet Zwei separate Prozesse in einer Datei!
demo.cmd
@echo off
chcp 65001 >nul
set "self=%~f0"
set "FlagFile=Signal.txt" &rem name der Signaldatei
set "AblaufZeit=10"
if "%~1"=="timer" goto :timertask
start "" /min cmd /c "%self%" timer &rem starte externen Abbruchtimer minimiert
Title Maintask
del /q "%FlagFile%" 2>nul
echo drücke wsad
:gameloop
rem wenn keine Taste gedrückt wird, löst choice selbst nach 1 Sekunde ein "x" aus
choice /c WSADx /n /t 1 /d x >nul
set "Key=%errorlevel%" :flagFound
rem prüfe ob die SignalDatei existiert
if exist "%FlagFile%" goto :flagFound
if %Key% equ 1 echo oben
if %Key% equ 2 echo unten
if %Key% equ 3 echo links
if %Key% equ 4 echo rechts
if %Key% equ 5 echo von selbst ausgelöst
goto GameLoop
:flagFound
echo Flagdatei "%FlagFile%" wurde vom externen TimerTread erzeugt!
echo Du hast verloren!
pause
exit /b
:timertask
title Timertask
timeout %AblaufZeit% >nul
rem schreibe Signaldatei wenn die Zeit abgelaufen ist
echo Ich bin nur ein Signal an einen anderen Thread >"%FlagFile%"
exit /b
Natürlich musst Du dafür sorgen, das alle Verzweigungen so schnell wie möglich zum Loop zurückkehren oder bei längeren subroutinen diese selbst zwischendurch die Flagdatei abfragen.
Sowas ist natürlich nur Eine Krücke...
Wie Du schon selbst bemerkt hast, Batch ist dafür völlig ungeeignet.
vor ein paar Jahren war was ähnliches mal aufgetaucht https://www.gutefrage.net/frage/timer-in-batch-im-hintergrund-laufen-lassen
..aber auch da gabs wohl keine wirklich erquickliche Lösung.
Ein zweites Fenster mit dem Timer per timeout drüber
Könntest du mir erklären wie das geht (ich kenne mich mit Batch nicht so gut aus)