Conteo continuo con Batch (Ayuda)

<< < (2/2)

Eleкtro:
Cita de: Mr. Bit en  9 Marzo 2024, 17:42 pm

he visto que un chico creó un juego llamado "Gem Miner" utilizando puramente Batch

Sin más información, cabe la posibilidad de que parte del código esté escrito en Batch-Script, y parte en otros lenguajes, es decir un código híbrido, para sortear las limitaciones del primero.

También cabe la posibilidad de que el juego dependa del uso de "comados externos" (aplicaciones de terceros por línea de comandos) para llevar a cabo esas tareas limitadas en Batch-Script.

Si no te importase emplear lenguajes adicionales en tu proyecto de Batch para "hibridarlo", entonces te sugiero usar PowerShell para llevar a cabo de forma más fácil y sofisticada lo que quieras hacer.


Cita de: Tachikomaia en  9 Marzo 2024, 18:30 pm

¿Puedes captar la hora del sistema?

La cuestión no parece ser como asignar la hora actual del sistema a una variable, ni como realizar operaciones aritméticas con los segundos, sino hacerlo con un mínimo de precisión sin interrumpir la ejecución del script.

De todas formas, y para aclarar tu duda, sí, la hora actual del sistema se puede obtener mediante el valor de la variable dinámica %TIME%, y se puede asignar los segundos actuales (00~59) a una variable local.


Cita de: Tachikomaia en  9 Marzo 2024, 18:30 pm

¿hay algún modo de captar la hora del sistema y restarle la hora inicial?

Veo que ChatGPT es extremadamente inútil hasta para intentar resolver cuestiones básicas de programación por lotes con Batch-Script. Como para confiar en sus afirmaciones y en sus códigos al formularle preguntas sobre lenguajes de programación que no se limiten al uso de treinta comandos contados, documentados y exprimidos al máximo durante décadas. Vaya una IA, ¡no sabe hacer nada de forma óptima!.

Realizar una llamada a las clases de la infrastructura WMI mediante wmic.exe supone una ralentización elevada e innecesaria en el tiempo de respuesta de cualquier aplicación. Supone una interrupción bastante medible (a veces puede tardar hasta 2-3 segundos. Depende de cómo se realice la solicitud a WMI, qué clase y que propiedades), y no hay necesidad de ello pudiendo obtener le hora actual de forma inmediata mediante el valor expuesto a través de la variable dinámica %TIME% como ya expliqué.

Pero estas cosas no son para hacerlas en Batch-script, insisto una vez más, no es la forma óptima, ni tampoco la más sencilla. Sus limitaciones implican recurrir al ingenio para acabar sorteando dichas limtiaciones mediante la creació de algoritmos tediosos (y feos, e imprecisos) que en muchos casos incluso podrían ser simplificados en una sola línea de código en otros lenguajes de programación.

**Aincrad**:
Cita de: Eleкtro en  9 Marzo 2024, 18:24 pm

Esa es la naturaleza de Batch-script. Los archivos por lotes no entienden de conceptos como hilos que trabajen de forma asincrónica realizando tareas en segundo plano sin interrumpir el flujo de la aplicación. Se puede simular algo, pero es muy limitado.

Lo que solicitas hacer, lo podrías hacer perfectamente en otro lenguaje de programación, pero no puedes hacerlo con la precisión necesaria en una herramienta tan limitada como es Batch. Y cualquier cosa que veas similar a lo que solocitas, será una mera simulación imprecisa haciendo saltos "GoTo" o "Call" entre etiquetas u otras formas muy enrevesadas que se me ocurren, por ejemplo, mediante la ejecución de un script adicional que vaya guardando el tiempo transcurrido en segundos en un archivo intermediario de texto plano, y desde el script principal simplemente lees el contenido del archivo intermediario para obtener los segundos transcurridos...

Aquí abajo te muestro un ejemplo de esa metodología.

De esta forma se logra evitar la interrupción de la ejecución del script principal, pero no esperes precisión en términos de mostrar segundo a segundo (1+1) en pantalla. Y además, tiene sus complicaciones, ya que el archivo intermediario puede estar en uso, siendo escrito por el script adicional, al mismo tiempo que se intenta leer desde el script principal, causando errores (que se pueden silenciar) y mayor imprecisión causando 1 segundo de retraso cada vez que no se pueda leer el archivo, o que el archivo contenga el mismo valor por que el script adicional todavía no haya completado el intervalo de 1 segundo (del comando TIMEOUT) para escribir el nuevo valor en el archivo intermediario.

Con el comando SETX para crear variables de entorno y el modificador /F para extraer el valor desde un archivo de texto, también se puede hacer algo parecido, pero sería incluso más enrevesado.

Este tipo de cosas no son para intentar hacerlas en Batch, insisto. Quizás haya una metodología más eficiente que esta, pero no creo que merezca la pena investigar siendo Batch.

Por último, te muestro el ejemplo:

Timer.cmd
Código
@Echo Off
 
(ECHO+)>"%TEMP%\ElapsedSeconds.tmp"
FOR /L %%# IN (1, 1, 9999999) DO (
(
TIMEOUT /T 1 /NOBREAK
    ECHO:%%#>"%TEMP%\ElapsedSeconds.tmp"
   )1>NUL 2>&1
)
 
Exit /B 0

Script Principal.cmd
Código
@Echo Off
SetLocal EnableDelayedExpansion
 
Start /B "" CMD /K "Call Timer.cmd"
 
SET /A "PreviousValue=0"
SET /A "ElapsedSeconds=0"
 
FOR /L %%# IN (0, 1, 9999999) DO (
(
TIMEOUT /T 1 /NOBREAK
FOR /F "UseBackQ Tokens=* Delims=" %%_ IN (
"%TEMP%\ElapsedSeconds.tmp"
) DO (
SET /A "ElapsedSeconds=%%_"
)
)1>NUL 2>&1
 
If !ElapsedSeconds! NEQ !PreviousValue! (
ECHO:Elapsed Seconds: !ElapsedSeconds!
SET /A "PreviousValue=!ElapsedSeconds!"
)
)
 
Pause
Exit 0



Aténtamente,
Elektro.



algo como eso es exactamente lo que tenia en mente, sin embargo es extremadamente ineficiente , para realizar un juego como un RPG, definitivamente será necesario correr código de forma asincrónica ... pero bueno... ya se le advirtió.

Tachikomaia:
¿No se puede hacer algo como:
Código:

Repetir:
  Actualizar el tiempo.
  Si el jugador presiona tecla:
    Hacer tarea.
mientras...
?

Navegación

[0] Índice de Mensajes

[*] Página Anterior