Wie mache ich einen 60 sekunden Timer in batch der im Hintergrund läuft?

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.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

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)