Задать вопрос
  • Как из одного приложения запустить другое?

    @res2001
    Developer, ex-admin
    Можно запускать скрипт удаленно с помощью psexec или wmi. Предварительно надо будет настроить все удаленные станции, чтоб можно было это использовать.
    Это может быть простой батник, который убивает процесс и запускает повторно. Правда есть нюанс - удаленно скрипт можно запустить только с админскими правами, а приложение надо запускать с правами пользователя и в сеансе пользователя.
    Чтоб решить эту проблему может быть запуск можно сделать не на прямую, а например из задачи шедулера, которую удаленным скриптом дергать. Кстати утилита schtasks, с помощью которой можно управлять заданиями шедулера из ком.строки, умеет работать удаленно. Так что возможно даже psexec/wmi не понадобятся. Т.е. нужно написать локальный скрипт, который ищет нужный процесс, прибивает его и запускает повторно. Настроить в шедулере задачу с фиксированным именем с запуском этого скрипта и выключить эту задачу. Дальше на сервере при наступлении события просто дергаете schtasks, который будет удаленно принудительно одноразово стартовать настроенную задачу.
    Ответ написан
    5 комментариев
  • Что будет, если не удалять графические объекты при завершении программы в C++ SDL2?

    @res2001
    Developer, ex-admin
    Система в большинстве случаев сама освободит почти все ресурсы при завершении программы. Есть исключения, но они довольно редки.

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

    Еще вариант: часто в embeded системах нет полноценной ОС и там нет такой роскоши как освобождение ресурсов при завершении процесса, т.к. часто нет и понятия процесса. Т.к. вы пишете на С++, то нельзя исключать, что когда-нибудь жизнь занесет вас в эту сферу.

    Кстати, этот вопрос не связан конкретно с SDL, он вообще про все что угодно, что может быть захвачено и освобождено вашим процессом.

    Так что освобождайте все что захватывает ваша программа явно в вашем коде и не надейтесь, что кто-то это сделает за вас.
    Ответ написан
  • Настраивается ли выход в интернет из сети OpenVPN не из сервера а из одгого из клиентов?

    @res2001
    Developer, ex-admin
    Учитывая, что выход в интернет - это просто правильный маршрут по умолчанию в стандартной таблице маршрутизации, которая не имеет отношения к ВПН. То, да, настроить такие маршруты вполне можно.

    Тут вам проще, видимо, будет сделать 2 ВПН. Один для всех клиентов. Второй для клиента, который будет выступать шлюзом в интернет. Причем, видимо, для второго ВПН роли клиента и сервера лучше поменять местами, т.е. ваш предполагаемый клиент будет ВПН сервером, а сервер первого ВПН станет клиентом во втором ВПН. Как-то так вижу.
    Ответ написан
  • Как сохранить размер окна через реестр?

    @res2001
    Developer, ex-admin
    Создайте батник для каждого запускаемого экземпляра игры.
    В батнике перед запуском игры меняйте ключи реестра на те значения, что нужны для этого конкретного экземпляра игры. Это можно делать с помощью стандартной утилиты reg или можно предварительно выгрузить из regedit нужную ветку реестра с правильными значениями и им же импортировать ее в батнике, ключи командной строки regedit для импорта смотри в справке или в гугле.
    Таким образом вы сначала подготавливаете реестр к запуску, а затем запускаете игру.
    Ответ написан
    Комментировать
  • Проблемы с подключением заголовочных файлов на C++, как исправить?

    @res2001
    Developer, ex-admin
    Можно так:
    #include "../include/sys.h"
    Кавычки тут важны!

    Но лучше всего добавить путь поиска заголовочных файлов с помощью дополнительной опции компилятора:
    g++ -I include ...
    И подключать заголовок уже просто указывая только имя файла:
    include <sys.h>
    Ответ написан
  • В чем ошибка в Бат-файле для запуска отчета в АИДА и отправки на почту?

    @res2001
    Developer, ex-admin
    Аида запускается и на этом процесс останавливается.

    Сейчас вы пытаетесь запустить aida 2 раза, через start и без него во 2 строке. Оба варианта могут сработать. Но очевидно, что по разному, т.к. параметры aida различаются.
    Или возможно, 2 вариант не сработает, из-за того что не прописан полный путь к aida.

    В текущем виде команда start запускает aida без параметров, поэтому вы видите окно aida в котором ни чего не происходит.
    Вторая команда, если она отрабатывает, возможно делает то что надо. Отчет на почту приходит?
    Если нет, то попробуйте для начала добавить полный путь во 2 строке.

    Правильность параметров командной строки для отправки отчета смотрите в документации AIDA. Я тут не в курсе.

    start - запускает приложение и не ждет его завершения, т.е. консольное окно у вас закроется сразу, если вы запускаете батник через ярлык с раб.стола например.
    Без start - консольное окно не закроется, будет ждать завершения запущенного процесса.
    Можно использовать любой вариант. Оба в одном батнике - избыточны.

    Командную строку для aida в обоих вариантах приведите к одному виду, видимо, как во 2 варианте, только, возможно, надо добавить полный путь к aida.

    Правильный вариант использования start в вашем случае такой:
    start "%USERPROFILE%\Desktop\AIDA64\aida64.exe" /E pochta@mail.ru /SUBJ "Отчет AIDA64 $HOSTNAME" /HTML /SUM

    Конечно, если параметры для aida вы сформировали правильно.
    Ответ написан
    1 комментарий
  • Где можно скачать Qt 5.5.1 под Ubuntu?

    @res2001
    Developer, ex-admin
    Собрать самому можно, исходники лежат на github.
    Можно взять установочный пакет из репы старой убунты: https://launchpad.net/ubuntu/xenial/amd64/qtbase5-...
    Но там еще пачку зависимостей надо тянуть. Может быть проще поставить нужную версию убунты?

    И зачем вообще именно версию 5.5.1? Если вам надо собрать приложение, то попробуйте на последней доступной Qt5 в вашем дистре линукс собрать, с большой вероятностью соберется.
    Ответ написан
  • Почему клиент не подключается к серверу OpenVPN?

    @res2001
    Developer, ex-admin
    Ответ написан
    Комментировать
  • Зачем передавать функцию как параметр через указатель с++?

    @res2001
    Developer, ex-admin
    Обычно callbackи так передают. Потом вызываемая функция при наступлении события сама ее вызывает.
    Ответ написан
  • Лучше ли использовать enum для цвета нежели struct?

    @res2001
    Developer, ex-admin
    Как я понимаю через выше aligment тем лучше?

    Нет. Это бред. Тут не применимы термины лучше/хуже.

    Alignment (выравнивание) - это просто свойство типа данных.
    enum по умолчанию имеет тип int, соответственно и все его свойства наследуются. В С++ (с версии 17, если не ошибоаюсь) можно самому выбрать тип enum. Для выравнивания обычно действует простое правило - тип должен быть выровнен в памяти на границу кратную его размеру. Например у int размер 4 байта (обычно), и выравнивание должно быть по границе 4 байт. у char/uint8_t - размер 1 байт, соответственно ограничений по выравниванию нет, т.е. выравнивание по границе байта. Тип SDL_Color - это, видимо, структура, состоящая из 4 uint8_t (или что там в SDL используют для unsigned char), выравнивание для структуры берется из типа ее первого поля (если аттрибутами не задано другое).
    Используй типизированный в uint8_t enum и будет тебе счастье.
    https://en.cppreference.com/w/cpp/language/enum

    Кстати, выравнивание, это не ограничение С++ - это ограничение процессора на аппаратном уровне. Правда почти все современные процессоры уже не имеют этого ограничения и нормально жуют не выровненные типы, но при этом операции выполняют медленнее, чем с выровненными. Фактически процы просто научились "маскировать" это ограничение. Поэтому ограничение в языке осталось.
    К тому же все еще есть процессоры, где требование выравнивания действует, но это в основном что-то из разряда микроконтроллеров. На таких процессорах использование не выровненных типов приводит к ошибке шины и вылету программы.
    Обычно тебе не нужно думать про выравнивание, т.к. компилятор об этом позаботится за тебя. Но бывают ситуации, когда программист должен это учитывать. Например когда ты читаешь поток бинарных данных из сети или из файла, и данные в потоке - это что-то сложнее, чем байты и символы.
    Ответ написан
    1 комментарий
  • Как найти устройство зная его MAC?

    @res2001
    Developer, ex-admin
    Пинговать все устройства по IP по порядку в вашей ЛВС, после каждого пинга проверять таблицу ARP на предмет наличия нужного МАСа.
    Можно сделать простым батником. Задачу можно легко распараллелить.
    Сработает, если устройство включено и отвечает на пинги. Зная IP адрес дальше уже будет проще.

    Если у вас DHCP развернут, то можно посмотреть у него в логах наличие такого МАСа. Возможно этого будет достаточно. Возможно потребуется включить логирование :)
    Ответ написан
    Комментировать
  • Почему pause в cmd скрипте не предотвращает закрытие окна?

    @res2001
    Developer, ex-admin
    goto :eof - приводит к завершению скрипта в этом месте. Это равносильно exit.

    Пример кода приведен ниже в коментариях: Почему pause в cmd скрипте не предотвращает закрытие окна?
    Ответ написан
    9 комментариев
  • Зачем в cmd bat (командной строке) создали режим enabledelayedexpansion?

    @res2001
    Developer, ex-admin
    Как я себе это понимаю:
    cmd подставляют значения переменных до выполнения команды и формируют очередную командную строку, затем ее выполняют.
    При этом команда for ... () со всем ее содержимым интерпретируется первоначально как одна команда (это можно увидеть если убрать echo off), соответственно переменные во внутренних командах цикла не могут быть подставлены в этот момент, т.к. они просто не имеют нужного значения в начале цикла.
    Затем, когда выполняется цикл, запускается вложенный cmd и уже ему нужно подставлять переменные в команды.
    Для того чтобы переменные не подставлялись перед выполнением цикла используется другой синтаксис обращения к переменным.

    То же самое происходит и с if, видимо.
    Ответ написан
    Комментировать
  • Какой компилятор выбрать для C++?

    @res2001
    Developer, ex-admin
    Если под виндой сидишь, то используй MSVS.
    Если планируешь что-то кросс-платформенное делать, то gcc/clang в самый раз.
    Проще всего под винду использовать mingw - это сборка gcc для винды с частично портированным POSIXом.
    Сам mingw можно установить разными способами.
    Мне нравится связка msys2 + mingw. msys2 - это линуксовая оболочка со всем стандартным линуксовым окружением и пакетным менеджером pacman. С помощью пакетного менеджера можно устанавливать и mingw и clang и кучу библиотек и все это обновлять одной командой. Легко подключать к разным IDE (но не к MSVS) или запускать из командной строки винды.

    Так же под виндой можно настроить WSL в него поставить какую-нибудь ubuntu, а внутрь уже любой доступный компилятор и т.д. и т.п. По сути это виртуальная машина с линуксом.
    Ответ написан
    Комментировать
  • Безопасен ли класс для многопоточности?

    @res2001
    Developer, ex-admin
    Не безопасен.
    Вы защитили мьютексом только запись в очередь (push), но не чтение из нее (pop). Так что очередь сломается рано или поздно.
    Вообще тут лучше бы подошла какая-то специализированная структура со встроенной поддержкой многопоточности, а не стандартные контейнеры.
    Можно использовать кольцевой буфер или очередь майкла-скотта. В booste, на сколько помню, есть и то и другое.
    Но для начала сгодится и такой вариант.

    Кроме того для вывода на экран в Линукс можно учитывать тот факт, что ОС обеспечивает атомарную запись в консоль для буфера менее PIPE_BUF байт. https://linux.die.net/man/7/pipe
    Думаю в винде то же есть похожая гарантия, но это не точно.

    Кроме того, операция << для логгирования не очень подходит, т.к. вынуждает использовать конструкции типа:
    oss << "Error: " << strerror(err) << "(" << err << ")";

    для вывода 1 строки. А это уже не одна запись в очередь, а несколько. Так что защита мьютексом тут не будет гарантией вывода целостной строки.
    Для логгера больше подойдет вариант типа std::printf, когда в один вызов передается вся информация для генерации целой строки.
    Ответ написан
    4 комментария
  • Как быть при утечке памяти? Можно ли "очистить" ОЗУ скриптом?

    @res2001
    Developer, ex-admin
    Попытка убить программы и возможные процессы освобождает всего 2-5 ГБ

    Значит вы убиваете не те программы, т.к. при закрытии процесса и память выделенная процессом освобождается.
    Или другой вариант - дело не в утечках памяти. Тогда не понятно какая конкретно у вас проблема? У вас начинает тормозить комп через какое-то время или что?

    Если все таки дело в утечках памяти, то объем памяти выделенной процессом можно увидеть в Task Manager.
    Можно просто отсортировать список процессов по памяти и понаблюдать некоторое время. Так определите какой процесс жрет память.

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

    Вообще использовать не поддерживаемые разработчиком программы - стремное занятие. Стоит подумать о переходе на альтернативное ПО.
    Ответ написан
    Комментировать
  • Как перевести число из байтов в число?

    @res2001
    Developer, ex-admin
    Ответ в комментариях
    Ответ написан
    Комментировать
  • Можно ли запускать на серверах c ARM процессорами, виртуальные машины на х86, amd64?

    @res2001
    Developer, ex-admin
    Это уже не виртуализация, а эмуляция. Как писали выше qemu это умеет, но из-за эмуляции большая потеря производительности. Это можно использовать где-то в тестовой среде или в разработке, но явно не в продакшене.
    Ответ написан
    Комментировать