<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; CMD/BAT: Многозадачность]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=18486&amp;type=atom" />
	<updated>2025-09-02T17:19:28Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=18486</id>
		<entry>
			<title type="html"><![CDATA[CMD/BAT: Многозадачность]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=162663#p162663" />
			<content type="html"><![CDATA[<p>Для реализации некоторого параллельного программирования в CMD можно использовать такую команду:</p><div class="codebox"><pre><code>start /b имя.cmd</code></pre></div><p>Параметр <strong>/b</strong> позволяет запустить скрипт имя.cmd в том же консольном окне, при этом основная программа продолжает выполнение, а имя.cmd работает совместно, разделяя с ней потоки ввода-вывода.</p><p>Вот такой пример. Батник <strong>main.cmd</strong>:<br /></p><div class="codebox"><pre><code>@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 &gt;nul
)

set test_var=Goodby, second
echo Thread_1 ending</code></pre></div><p>Батник <strong>second.cmd</strong>:<br /></p><div class="codebox"><pre><code>@echo off

echo %test_var%

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

echo Thread_2 ending
echo %test_var%</code></pre></div><p>Виден параллельный вывод в одну и туже консоль. При этом имеется возможность &quot;передать&quot; все данные из основной программы в параллельный поток. В примере это переменная test_var. Однако в second.cmd создается лишь ее копия, то есть не получится менять значение переменной одного потока из другого.</p><p>Если все же надо наладить взаимодействие двух потоков, то придется использовать общий файл.</p><p><strong>Где можно использовать на практике?</strong></p><p>Например, команда <strong>choice</strong> не просто считывает нажатую клавишу, но и останавливает выполнение до того, пока пользователь не нажмет клавишу. Если нам надо отслеживать нажатые клавиши, при этом не тормозить основной поток, то обработку клавиатуры можно вынести в отдельный поток. Например:<br /></p><div class="codebox"><pre><code>@echo off
:loop
choice /c YN /n /cs
echo %errorlevel% &gt; input.txt
goto loop
</code></pre></div><p>Нажатая клавиша окажется в файле input.txt (точнее ее порядковый номер в списке). От туда основной поток в нужный момент может произвести чтение, не останавливая своей работы на ожидание нажатия клавиши.</p><p>Это лишь один пример, можно придумать и другие способы применения подобной многопоточности.</p>]]></content>
			<author>
				<name><![CDATA[Arigato]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=29277</uri>
			</author>
			<updated>2025-09-02T17:19:28Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=162663#p162663</id>
		</entry>
</feed>
