Задать вопрос
  • Устройство USB, с чего начать?

    @monah_tuk
    Если будете делать своё USB устройство: изучить спеки, изучить спек HID устройства. На тостере есть советы по использованию либ для AVR для реализации USB стека и HID устройств как пример. Поищите.
    Ответ написан
    Комментировать
  • Как получить изображение с двух одинаковых веб камер с помощью ffmpeg в консоле?

    @monah_tuk
    -video_device_number XXX
    Читаем: ffmpeg.org/ffmpeg-devices.html#dshow
    Ответ написан
    Комментировать
  • Как прочитать данные с USPS Scale(PS-10USB)?

    @monah_tuk
    Причём тут C++? А вообще, libusb любит возвращать PIPE ERROR когда устройство делает Stall на запрос, что говорит об ошибке его обработки или что реквест не поддерживается. Косвенно подтверждается этим:
    Report Descriptors: 
               ** UNAVAILABLE **

    а при этом делается setReport

    Далее, судя по дескрипторам это обычное HID устройство. Попробуйте до него достучаться при помощи: www.signal11.us/oss/hidapi/:
    sudo apt-get install libhidapi-dev

    usbscale тоже пробовал - долго висит и возвращает

    глупый вопрос, но вы свои VID:PID сюда добавляли:
    https://github.com/erjiang/usbscale/blob/master/sc...
    ?

    Ещё, тут: https://github.com/erjiang/usbscale/blob/master/us... в этом месте:
    // 
            // If the data transfer succeeded, then we pass along the data we
            // received tot **print_scale_data**.
            //
            if(r == 0) {

    они проверяют код ошибки на 0, это правильно, но какой именно ошибкой завершается запрос - непонятно. Судя по тому, что вы говорите ("долго висит"), у них там используется большой таймаут (10 сек), то код ошибки - LIBUSB_ERROR_TIMEOUT, а в документации сказано:

    Also check transferred when dealing with a timeout error code. libusb may have to split your transfer into a number of chunks to satisfy underlying O/S requirements, meaning that the timeout may expire after the first few chunks have completed. libusb is careful not to lose any data that may have been transferred; do not assume that timeout conditions indicate a complete lack of I/O.


    они ожидают блок размером WEIGH_REPORT_SIZE (6 байт), вдруг так случается, что размер у ваших весов поменьше? 5 байт? Т.е. нужно, для начала, подправить программку и залогировать код ошибки и значение переменной len. Если это действительно таймаут, а не PIPE ERROR, то уже проверять значение len на выходе, если оно больше нуля - пробовать процессить эти данные. Только процессинг, скорее всего, должен быть уже другой какой.

    Основное же отличие от питоновской программы: не далется setReport. Как следствие, можете попробовать закомментировать эту строчку в питоновском скрипте, как быструю пробу.

    Финальным же аккордом может стать реверсинг общения весов и виндовой программы при помощи Wireshark :-)

    Если не сможете сами, можете сделать мне заказ, заинтересует - пишите в почту (в профиле).
    Ответ написан
  • Как обращаться к форме из стороннего юнита?

    @monah_tuk
    У вас, ещё и Header guard, небось, есть? Или #pragma once?

    Изучите как работает препроцессор и что они делает, когда встречает директиву #include.

    По вашей проблеме:
    Func.cpp подключает Func.h (определяется охранник FUNC_H /какой точно у вас - я не знаю/, теперь файл повторно не включится), тот, в свою очередь, подключает Main.h (MAIN_H), Main.h подключает Func.h, но охранник уже есть, поэтому игнорируется. Из текста ошибки следует, что не смог подключиться Main.h, т.к. был определён охранник MAIN_H, попробую возомнить себя телепатом, но, скорее всего, в Func.cpp у вас сначала инклудится Main.h, а потом Func.h, что и приводит к такому поведению.

    Собственно, вам уже должно стать понятно, что без листингов этих файлов делать заключение очень проблемно. Ровно как и оказать посильную помощь.

    А вообще, золотое правило: избегайте cross-reference заголовочных файлов. Подключайте нужные только в единицы трансляции. Используйте forward-declaration где нужно. Скрывайте детали реализации через PIMPL (гугл в помощь).
    Ответ написан
    3 комментария
  • Правильно наложить водяной знак?

    @monah_tuk
    Не совсем понял вопрос, либо он действительно слишком простой: просто исправьте арифметику. Как-то так:
    ffmpeg -i c:/tv/1.mp4 -i c:/tv/logo5.png -filter_complex overlay="main_w-overlay_w-1:1" c:/tv/10.mp4


    За подробностями:
    https://ffmpeg.org/ffmpeg-filters.html#overlay-1
    Ответ написан
    Комментировать
  • Из-за чего может быть ошибка?

    @monah_tuk
    Как минимум, вы один и тот же стрим ввода передаёте всем тредам. Тут имеет место быть не только гонка, но и вообще каша с доступом. Затем тред на продолжении ВСЕЙ своей работы блокирует мутекс. Ваш вариант с тем же успехом мог бы работать в один поток, т.к. пока поток не окончит чтение, другие будут ждать на мутексе. Блокируйте только на доступе к вектору.

    Как вариант такой код:
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <sstream>
    #include <vector>
    #include <deque>
    #include <map>
    #include <thread>
    #include <mutex>
    
    std::mutex lock;
    
    void pipeline(const std::string&, std::vector<std::string>&);
    
    
    std::string files[4] =
            {
                    "file1.txt",
                    "file2.txt",
                    "file3.txt",
                    "file4.txt"
            };
    
    int main()
    {
        std::string string;
        std::vector<std::string> str;
        std::map<std::string, std::size_t> freq;
        std::deque<std::thread> pool;
        std::ofstream out("out.txt");
    
        for (std::size_t i = 0; i < 3; i++)
        {
            pool.push_back(std::thread(pipeline, std::ref(files[i]), std::ref(str)));
        }
    
        while (pool.size())
        {
            pool.front().join();
            pool.pop_front();
        }
    
        std::cout << str.size();
    
        return 0;
    }
    
    void pipeline(const std::string &infile, std::vector<std::string> &str)
    {
        std::ifstream in(infile.c_str());
    
        while (!in.eof())
        {
            std::string temp;
    
            std::getline(in, temp);
    
            {
                std::unique_lock<std::mutex> guard(lock);
                str.push_back(temp);
            }
        }
    }


    Изменения:
    - стрим создаётся в потоке, потоку передаётся имя файла
    - блокировка доступа только на модификации вектора
    - использование охранного класса для блокирования и освобождения верктора.
    - close на стриме можно в данном случае не делать - он закроется по выходу из области видимости
    Ответ написан
    1 комментарий
  • Как при помощи C++ узнать информацию о системе?

    @monah_tuk
    А на Linux посмотри исходники lshw (либо парсируй её вывод) и, в дополнение:
    - lspci
    - lsusb
    - /proc/cpuinfo
    Ответ написан
    Комментировать
  • Почему wstring::c_str() не выводит русскую часть текста?

    @monah_tuk
    imbue() применяет локаль для оперций ввода-вывода, типа: как выводить разделитель дроби: точку или запятую. Тебе в начале, до операций ввода-вывода, нужно поставить:
    std::locale system("");
    std::locale::global(system);


    Вот более полный пример, в котором видно отличия:
    #include <iostream>
    #include <locale>
    
    using namespace std;
    
    int main()
    {
        std::locale system("");
        std::locale::global(system);
    
        wstring str = L"hello, world. привет, МКС";
        wcout << str << endl;
        wcout << str.c_str() << endl;
    
        wcout << 3.14 << endl;
        // А теперь будет десятичный разделитель согласно локали выводится
        wcout.imbue(system);
        wcout << 3.14 << endl;
    
        return 0;
    }


    Вывод такой:
    hello, world. привет, МКС
    hello, world. привет, МКС
    3.14
    3,14


    UPD: еще, неплохо, при помощи setlocale() установить Си-локаль, которую библиотека Си использует. Ага, они разные, и ставятся независимо (https://stdcxx.apache.org/doc/stdlibug/24-3.html) :)
    Ответ написан
    Комментировать
  • Правильно ли составлена команда WGet?

    @monah_tuk
    Я грабил сайты при помощи httrack
    Ответ написан
    Комментировать
  • Какой Linux подойдет лучше?

    @monah_tuk
    Сергей дельный совет дал :) Но если железо для периодического использования, то можно попробовать Mint, редакцию Mate или XFCE. Обе можно превратить во что-то своё. К примеру, я на нетбуке с меньшим объёмом памяти, сидел на IceWM, поставить его можно уже в той же убунте или минте (его пакетная база базируется, сейчас, на Ubuntu LTS, но оформление не юнити).

    Далее по пунктам:
    1. https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%BD%D... - выберите себе. Или попробуйте: ugetdm.com/downloads. Сам раньше больше пользовался D4X, но проект больше не развивается, да и хватает wget -c. В остальном пытаюсь качать торрентами
    2. разваливается из-за железа или драйверов. Попробуйте просто друге DE, типа LXDE, XFCE, Mate либо более аскетичные варианты (чисто WM) типа IceWM.
    3. Про RDP в линухе только клиент знаю. ssh на хреновых каналах лучше. Ну или TeamViewer. Этого набора пока за глаза хватает
    4. не подскажу, т.к. не интересовало
    5. vine? Такой программы не знаю. Так что не подскажу. Если это опечатка wine, то во всех дистрибутивах есть. Для Ubuntu/Mint есть PPA с более свежими версиями - иногда полезно какую-то новомодную хрень запустить.
    Ответ написан
  • USB HID клавиатура. Что нужно знать?

    @monah_tuk
    В дополнение информации от DIHALT.

    Для HID можно ещё TinyUSB (https://github.com/hathach/tinyusb) и USBTiny (dicks.home.xs4all.nl/avr/usbtiny), сам только со второй баловался. Ну и спеки с usb.org, из раздела для разработчиков, в частности про классы устройств, среди которых и HID: www.usb.org/developers/docs/devclass_docs/. Плюс золото: www.beyondlogic.org/usbnutshell/usb1.shtml
    Ответ написан
    Комментировать
  • Как через ffmpeg получить с микрофона звук, усилить его и отправить на виртуальный кабель?

    @monah_tuk
    dshow в текущем виде поддерживается только как Input device. Так что пока вывести - никак. Нужно самому писать программу и делать вывод. К примеру, как в ffplay - через SDL2. Усиление - через фильтр, примерно как у вас.
    Ответ написан
    Комментировать
  • Почему не работает git flow?

    @monah_tuk
    Предположения:
    1. перегрузиться/перелогиниться
    2. libiconv2.dll непривильной битности
    Ответ написан
    Комментировать
  • Как создать свой PPA для систем Ubuntu и Debian?

    @monah_tuk
    Кирилл, для debian вручную (либо локально для ubunut/mint):
    https://wiki.debian.org/HowToSetupADebianRepository
    askubuntu.com/questions/170348/how-to-make-my-own-...

    именно PPA для ubuntu/min, то всё есть на официальном сайте:
    https://help.launchpad.net/
    https://help.launchpad.net/Packaging/PPA
    https://help.launchpad.net/Packaging/PPA/BuildingA...
    https://help.launchpad.net/Packaging/PPA/Uploading
    https://help.launchpad.net/Packaging/UploadErrors
    либо:
    help.ubuntu.ru/wiki/%D1%81%D0%BE%D0%B7%D0%B4%D0%B0...

    Да и вообще, эти ответы сильно широко освещены в гугле, на форумах и wiki убунты. Не ленитесь, пользуйте поисковики.
    Ответ написан
    Комментировать
  • На чем лучше программировать визуальные приложения?

    @monah_tuk
    Судя по вопросу, у вас порог не того уровня, что бы заниматься C++. Отгребёте больше проблем, чем получите пользы.

    Тут говорили уже про Qt, я предлагаю вам использовать связку Qt + Python. По крайней мере с выделениями памяти вы себя малость обезопасите. Ссылки по теме:
    Python + PyQt + Qt Designer. Что дальше?
    www.youtube.com/watch?v=3SS0CeEs4ro - показан пример работы с IDE PyCharm от Jet Brains. Не смотрите, что под Ubuntu, под виндой точно так же.
    https://ru.wikipedia.org/wiki/PyQt - вообще информация по проекту
    Ответ написан
  • Как обнулить std::cin и заставить его ждать ввода?

    @monah_tuk
    Входная программа завершила писать и ваша получила EOF. Всё, баста карапузики. Проверяйте статус ввода и завершайтесь - больше вы данных не получите, никогда и ни при каких условиях.

    Не верите? Отправьте на stdin не одну строку, а файл: выведется правильно файл, а потом посыпят пустые строки или последний токен - зависит от реализации.

    Обратите внимание на слово токен - у вас разделение по пробелу будет. Что бы читать строку, используйте std::getline().

    За флагами:
    www.cplusplus.com/reference/ios/ios/eof
    www.cplusplus.com/reference/ios/ios/fail
    www.cplusplus.com/reference/ios/ios/bad

    Ну а ваш код, по сути, должен стать таким:
    while (true) {
            std::getline(std::cin, line);
            if (!std::cin)
                break;
            std::cout << "out: " + line << std::endl;
        }


    обратите внимание, что если вы сделаете так:
    while (std::cin) {
            std::getline(std::cin, line);
            std::cout << "out: " + line << std::endl;
        }


    то вроде короче, и вроде работает, но будете постоянно выводить одну лишнюю строку (пустую или нет - от реализации), так что поверить статус стоит перед процессингом того, что получили.
    Ответ написан
    6 комментариев
  • Как установить ffmpeg в Ubuntu?

    @monah_tuk
    avconv значительно более глючное поделие. Не знаю, что они там курят в libav, но работает оно куда говёнее нежели оригинальный ffmpeg.

    PPA jon-severinsson содержал очень старый ffmpeg и уже не существует. Я использую свой PPA после того, как PPA samrog131 помер (преемственность сохранена на 100%):
    sudo add-apt-repository ppa:adrozdoff/ffmpeg-opti
    sudo apt-get update
    sudo apt-get install ffmpeg-real


    Что бы ffmpeg стал доступным по умолчанию в системе, поставьте пакет:
    sudo apt-get install ffmpeg-set-alternatives
    Ответ написан
  • Как подключить заголовочный файл частично?

    @monah_tuk
    Не вижу никаких проблем: не подключайте его совсем. А в начале своего модуля просто объявите прототип функции:
    extern "C" int printf(const char *format, ...);

    и потом используй в своё удовольствие: компилятору вы обещание дали, а линковщик разберётся. Главное - extern "C", что говорит использовать манглинг имён в стиле C, а не C++. Естественно, если используется что-то, что не объявлено в stdio.h, но косвенно инклудится, то нужно подключать уже.
    Ответ написан
    2 комментария
  • Какие самые печальные/курьезные по последствиям баги в вашей практике (или о которых знаете)?

    @monah_tuk
    Не у меня, но в моей практике: htrd.su/wiki/zhurnal/2013/09/18/zabavnyj_bag

    Ещё:
    Останавливался шедулер ThreadX и, соответственно, продолжал выполняться только один тред, либо, когда доходило до кооперативного передачи управления. Проблема: отображённый в память регистр регистр управления таймером после записи не сразу возвращает, при чтении, новое значение. Плюс один регистр использовался для двух таймеров, соответственно, что настроить второй, нужно вычитать значение, подправить его и записать обратно, что бы параметры первого не перезаписать. Планировщик на время решедулинга гасил свой таймер, а потом активировал. Но случалось так, что после активирования не сразу обновлялся, а к этому моменту наш код успевал вычитать регистр, с погашенным значением, активировал свой таймер и записывал. В результате таймер планировщика оказывался выключенным. Гонки в прямом смысле не было: доступ планировщика из прерывания, а наш код запускается непосредственно им уже после активации. Ситуация усугублялась тем, что система могла некоторое время работать за счёт кооперативной многозадачности (например, при блокировке на мутексе, вызывается дополнительно код, проверяющий, а не готов ли какой тред, и запускает его, участие планировщика тут не нужно, аналогично при вызове других системных процедур, типа sleep(), ожидание треда и т.п.), но гасло часто в непредсказуемый момент. Это embedded ;-)
    Ответ написан
    2 комментария
  • Можно ли так работать с указателями в C++?

    @monah_tuk
    В том варианте, что в посте - строчите из пулемёта в себе в ноги.

    В STL есть два способа получить нужное поведение:
    ать: www.cplusplus.com/reference/string/string/getline
    два: www.cplusplus.com/reference/istream/istream/getline

    Оба прекрасно работают со стримами, но первый хочет std:string.

    Второй вариант (он же вариант из твоего поста) обычно используется с буфферами фиксированной длинны + чтение в цикле чанками.
    Ответ написан
    Комментировать