На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (5) 1 2 [3] 4 5  все  ( Перейти к последнему сообщению )  
> gcc - установка и настройка
    Цитата Eretic @
    Это уже MSYS2 с оф. сайта установлена.

    Все же попробуйте установить linux на VirtualBox. Хотя странно у вас MinGW себя ведет. Я вам еще в #3 давал ссылку на скачивание MinGW (повторю, если не нашли для своей ОС). Это уже сразу Online установщик для MinGW-64

    У меня, скачанный по этой ссылке MinGW-64, нормально собирает пример от Majestio через g++ (не через его build.sh). Правда я немного изменил его, используя int вместо double в задержке и выставил задержку в основном потоке. Так же добавил сообщения о завершении потока.

    ExpandedWrap disabled
      #include <iostream>
      #include <thread>
      #include <chrono>
       
      void printWithDelay(int tid, int delay) {
        for (int i = 0; i < 5; ++i) {
          std::this_thread::sleep_for(std::chrono::milliseconds(delay));
          std::cout << "Thread ID = " << tid << " echo " << i << " . . ." << std::endl;
        }
        std::cout << "Thread [" << tid << "] exit." << std::endl;
      }
       
      int main() {
        std::thread t1(printWithDelay, 1, 500);
        std::thread t2(printWithDelay, 2, 750);
        std::thread t3(printWithDelay, 3, 900);
       
        t1.join();
        t2.join();
        t3.join();
       
        std::this_thread::sleep_for(std::chrono::milliseconds(20000));
        
        return 0;
      }


    Вот так у меня выглядит вывод в консоль от этой программы
    Прикреплённая картинка
    Прикреплённая картинка


    ADD: Скрин из wine под linux, но запускал установленный MinGW g++.exe. Он кстати более низкой версии, чем в установленный на linux

    Прикреплённая картинка
    Прикреплённая картинка
    Сообщение отредактировано: macomics -
      Цитата ЫукпШ @
      Попробуй тут почитать - вдруг поможет.
      Или здесь

      Запутаешь человека ссылками на это старьё! >:(

      Установка MSYS2 уже включает разновсяческие тулчейны из mingw-w64 (не нужно отдельно ставить MINGW). Если они не установлены, они ставятся с помощью pacman. Тамошние потуги сборки внешних библиотек и инструментов также в большей части бесполезны, т.к. либы также ставятся с помощью pacman. На примере pkg-conf ...

      Смотрим что у нас установлено:

      ExpandedWrap disabled
        pacman -Ss pkg-conf

      Решили установить нужное:

      ExpandedWrap disabled
        pacman -S clang64/mingw-w64-clang-x86_64-pkg-config

      Очень много либ уже пердкомпилировано и собрано, остается только вот так установить. А самостоятельно собирать нужно ну что-то уж совсем экзотическое.
        А вот эта версия заработала!
        И даже VSCode подхватил, автоматом создав task.json, правда в него он прописал пути до старого, давно удаленного пакета. Переправил на нынешний пакет и всё ок.
        Спасибо огромное! Наконец-то займусь делом, тем более тут еще идеек подкинули :)

        До этого две версии инсталляторов:
        mingw-w64-v11.0.0.zip
        mingw-get-setup.exe
        и всякие msys, типа:
        msys2-x86_64-20240113.exe
          Цитата Eretic @
          Это уже MSYS2 с оф. сайта установлена.

          Для сборки моего примера должны быть установлены:

          1) Тулчейн для clang64
          2) cmake для clang64
          3) ninja для clang64

          Ошибка типа "С compiler тру-ляля unknown" говорит лишь о том, что хоть и путь /clang64/bin включен в build.sh, но по факту этот тулчейн не установлен, ЕМНИП. Надо аккуратно все установить, ну или в build.sh в путях прописать путь к другому, установленному тулчейну, например, /mingw64/bin.
            Цитата Eretic @
            Это уже MSYS2 с оф. сайта установлена.

            Напомню, команда pacman -Ss название показывает все, что найдено в репозитарии. А вот установленные пакеты обозначаются отдельно. См. скрин по стрелкам.
            Прикреплённая картинка
            Прикреплённая картинка
              Цитата Majestio @
              1) Тулчейн для clang64
              2) cmake для clang64
              3) ninja для clang64

              Да, папки были пустые. Меня это удивило, но раз инсталлятор так сделал, значит так надо. Я же не знаю какие папки и для чего нужны.
              Беда всех инет FAQ по minGW и MSYS в том, что ни в одном не нашел хотя бы краткого описания: что за пакеты ставят, для чего? Везде просто инструкции, типа ставим xxxx-yyyy-zzzz.??? и будет счастье :)
              Даже в данном случае. Что за clang? что за ulang и чем всё это отличается от minGW? Это хорошо когда человек знает что ему нужно, а когда нет времени читать книги на сотни страниц?
              ===============================================
              Ну да ладно. Главное работает :)

              Потоки сделал. Классы для приёма и первичной обработки внешних данных (первый поток) и для дальнейшей обработки вторым потоком сделал. Работают. Правда там упоминается один буфер на два потока, я сделал класс буфера (там же мьютекс для доступа нужен) с std::list, хуже не будет, зато избавляет от некоторых проблем.
              Теперь осталось еще одно условие:
              ExpandedWrap disabled
                поток №2 не должен постоянно опрашивать общий буфер.

              И здесь тупик. Если в винде есть такое замечательное средство, как WaitForXXXXObject и мьютексы для пробуждения трэда, то в std::thread я ничего похожего не нашел. Или цитату стоит воспринимать как опрос раз в секунду-две, с последующим засыпанием? Есть у кого дельные мысли?

              И еще. Уточнил на счет взаимодействия программ. Действительно на сокетах. Хорошая "крссплатформенная" засада :D
                Цитата Eretic @
                Даже в данном случае. Что за clang?

                Это одна из реализаций компилятора языка С/C++. Так же есть реализации от Microsoft (MSVC), Intel (Intel OneAPI), GNU Compiller Collection (gcc или g++).

                Цитата Eretic @
                что за ulang и чем всё это отличается от minGW?

                Не знаю где вы нашли ulang. Я первый раз о таком услышал от вас, но вот MinGW это пакет утилит для Windows, который собирает все (или большинство) программ из коллекции GCC. Сама GCC разрабатывается как Open Source проект под Unix операционные системы и включает кучу различных утилит, реализующих интерпретацию программ на многих языках программирования (не только C/C++, но и другие).

                MSYS и MSYS2 это дополнительные пакеты, который добавляет к MinGW возможности частичной установки по мере необходимости. Это позволяет не загружать, достаточно объемную, коллекцию программ из MinGW. Т.е. по сути это менеджеры пакетов, включенных в состав MinGW. Если этот менеджер что-то оставил пустым, то вы просто не установили этот пакет. Если он вам нужен, то его надо просто добавить.

                Цитата Eretic @
                И здесь тупик. Если в винде есть такое замечательное средство, как WaitForXXXXObject и мьютексы для пробуждения трэда, то в std::thread я ничего похожего не нашел. Или цитату стоит воспринимать как опрос раз в секунду-две, с последующим засыпанием? Есть у кого дельные мысли?

                Можно сделать lock на буфер.
                  Цитата Eretic @
                  Если в винде есть такое замечательное средство, как WaitForXXXXObject и мьютексы для пробуждения трэда, то в std::thread я ничего похожего не нашел.
                  Дык и используй мьютексы. Поток исполнения сам по себе объектов синхронизации не содержит, даже в WinAPI. Что-то типа (внимание, синтетика!):
                  ExpandedWrap disabled
                    std::queue<std::string> msgs;
                    std::mutex         queueLock;
                    std::timed_mutex     evQueue;
                     
                    void queueAdd(const std::string& str)
                    {
                      std::lock_guard<std::mutex> guard(queueLock);
                     
                      msgs.emplace(str);
                      evQueue.unlock();
                    }
                     
                    std::string queueGet()
                    {
                      std::lock_guard<std::mutex> guard(queueLock);
                      std::string                   str(std::move(msgs.front()));
                     
                      msgs.pop();
                      if (msgs.empty()) evQueue.lock();
                     
                      return str;
                    }
                     
                    std::mutex evExit;
                     
                    void workThread()
                    {
                      using namespace std::literals::chrono_literals;
                     
                      while (!evExit.try_lock())
                      {
                        if (evQueue.try_lock_for(100ms))
                        {
                          evQueue.unlock();
                          doSome(queueGet());
                        }
                      }
                    }
                     
                    int main()
                    {
                      evExit.lock();
                      evQueue.lock();
                     
                      std::thread th1(workThread);
                     
                    /* ... */
                      evExit.unlock();
                      th1.join();
                    }
                    Цитата macomics @
                    MSYS и MSYS2 это дополнительные пакеты, который добавляет к MinGW возможности частичной установки по мере необходимости.

                    Немножко наоборот :lol: MSYS2 - это система эмуляции Linux-окружения (если точнее - ArchLinux-окружения). В ней различные реализации MinGW-w64 подключаются как тулчейны. Для каждого вида тулчейна имеется набор предсобранных библиотек. И конечно, чтобы этим пользоваться - нужно нужное ставить с помощью пакетного менелдера pacman.

                    Цитата Eretic @
                    Я же не знаю какие папки и для чего нужны.

                    На первых шагах тебе будет достаточно понять какие тулчейны есть в MSYS2. Давай сделаем поиск:

                    ExpandedWrap disabled
                      pacman -Ss gcc

                    Среди всего вывода выбираем именно gcc:

                    ExpandedWrap disabled
                      clangarm64/mingw-w64-clang-aarch64-gcc-compat
                      mingw32/mingw-w64-i686-gcc
                      mingw64/mingw-w64-x86_64-gcc
                      ucrt64/mingw-w64-ucrt-x86_64-gcc
                      clang32/mingw-w64-clang-i686-gcc-compat
                      clang64/mingw-w64-clang-x86_64-gcc-compat

                    Т.е. имеем список тулчейнов:
                    • clangarm64
                    • mingw32
                    • mingw64
                    • ucrt64
                    • clang32
                    • clang64
                    Естественно, для того чтобы ими пользоваться - их нужно предварительно установить той же программой pacman. Сама же среда MSYS2 изначально устанавливает только базовые наборы утилит, при установке MSYS2 тулчейны автоматически не ставятся. Надеюсь, ситуация прояснилась.
                      Цитата Eretic @
                      Уточнил на счет взаимодействия программ. Действительно на сокетах. Хорошая "крссплатформенная" засада
                      Совершенно несложно учесть разницу в конструкторах объектов-сокетах. Делов-то на один API-вызов. Но не сокетами ж едиными. Есть ещё файлы в $TEMP (...я бы так и вообще намутил basic_socketstream<> и натравил на std::​(i|o|io)stream), eсть готовые библиотеки, если религия заказчик не возражает.
                        Цитата Majestio @
                        Немножко наоборот
                        Это даже не противоречит
                        Цитата Majestio @
                        MSYS2 - это система эмуляции Linux-окружения (если точнее - ArchLinux-окружения). В ней различные реализации MinGW-w64 подключаются как тулчейны. Для каждого вида тулчейна имеется набор предсобранных библиотек. И конечно, чтобы этим пользоваться - нужно нужное ставить с помощью пакетного менелдера pacman.

                        сказанному тут
                        Цитата macomics @
                        MSYS и MSYS2 это дополнительные пакеты, который добавляет к MinGW возможности частичной установки по мере необходимости. Это позволяет не загружать, достаточно объемную, коллекцию программ из MinGW. Т.е. по сути это менеджеры пакетов, включенных в состав MinGW. Если этот менеджер что-то оставил пустым, то вы просто не установили этот пакет. Если он вам нужен, то его надо просто добавить.

                        Есть там эмуляция среды linux или нет - не важно. Главное эффект. Пакетный менеджер для MinGW
                          Цитата macomics @
                          Это даже не противоречит

                          Цитата macomics @
                          Пакетный менеджер для MinGW

                          Противоречие самое малое - пакетный менеджер, он для MSYS2, а не для MinGW. MinGW - там часть. Противоречие в том, что не MinGW там "главный" :lol:
                          Иными словами что кого включает. MSYS2 и его утиль включает MinGW. Но не наоборот. Это как сказать, что "Linux - это дополнительные пакеты, который добавляет к gcc возможности частичной установки по мере необходимости" ;)
                            Цитата Qraizer @
                            Дык и используй мьютексы.

                            Пытаюсь. Правда немного по другому.
                            ExpandedWrap disabled
                              class IOBuffer
                              {
                              private:
                                  std::list<std::string> buf;
                                  std::condition_variable io_cond;
                              ....
                               
                                  virtual void put(std::string in_str) {
                                      std::lock_guard<std::mutex> lock(io_mutex);
                                      buf.push_back(in_str);
                                      io_cond.notify_one();
                                  }
                               
                                  virtual std::string _wait()
                                  {
                                      std::unique_lock<std::mutex> guard(io_mutex);
                                      io_cond.wait(guard, []{return !buf.empty();});
                                      std::string tmp = get_unlock();
                                      guard.unlock();
                                      return tmp;
                                  }
                               
                              ....
                               
                              void output_thread(IOBuffer *io_buffer)
                              {
                                  OUTString str;
                                  str.clear();
                                  str.append_string(io_buffer->_wait());

                            То есть в начале потока, что должен извлекать данные с общего буфера и отправлять в другую программу, вызываем метод _wait(), который по идее организует остановку потока до тех пор, пока не придут данные в буфер (io_cond.notify_one()).
                            Проблемка в том, что
                            io_cond.wait(guard, []{return !buf.empty();});
                            ругается, мол нельзя использовать this. А главное вместо лямбды нельзя подставить функцию. Вот пытаюсь придумать, как обойти ограничение, очень уж идея понравилась на счет засыпания треда.

                            Добавлено
                            Цитата macomics @
                            Это одна из реализаций компилятора языка С/C++. Так же есть реализации от Microsoft (MSVC), Intel (Intel OneAPI), GNU Compiller Collection (gcc или g++).

                            Цитата Majestio @
                            Надеюсь, ситуация прояснилась.

                            Спасибо ребята, теперь более менее понятно. Скоро линукс по программе, там уже поглубже копну :)

                            Добавлено
                            Кстати, что за ошибку выдаёт VSCode:
                            ExpandedWrap disabled
                              на вложенную функцию "this" нельзя ссылаться внутри тела лямбды, если она не находится в списке записей

                            Это где я в лямбду пытаюсь подставить строку из класса.

                            Добавлено
                            Заработало!!!
                            Надо было this в [] добавить:
                            ExpandedWrap disabled
                              io_cond.wait(guard, [this]{return !buf.empty();});
                              Ну, я пытался оградить тебя от условных переменных, потому что их нет в WinAPI. Точнее, есть, в лице событий, и они в общем-то удобнее в использовании, но менее функциональны, т.к. способны – посредством WaitForMultipleObjects() – покрыть лишь некоторый поддиапазон возможных комбинаций условий. Но коли ты уже взялся за них, на здоровье.
                              Цитата Eretic @
                              Проблемка в том, что
                              io_cond.wait(guard, []{return !buf.empty();});
                              ругается, мол нельзя использовать this.
                              Можно. Просто передай его списком захвата:
                              ExpandedWrap disabled
                                io_cond.wait(guard, [this]{return !buf.empty();});
                              Цитата Eretic @
                              А главное вместо лямбды нельзя подставить функцию.
                              Можно. Подойдёт любой функциональный объект с синопсисом bool(). В частности и простые функции, но с ними неудобно то, что у них не должно быть параметров, а лямбды с захватом это решают влёгкую.

                              Добавлено
                              Цитата Eretic @
                              Заработало!!!
                              А. О. Ну нормалёк, чё. :good:

                              Добавлено
                              P.S. С this в списке захвата, как и с любым указателем или ссылкой, нужно быть аккуратным. Время жизни лямбды может превысить время жизни подссыльного объекта. В общем случае я бы рекомендовал захватывать через weak_ptr. Но не счас, слишком много сразу – голова поломается ещё.
                                Цитата Qraizer @
                                Ну, я пытался оградить тебя от условных переменных, потому что их нет в WinAPI. Точнее, есть, в лице событий, и они в общем-то удобнее в использовании, но менее функциональны, т.к. способны – посредством WaitForMultipleObjects() – покрыть лишь некоторый поддиапазон возможных комбинаций условий. Но коли ты уже взялся за них, на здоровье.

                                Рыская по инету я естественно встречал это понятие, но не понял о чём вообще речь. Потом случайно набрел на книгу некоего Уильямс Э. - "Параллельное программирование на C++". Прочитал главы, посвященные мьютексам и понял что мне нужно :) Поскольку читал бегло, еще не всё понял, а контейнеры потоков вообще пропустил. Но на досуге добью книжёнку.

                                Цитата Qraizer @
                                голова поломается ещё

                                Уже пухнет :) Сколько сегодня инета перелопатил - уму непостижимо. Но в целом картина многопоточности более-менее становится понятной. Во многом похожа на виндозную, разве что нет некоторых удобных вещей (или я их пока не нашел), а может просто кажется в силу моей привычки.
                                =============================================
                                Первый модуль готов, ввод/вывод работает как положено, строго по заданию (нет постоянного опроса буфера, нет глобальных переменных и тд).
                                Завтра займусь сокетами. Надеюсь удастся подобрать что-нибудь универсальное. А то время поджимает.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (5) 1 2 [3] 4 5  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0809 ]   [ 22 queries used ]   [ Generated: 22.12.24, 05:57 GMT ]