Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: START /B CMD или как можно потерять два часа
Форум на CrossPlatform.RU > Курилка > Трёп
Iron Bug
Ухх, как мне сегодня хочется купить значок " я ненавижу мелкософт!". Сегодня - особенно.
Итак, дело было так: сижу, пишу сложную консольную софтину, которая в риалтайме мониторит состояние железа и ведёт логи. Софтина многопоточная, главный поток запускает все остальные, выводит на экран добропорядочную строку "Для выхода нажмите Enter" и ждёт (getchar()), пока пользователю надоест смотреть в чёрный экран. По нажатию Enter главный поток оживает, сообщает всем остальным, что пора совершить суицид, выводит на экран пару строк о завершении и умирает сам.
Так вот....
Софтину желательно запускать в риалтайме. Я, понятное дело, не мудрствуя лукаво, состряпала батник такого содержания:
start /REALTIME CMD /C Foo.exe

(где Foo,exe - моя замечательная софтина)
Однако, при запуске из консольного окна этот батник делал вот что: порождал ещё одно окно, в котором выполнял всю прогу и я не видела, что там в конце выводится на экран (а мне для отладки надо было видеть, что всё завершилось нормально). Мне это не понравилось, я быстренько через help посмотрела, что можно ему указать опцию /B - типа, чтобы дополнительное окно не открывалось, а вывод был в ту же консоль, где запущен батник. Поставив эту /B в свой батник
start /REALTIME /B CMD /C Foo.exe

я стала ковыряться с кодом, забыв (о горе!) про эту мелкую, но, как выяснилось, коварную опцию.
Скомпилировав прогу, я её запустила через батник. Проверив, что железо работает как надо, нажала Enter. Засады я не ожидала. Прога как будто завершилась (появилось стандартное приглашение системы), но... итоговой строки от своей софтины я не увидела. Более того, к моему удивлению, процесс остался висеть в памяти и количество потоков даже не уменьшилось. Я убила процесс и принялась ковырять код, полагая, что от моих последних изменений как-то нарушилась синхронизация потоков и потоки мешают друг другу нормально завершиться (опыт многопоточного программирования тут сыграл плохую шутку).
Я КОВЫРЯЛА КОД ПОЧТИ ТРИ ЧАСА!!!! Три часа ценного рабочего времени я пыталась понять, почему процесс остаётся висеть в памяти и нормальное завершение не происходит. Пока я случайно не нажала Enter два раза.... и тут (о, чудо!) на экран (после строки приглашения системы!) вывалились "потерявшиеся" строки о завершении потоков и процесс благополучно завершился, уже по-настоящему. Кстати, при этом строка приглашения системы после последних сообщений программы в консоли не появилась - она появлялась только после третьего нажатия Enter'а, хотя ввод команд в консоли и без неё работал.
ЕЩЁ ЧАС Я ПЫТАЛАСЬ ПОНЯТЬ, ПОЧЕМУ ТАК. Пока не вспомнила про маленькую гадкую опцию /B. Убрав которую, я моментально получила нормально работающую программу.
С работы я вышла, громко кроя мелкософт самыми непотребными словами.
Так что будьте бдительны, господа, и не теряйте своё драгоценное время! Я уже наступила на грабли и предупреждаю, что они там есть! :)
ViGOur
Забавно. :)

Теперь я по занудствую, венда не реалтайм ос, и реакция в ней с +-100мс нормальна, а то и больше. И как говорил мне мой приятель, на некоторых объектах на которых он работал (связанно с нефтью и газом) 100мс это очень много оказывается, и что-нибудь из-за такой погрешности может тупо взорваться! :)
Iron Bug
Цитата(ViGOur @ 25.2.2010, 23:41) *
Забавно. :)

Теперь я по занудствую, венда не реалтайм ос, и реакция в ней с +-100мс нормальна, а то и больше. И как говорил мне мой приятель, на некоторых объектах на которых он работал (связанно с нефтью и газом) 100мс это очень много оказывается, и что-нибудь из-за такой погрешности может тупо взорваться! :)

эх!!! твои бы слова, да нашим управленцам в уши!
я уже который год бомбардирую всех идеей перехода на линь. уж кому как не мне знать преимущества: я-то под железо пишу всякий софт. и про задержки у венды знаю: из личного опыта могу сказать, что задержки даже в драйвере на нулевом уровне могут быть до 200 миллисекунд(!) - это при загрузке сети венда так себя вести начинает... у меня взрываться ничего не будет, конечно, но при сбоях урон механике может быть нанесён немалый. 200 миллисекунд - это целая вечность в мире систем риал-тайм!
пока дело глухо. линюкса боятся не апаратчики (нам-то что!) и даже не манагеры (они вообще не секут), а программисты верхнего уровня, подсевшие на МФЦ (хыхы! прям мелкософтовская федеральная цыркофь!) и иже с ним. боятся отойти от привычного.
однако, всё идёт к тому, что их вынудят. новая венда всё страшнее. на неё ополчились уже не только программисты, но даже самые мирные домашние юзеры. мы пока базируемся на embedded, но кто может гарантировать, что она не протянет ласты под гнётом модернистских идей от неоиндусов. да и она на самом деле оооооочень далека от риал-тайма, хотя её и позиционируют как таковую.
я свой код уже пишу под кроссплатформу, где только возможно. и уже перешла на бесплатный софт, кроме пары проприетарных корпоративных программ. дома стоит линь и я дома пишу дрова под наши железяки для линя - в качестве хобби. так что у меня уже готов плацдарм для разворачивания линюкса. осталось подождать, когда загнётся венда :)
Litkevich Yuriy
Цитата(Iron Bug @ 26.2.2010, 0:58) *
я уже который год бомбардирую всех идеей перехода на линь.
а почему не рилтаймОСь, QNX какой-нибудь? Когда я работал в Тюменьпромгеофизике, там для некоторых целей его использовали.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.