Параллельное выполнение процессов оболочки

Один из способов - не называть выходные файлы windres расширением .o. Если вы выберете другое расширение, у вас не будет этой проблемы.

Другой способ заключается в использовании статических шаблонных правил для windres целей:

RCOBJ := $(patsubst %.rc,%.rc.o,$(wildcard *.rc))
OBJ = menu_one.o $(RCOBJ)

  ...
$(RCOBJ) : %.rc.o : %.rc
        windres $^ -o $@

Поскольку статические шаблонные правила являются сокращением для создания явных правил и не являются неявными правилами, они не участвуют в поисках, поэтому у make не будет круговой зависимости.

ETA

ОК. Я создал ваш пример локально. Используя make -d, мы можем видеть, что происходит: make нуждается в build menu_one.rc.o, и он находит наше правило с предварительным условием menu_one.rc. Затем ему нужно посмотреть, сможет ли он перестроить manu_one.rc, и найти общее правило шаблона для построения исполняемых файлов:

%: %.o ; ...

Сопоставление этого шаблона с целью menu_one.rc дает предварительное условие menu_one.rc.o и у вас есть петля.

Вам нужно уведомить make, что файлы *.rc являются исходными файлами, и make не должна пытаться их создавать. Вы можете сделать это, объявив терминальное правило . В руководстве по сборке GNU make содержится подробное обсуждение тонкостей работы с правилами для любых совпадений (правилами с целью только из %, которая соответствует любой цели).

Добавьте это, чтобы сообщить make, что ваши .rc файлы являются терминальными (то есть они не могут быть собраны из чего-то другого):

%.rc:

43
задан Dirk Vollmar 24 March 2009 в 09:23
поделиться

3 ответа

GNU xargs в соответствии с Linux имеет "-P n", переключаются для запуска процессов "n" параллельно.

Возможно, сборка cygwin/mingw xargs также поддерживает это?

Затем можно использовать:

xargs -P 4 processFile < fileList

Никакое необычное порождение процесса мультиузла, все же.

5
ответ дан Dirk Vollmar 26 November 2019 в 22:39
поделиться

Попробовать start:

start "title of the process" "P:\ath\to.exe"

Это открывает новое окно с данным заголовком и выполняет the Bat, Командный файл или EXE-файл. Можно также установить приоритет, установить ту же среду и т.д.

Файл быть не executeable открыто со связанной программой.

Дальнейшее чтение: Запустите-> Выполнение

cmd /k start /?

Запуск доступен, по крайней мере, начиная с WinME.

Удачи!

23
ответ дан guerda 26 November 2019 в 22:39
поделиться

Больше кажется, что Вы хотите использовать Powershell 2. Однако можно метать икру новый cmd окна (или другие процессы) при помощи start, см. также этот ответ. Хотя, вероятно, необходимо использовать некоторые другие инструменты, и немного обмана для создания чего-то как "процесс объединяют" (чтобы иметь только максимум n экземпляров, работающих за один раз). Вы могли достигнуть последнего при помощи tasklist /im и подсчет, сколько уже там (for цикл или wc, если применимо), и просто ожидают (ping -n 2 ::1 >nul 2>&1) и перепроверьте снова, можно ли породить новый процесс.

Я починил немного тестового пакета для этого:

@echo off
for /l %%i in (1,1,20) do call :loop %%i
goto :eof

:loop
call :checkinstances
if %INSTANCES% LSS 5 (
    rem just a dummy program that waits instead of doing useful stuff
    rem but suffices for now
    echo Starting processing instance for %1
    start /min wait.exe 5 sec
    goto :eof
)
rem wait a second, can be adjusted with -w (-n 2 because the first ping returns immediately;
rem otherwise just use an address that's unused and -n 1)
echo Waiting for instances to close ...
ping -n 2 ::1 >nul 2>&1
rem jump back to see whether we can spawn a new process now
goto loop
goto :eof

:checkinstances
rem this could probably be done better. But INSTANCES should contain the number of running instances afterwards.
for /f "usebackq" %%t in (`tasklist /fo csv /fi "imagename eq wait.exe"^|find /c /v ""`) do set INSTANCES=%%t
goto :eof

Это порождает максимум четырех новых процессов, которые выполняются параллельно и минимизированный. Время ожидания должно быть скорректировано, вероятно, в зависимости от того, сколько делает каждый процесс и сколько времени он работает. Вероятно, также необходимо скорректировать имя процесса, для которого список задач смотрит при выполнении чего-то еще.

Нет никакого способа правильно считать процессы, которые порождены этим пакетом, все же. Один путь состоял бы в том, чтобы создать случайное число в начале пакета (%RANDOM%) и создайте пакет помощника, который делает обработку (или порождает программу обработки), но который может установить ее заголовок окна на параметр:

@echo off
title %1
"%2" "%3"

Это было бы простым пакетом, который устанавливает его заголовок на первый параметр и затем выполняет второй параметр с третьим как аргумент. Можно затем просочиться, список задач путем выбора только обрабатывает с указанным заголовком окна (tasklist /fi "windowtitle eq ..."). Это должно работать довольно надежное и предотвращает слишком много ложных положительных сторон. Поиск cmd.exe была бы плохая идея, если у Вас все еще есть некоторое выполнение экземпляров, поскольку это ограничивает Ваше объединение рабочих процессов.

Можно использовать %NUMBER_OF_PROCESSORS% создать разумное значение по умолчанию сколько экземпляров для порождения.

Можно также легко адаптировать это для использования psexec порождать процессы удаленно (но не было бы очень жизнеспособно, поскольку Вы должны иметь административные привилегии на другой машине, а также обеспечить пароль в пакете). Необходимо было бы использовать названия процесса фильтрации затем, все же.

19
ответ дан Community 26 November 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: