Программизм |
|
|
|
Batch-файлы в Windows NT, часть 3 — синхронизацияВозвращаюсь к своей излюбленной теме — автоматизация нелёгкой трудовой деятельности программиста при помощи подручных средств, а именно — командного процессора Windows NT. Я намеренно пишу «Windows NT» вместо «Windows 2000» или, не к ночи будь помянута, «Windows XP» — то, что я предлагаю, вполне может работать и в NT, а исключения оговариваются отдельно. Тестируется и используется всё это в Windows 2000, причём ещё и русской. Если кого интересуют мои личные предпочтения, то из всего оконного семейства я предпочитаю Windows 2000 английскую. Но — к делу. Сегодняшняя задача формулируется так: нужно запустить процесс и дождаться его завершения. Вот самый простой способ это сделать: echo. | time | find "." program echo. | time | find "." Такой способ будет работать везде — хоть в Windows 9×, хоть в DOS. Однако есть существенный недостаток — наша программа может выдать что-нибудь на консоль, сделав её содержимое плохо читаемым. Пытливый ум спросит ещё, зачем я использую столь сложную конструкцию вместо Следующий способ более изощрён, но всё равно прост: echo. | time | find "." start /min /wait program echo. | time | find "." Ключ А теперь задача, ради которой и была написана вся эта заметка. Надо запустить несколько процессов, дождаться их окончания и двигаться дальше. Скорее всего, всё движение дальше будет состоять в том, чтобы записать в log время завершения и звуком из динамика позвать оператора. Очевидно, что эта задача стандартными средствами Windows NT не решается, поэтому снова придётся писать маленькую, но очень полезную утилиту. Почесав в затылке, можно понять, что существует объект синхронизации, идеально подходящий для решения такой задачи — семафор. Семафор допускает две операции над собой: увеличить счётчик и уменьшить счётчик. В Win32 эти операции реализуются функциями Итак, мы должны завести семафор. Пусть каждый завершающийся процесс увеличивает счётчик, а ожидающий процесс (мастер) — уменьшает, причём столько раз, сколько параллельных процессов планируется запустить. Таким образом, когда мастер выйдет из цикла ожидания, это будет означать, что все параллельные процессы завершены. Batch-файл должен сделать три вещи:
Чтобы предусмотреть запуск нескольких групп параллельных процессов, в командной строке можно передавать имя группы — оно будет использоваться для формирования имён объектов синхронизации. Вот пример такого batch-файла: echo. | time | find "." start sync s sample 3 start /min program1 ^& sync f sample start /min program2 ^& sync f sample start /min program3 ^& sync f sample sync w sample echo. | time | find "." Программа
Обратите внимание на Скачать программу можно, как обычно, в соответствующем разделе. Обратите внимание, что для синхронизации ожидающего процесса и процесса-мастера используется дополнительный объект — флаг (event). Ожидающий процесс пытается создать флаг уже взведённым, и если это удаётся, тут же завершается. Если это не удаётся, значит, такой флаг уже создан мастером, и надо просто дождаться его установки. Ссылки по теме (открываются в новом окне):
11.03.2003 |
ПоискСм. такжеОчевидно, что char поместится в int. Во многих моделях памяти размер указателя также равен размеру int. Следовательно, структуру можно заменить массивом... »»» Контрольный вопрос: какая из компонент аппаратуры сильнее всего влияет на скорость исполнения приложений?... »»» как правило обрабатывать надо не сегодняшние файлы, а файлы за несколько дней назад... »»» Рекомендую
e.g.Orius Copyright noticeъ) Все материалы, размещённые на странице, являются неотъемлемой собственностью автора с вытекающими отсюда правами, как ©, так и (ъ). Некоммерческое их распространение всячески приветствуется, разумеется, при условии сохранения ссылки на оригинал. Что касается коммерческого использования — пишите письма, договориться можно всегда. Удивительное рядом
Пишите письма
Счётчики |