C++

Монитор расхода памяти

Недавно возникла необходимость отслеживать расход памяти программы, которая 24/7 работает на Windows. Пришлось перепробовать долбанную кучу профилировщиков и task manager'ов, среди которых самым близким к поставленным требованиям оказался ProcessExplorer, который был всем хорош, но не мог проводить длительный мониторинг.

Т.о. было решено что подходящего решения не существует (или оно не гуглится, что в наше время практически одинаково) и поэтому пришлось на скорую руку набросать утилиту которая с помощью GetProcessMemoryInfo собирает расход памяти какой-то программы.
Запись\загрузку данных, их вывод на график и мониторинг нагрузки на CPU я добавил в качестве плюшек, чтобы получился простейший профилировщик, который возможно кому-то понадобится.

Скачать можно в аттаче, а превью можно посмотреть здесь.
Исходники не выкладываю, т.к. они шестого билдера с установленным TeeChart 8+ (кому надо поняли).

Потоки в boost

Boost — невероятно мощное собрание библиотек для C++, в котором реализовано множество классов для работы с потоками, датой и временем, интерфейсами файловой системы, сети и множество других.

И что особенно радует — использование boost не означает значимого снижения производительности. Даже хорошо реализованный алгоритм будет чаще всего лишь немного быстрее своего аналога из boost, а что уж говорить про "костыли"... Словом, почти всегда лучше использовать возможности, предлагаемые бустом, чем изобретать велосипед.

И одна из этих возможностей, о которой я хочу рассказать — создание потоков и управление ими.

boost::thread позволяет создавать обычные для вашей системы потоки. Например в POSIX-системе boost::thread использует PThreads API, а в Windows использует функцию _beginthreadex (если кто не в курсе — это вроде как "аналог" CreateThread). Таким образом boost::thread абстрагирует вас от конкретной платформы и позволяет писать быстрый и переносимый код, который можно собрать на любой системе, для которой есть boost.

Модификатор const

Существует множество способов использования const в C++, которые могут здорово облегчить разработку, позволить создавать более безопасный и быстрый код. Однако практика показывает, что многие C++ программисты либо недооценивают пользу ключевого слова const в C++, либо просто плохо с ним знакомы.

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

Безусловно, статья в первую очередь ориентирована на новичков, но я надеюсь что она поможет освежить или уточнить знания тем кто давно сделал свой выбор в пользу C++

Давайте выясним как работает const в C++ и для чего может быть полезен.

Существует несколько способов использования const, начнем с простого и пойдем дальше.

Гугл и капча

TIdHTTP (v9) не тянет google-капчу. Замечены глюки:

  • Вываливается в эксепшн (!ахтунг)"HTTP/1.1 200 OK"
  • Получает от сервера данные, но в стрим ничего не записывает
  • Игнорирует cookie (и не в домене дело)
  • WinInet такой фигней не страдает.
    Спасибо ребятам из гугла, благодаря им пришлось вспомнить, какой он, wininet (:

    Глюк?

    Как по-вашему отработает такой код?

    TStringList *sl = new TStringList;
    sl->Add("asdf");
    sl->SaveToFile("D:\\-s.t.a.l.k.e.r2.:.txt");

    Cannot create file? Не-не-не...

    В корне диска D появится файл -s.t.a.l.k.e.r2. без расширения (клянусь, я сейчас не бухой), который нельзя будет удалить, прочесть, переименовать или переместить o_O
    Вернее удалить его можно, но только через консоль и только по короткому имени файла.

    Собственно не совсем понятно - почему файл вообще создался и почему так себя ведет?

    Делаем детектор движения на основе веб-камеры

    Хочу рассказать вам о том, как без особых затрат создать программу, которая при должной доработке может стать еще одним рубежом зашиты вашего жилища.
    Я говорю про детектор движения, состоящий из двух частей — веб-камеры (или любого другого подобного устройства) и программы, которая возьмет на себя функции детектора движения, оповещателя и др.

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