Ответы пользователя по тегу C++
  • Как работает механизм signal-slot QT, если нужно сигнал из объекта одного потока передать в слот объекту другого потока?

    Nipheris
    @Nipheris Куратор тега C++
    Ключ к пониманию передачи сигналов - понимание смысла существования QThread:

    > A QThread object manages one thread of control within the program. QThreads begin executing in run(). By default, run() starts the event loop by calling exec() and runs a Qt event loop inside the thread.

    Запуск собственного цикла обработки сообщений и дает возможность получать их в том числе и из других потоков. Фишка сигналов/слотов кьюта в том, что это еще и простая message queue система, наподобие эрланговской, если сталкивались. Вызов в рамках одного потока - это прямой вызов подписанных слотов на этом же стеке, а вот QueuedConnection или межпоточный вызов кладут в очередь соответствующего потока сообщение (эти сообщения лежат в одной очереди с сообщениями от ОС), и поток будет их извлекать в event-loop-е. Таким образом, вы просто просите другой поток вызвать слот, а вызовет он его когда в очередной раз будет отрабатывать цикл сообщений и он дойдет до сообщения о вызове слота.

    > It is safe to connect signals and slots across different threads, thanks to a mechanism called queued connections.
    doc.qt.io/qt-5.4/qt.html#ConnectionType-enum
    Qt::QueuedConnection - The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.
    Ответ написан
    4 комментария
  • Существует ли универсальный алгоритм разбора УРЛа?

    Nipheris
    @Nipheris Куратор тега C++
    Если вам так нужен самописный сервер на плюсах, попробуйте для разбора урла использовать вот это: cpp-netlib.org/0.11.1/in_depth/uri.html#generic-ur... , а вообще можете и сервер попробовать оттуда взять.
    Ответ написан
  • Как правильно скрывать методы базового класса (C++ наследование)?

    Nipheris
    @Nipheris Куратор тега C++
    MiiNiPaa уже подкинул хорошую идею проверить через указатель на базовый класс, действительно ли метод override-ится (я буду орининальные термины использовать, т.к. конкретный перевод, к сожалению, зависит от книги). Если будет по-прежнему вызываться метод базового класса, то у вас скрытие (hide). Используйте ключевое слово override, чтобы убедиться, что метод корректно попадает в таблицу виртуальных вызовов. Методы с const и без const-а действительно различны, это хорошо видно на примере оператора индексации (operator[]) - его часто определяют в двух вариантах - константном и неконстантном.
    Ответ написан
    Комментировать
  • Как выгрузить окно приложения на qt++?

    Nipheris
    @Nipheris Куратор тега C++
    У вас где-то в коде:
    QMainWindow *window = new QMainWindow();
    вам потом надо сделать:
    delete window;
    а потом снова создать его. Если нужно именно чтобы
    > глаз не мозолило
    то проще делать hide и show
    Ответ написан
    Комментировать
  • Как программно отфильтровать пакеты по pid/имени процесса?

    Nipheris
    @Nipheris Куратор тега C++
    Если pcap действительно не предоставляет никакой инфы о процессе, который забрал пакет (вполне вероятная и нормальная ситуация, т.к. работает он в режиме ядра), то попробуйте проставить соответствие по номеру порта, раз уж вам TCP нужен. С точки зрения сетевого протокола, именно порт уникально идентифицирует процесс-получатель и процесс-отправитель (например, вы ведь никак не повесите два независимых веб-сервера на одном порту. Также и при исходящем TCP подключении ОС выделяет для каждого подключения отдельный случайный порт). Т.к. информацию о портах и TCP-соединениях (в т.ч. в listening статусе) вы по идее сможете получить (ведь существует и как-то работает TcpView из пакета Sysinternals), то и по порту пакеты сможете привязать.
    Само собой, один процесс может открывать много портов на прослушку и устаналивать множество соединений, как входящих так и исходящих. Если вам нужно еще и отдельные TCP-стримы сохранять (например, к 80-му порту веб-сервера подключилось много клиентов), то тогда уникально идентифицируйте каждый коннект с помощью четверки: (source_ip, source_port, destination_ip, destination_port).
    Ответ написан
    3 комментария
  • С помощью чего создать веб интерфейс для программы распознавания лиц на OpenCV?

    Nipheris
    @Nipheris Куратор тега C++
    cpp-netlib.org
    Hello world для клиента и сервера:
    cpp-netlib.org/0.11.1/index.html#hello-world
    Ответ написан
    Комментировать
  • Что такое Symbols release?

    Nipheris
    @Nipheris Куратор тега C++
    vilgeforce говорит верно, это релизы, содержащие как скомпиленные исполняемые модули, так и символа к ним, например pdb-файлы, если проект собирается Студией. Символьные файлы могут выкладывать как вместе с исполныемыми модулями, так и отдельно от них. Это разумно, т.к. символьные файлы нужны только для отладки, а т.к. далеко не каждый пользователь софтины будет ее дебажить, то нет смысла всегда скачивать символы, которые нередко весят больше самих модулей.
    По VS вот несколько ссылок, по остальным компиляторам поищите сами:
    stackoverflow.com/questions/72104/how-do-i-use-pdb...
    https://en.wikipedia.org/wiki/Program_database
    https://msdn.microsoft.com/en-us/library/yd4f8bd1%...
    Ответ написан
    Комментировать
  • Как отловить момент, когда окно помещается в одну из сторон экрана (прилипает как бы), при нажатии WIN + LEFT?

    Nipheris
    @Nipheris Куратор тега C++
    Я думаю вам придется изучить и частично повторить логику винды в плане приклеивания окна - т.е. получать размер рабочей области на текущем мониторе и делать окно в половину области с нужным положением. С точки зрения приложения нет никакой необходимости сообщать ему, что окно прилеплено - для него не должно быть разницы, прилепили его или вручную поресайзили до такого размера.
    Старый размер окна запоминает виндовый менеджер окон, как и в случае c maximize/minimize - иначе бы старые приложения не работали с прилипанием, а они все работают без проблем, значит операционка ничего нового не требует.
    Ответ написан
    2 комментария
  • Как найти сумму объектов в векторе через итератор?

    Nipheris
    @Nipheris Куратор тега C++
    ideone.com/HLeMY2

    #include <algorithm>
    #include <iostream>
    
    class one
    {
    public:
    	one(std::string a) : _a(a) { }
    	std::string a() { return _a; }
    private:
    	std::string _a;
    	int b;
    	bool c;
    };
    
    int main() {
    	const std::vector<one> ones = {
    		one("Vasya"),
    		one("Meh"),
    		one("Foo"),
    		one("Vasya"),
    		one("Vasya"),
    		one("Bar")
    	};
    	std::cout << std::count_if(
    			ones.cbegin(), ones.cend(),
    			[](one o){ return o.a() == "Vasya"; }
    		);
    	return 0;
    }


    Если есть вопросы - задавайте
    Ответ написан
  • Как правильно написать макрос для "расширения" методов родителя?

    Nipheris
    @Nipheris Куратор тега C++
    1. Вы пробовали использовать ваш первый вариант без макроса? Что сообщает компилятор? Ошибка из moc-файла прилетает?
    2. Я бы посоветовал вам шаблонного родителя, но раз у вас MOC, значит не пойдет.
    3. Ну передайте параметр в макрос, раз уж совсем никак. Я бы все-таки разобрался сначала, почему вариант без указания род. класса не работает.
    Ответ написан
  • "Не существует подходящего определяемого пользователем преобразования." DataGridView. Что не так?

    Nipheris
    @Nipheris Куратор тега C++
    SelectedRows - это коллекция DataGridViewSelectedRowCollection, а она реализует только не-generic IEnumerable, который при перечислении возвращает System::Object-ы. Поэтому делайте for each (System::Object^ item in dataGridView->SelectedRows) и затем кастуйте к строке явно.
    Ответ написан
    Комментировать
  • Какой функционал сделать для приложения?

    Nipheris
    @Nipheris Куратор тега C++
    1) Сериализация и десериализация
    2) Работа с JSON и XML
    Можно одновременно и то, и другое покрыть, если сделать конфигурационный файл и сохранение настроек в него.
    3) Работа с потоками данных
    Вряд ли сможете обойтись без этого, вероятно вам понадобятся FileStream и NetworkStream для получения фида и сохранения на диск.
    4) LINQ
    Аналогично, если вы знаете что это такое - то будете использовать везде, где удобно, в любом приложении из более чем 30 строк кода есть foreach-и, которые можно заменить использованием LINQ.
    Ответ написан
    Комментировать
  • Как выделить абзацы в тексте тегом правильно?

    Nipheris
    @Nipheris Куратор тега C++
    Если четких признаков начала нового абзаца в исходном тексте нет (а их нет, раз у вас каждая строка бьется \n), то тогда оценивайте примерно - если строка дошла до некоторого предела, значит скорее всего следующая строка - это продолжение старого абзаца, а если не дошла до предела, а закончилась довольно рано - то скорее всего новый абзац.
    Точного решения пока не могу предложить, да и врядли оно есть.
    А может быть у вас абзац начинается когда два \n подряд идут?
    Ответ написан
    Комментировать
  • Сохранение и загрузка бинарных файлов с русским текстом Qt в string. Как?

    Nipheris
    @Nipheris Куратор тега C++
    Переделывать строки с std::string на QString может быть и не нужно: достаточно всем договориться, что в std::string может быть UTF-8 текст. Тогда уже нельзя полагаться на соответствие символ == элемент_string-а, т.е. у вас std::string будет хранить уже не символы, а байты (!) строки, и size() будет уже показывать количество байт. Если вас нужно только сохранять/загружать, то это как раз вам подойдет. Затем, чтобы запихнуть в контрол, делаете в нужных местах str.toUtf8() и QString::fromUtf8(...) и счастье.
    Если вам нужно обрабатывать текст посимвольно, например вырезать подстроку, то без поддержки юникода вам ничего не сделать. В этом случае, либо юзайте QString в местах обработки текста, либо подключайте ICU.
    Ответ написан
    Комментировать
  • Как исправить проблему с выравниваем байтов при загрузке изображения с помощью libjpeg?

    Nipheris
    @Nipheris Куратор тега C++
    Придется задать несколько уточняющих вопросов:
    0) libjpeg обязательно? Если вам для загрузки текстур, FreeImage отлично подойдет, он конечно толще по-определению, но с ним проще на порядок, да и формат переключить сможете, если что.
    1) вы уверены, что проблема в том, как грузится текстура, а не как вы рисуете? Если в шейдере сплошным цветом залить, все нормально отрисовывается?
    2) с цветами проблемы есть? форматы цвета точно совпадают?
    3) как решаете проблему с тем, что размер картинки - не степень двойки?
    4) getTextureWidth(), getTextureHeight() - что делают эти вызовы? Какой размер у текстуры получается?
    Ответ написан
  • Передать дочернему процессу CTRL-C в C/C++?

    Nipheris
    @Nipheris Куратор тега C++
    a,b в языке С/С++ вычисляется как b. Вы взяли две константы через запятую в скобки, после чего они начали восприниматься как операция "запятая", результатом которой является второй аргумент. Т.е. если написать a = (67, 23), то в переменную a попадет значение 23. В вашем случае в функцию будет только передан флаг CREATE_NEW_CONSOLE, а вам, судя по мсдн-у, нужно оба, чтобы создать новую группу процессов. Соедините флаги так, как надо было изначально - через операцию логического или, т.е. "|" - и все должно работать. Вместо того, что в скобках, будет так:
    CREATE_NEW_PROCESS_GROUP | CREATE_NEW_CONSOLE

    Edit: Хотя нет, для групп процессов CTRL-C вроде как не поддерживается, попробуйте CTRL-BREAK. И флаги эти взаимоисключающие, судя по докам. CREATE_NEW_PROCESS_GROUP: This flag is ignored if specified with CREATE_NEW_CONSOLE.
    Ответ написан
  • Насколько сложны игры на c++ и openGL?

    Nipheris
    @Nipheris Куратор тега C++
    Сложности в создании игр у вас будет три:
    1) программирование, и C++ в частности - не лучший язык для изучения программирования, хотя как второй по счету язык - вполне подойдет. Как инструмент для разработки игр, плюсы, безусловно, лидируют.
    2) компьютерная графика, и OpenGL в частности - вам нужно будет хорошо разобраться, как рассчитываются изображения, и как собирается финальная картинка. Для разработки игр вам понадобится знание графического конвейера, шейдеров, понимание общих принципов растровой и векторной графики (что такое цвет, пиксель, растр, как задаются векторные примитивы), понимание принципов анимации (как рисовать движущуюся картинку).
    3) математика, и линейная алгебра в частности. Операции с матрицами и векторами - это минимум, без которого даже 2d не сделаешь. Если захотите всяческие реалистичные эффекты - это еще и физика, в частности - механика. Прежде чем нарисовать летящий по баллистической траектории снаряд, нужно сначала рассчитать, ГДЕ он будет находиться на экране (в виртуальном пространстве) в каждый промежуток времени. Ну и так со всей начинкой игры. Вам следует четко понимать, что если вы не собираетесь брать готовый графический движок, то opengl вам сможет лишь нарисовать что-либо что вы ему скажете. Что рисовать и где - вы должны будете запрограммировать сами, во всех деталях.
    Как уже сказал GavriKos, геймдев - сложная область, можно сказать двигатель прогресса в технологиях развлечений. Конечно далеко не все разработчики игр участвуют в создании самых современных движков или крупнейших MMO-проектов, однако отставать в этой индустрии нельзя - только игры с оригинальной идеей могут позволить себе графику 10-летней давности, например.
    Ответ написан
    Комментировать
  • Почему Debug Assertion Failed?

    Nipheris
    @Nipheris Куратор тега C++
    На глаз в коде ошибок в работе с памятью не видно. Могу предложить еще раз внимательно проверить, правильные ли библиотеки кьюта используются. Библиотеки должны соответствовать версии компилятора и рантайма, битности собираемого экзешника и конфигурации сборки (дебаг/релиз). Проверьте, все ли у вас верно подключено. Масса странных плавающих ошибок может появляться, если, например, кьют собран под 2010-ю студию, а используется в проекте с компилятором из 2013-й и наоборот.
    Ответ написан
  • Как пользоваться Shared Pointer в c++?

    Nipheris
    @Nipheris Куратор тега C++
    Пока в наших университетах (колледжах, техникумах, etc.) будут ставить такие задачи, из учебных заведений будут выходить малополезные специалисты, которые все будут учить заново на работе. Вместо того, чтобы давать студенту широкий взгляд на предмет и множество инструментов (в противоположность работе, которая не всегда может дать корректную и не предвзятую оценку используемым технологиям), университетская программа становится источником историй и анекдотов с участием неопытных специалистов и их боевых наставников (тимлидов, опытных коллег).
    Вместо того, чтобы поставить задачу с архитектурным уклоном (вроде "напишите функцию-фабрику, создающую объект нужного класса и возвращающую экземпляр, обернутый в shared pointer"), чтобы продемонстрировать кейс применения умных указателей, студентам говорят "прикрутить". Неужели на специальностях машиностроения тоже говорят "прикрутить", а не соединить детали в работающее устройство?
    Извините за оффтоп, очень уж классический пример.
    Ответ написан
    Комментировать
  • Как реализовать перемещение юнитов и их взаимодействие друг с другом?

    Nipheris
    @Nipheris Куратор тега C++
    Грамотно было бы разбить этот вопрос на несколько и указать для каждого необходимые детали, либо выбросить из него всю шелуху и оставить что-то одно.

    Чтобы движение было плавным, нужно плавно анимировать это движение (т.е. перерисовывать положение и внешний вид объекта N раз в секунду).
    Процесс взаимодействия между юнитами зависит от архитектуры вашей игры и ее целевого функционала. Если это сингл-плеер, то я думаю не всегда хорошо дожидаться конца анимации, чтобы рассчитать урон (например, для игрока вполне естественно обнаружить нанесение урона в момент когда его меч коснется противника, а не когда закончит движение). Если это сетевая игра, то у вас есть интересная и непростая задача компенсации пинга.
    Если вам кажется, что я изображаю капитана Очевидность, то вам нужно задать более точные и конкретные вопросы.
    Ответ написан
    Комментировать