1 (изменено: Arigato, 2025-09-02 21:21:05)

Тема: CMD/BAT: Многозадачность

Для реализации некоторого параллельного программирования в CMD можно использовать такую команду:

start /b имя.cmd

Параметр /b позволяет запустить скрипт имя.cmd в том же консольном окне, при этом основная программа продолжает выполнение, а имя.cmd работает совместно, разделяя с ней потоки ввода-вывода.

Вот такой пример. Батник main.cmd:

@echo off
setlocal enabledelayedexpansion

cls
set test_var=Hello, second
start /b second.cmd

FOR /L %%i IN (0,1,10) DO (
	echo Thread_1: %%i
	timeout /t 1 >nul
)

set test_var=Goodby, second
echo Thread_1 ending

Батник second.cmd:

@echo off

echo %test_var%

FOR /L %%i IN (0,1,10) DO (
	echo Thread_2: %%i
	timeout /t 2 >nul
)

echo Thread_2 ending
echo %test_var%

Виден параллельный вывод в одну и туже консоль. При этом имеется возможность "передать" все данные из основной программы в параллельный поток. В примере это переменная test_var. Однако в second.cmd создается лишь ее копия, то есть не получится менять значение переменной одного потока из другого.

Если все же надо наладить взаимодействие двух потоков, то придется использовать общий файл.

Где можно использовать на практике?

Например, команда choice не просто считывает нажатую клавишу, но и останавливает выполнение до того, пока пользователь не нажмет клавишу. Если нам надо отслеживать нажатые клавиши, при этом не тормозить основной поток, то обработку клавиатуры можно вынести в отдельный поток. Например:

@echo off
:loop
choice /c YN /n /cs
echo %errorlevel% > input.txt
goto loop

Нажатая клавиша окажется в файле input.txt (точнее ее порядковый номер в списке). От туда основной поток в нужный момент может произвести чтение, не останавливая своей работы на ожидание нажатия клавиши.

Это лишь один пример, можно придумать и другие способы применения подобной многопоточности.