Russian Qt Forum

Разное => Говорилка => Тема начата: Alex Custov от Январь 19, 2017, 10:35



Название: Igors, это ты? :)
Отправлено: Alex Custov от Январь 19, 2017, 10:35
https://www.linux.org.ru/forum/development/13158009?lastmod=1484810731834

Цитировать
Есть проект. Почти весь написан на C++, GUI + очень малая часть функционала написана на C#. Целевая платформа: оффтопик.

Конечно же есть библиотека с утилитами всякими. И вот там тимлид сидит и пишет свои костыли для работы с файловой системой: итерация по директории, удаление файла и т.д.

Я никак не могу, зачем он это делает (NIH?), и стараюсь убедить его, что мол есть же Boost.Filesystem, юзай его. Ответ таков: Boost тяжёлый, тянуть не хочется да и вообще лень. А вот мои костыли это просто лучшее решение. И это после того, как я регулярно в его костылях правлю баги какие-нибудь.

И это касается не только Filesystem. Он ещё своё жалкое подобие lexical_cast впихнул и много чего ещё...


Название: Re: Igors, это ты? :)
Отправлено: Igors от Январь 19, 2017, 11:55
Нет, не я. Мое знакомство с бустом началось когда один из контракторов сказал что нужна boost::polygon. Я подумал и разрешил - оказалось очень к месту. В прошлом году работал с либой где использовалась boost::filesystem. Не могу сказать что в восторге - не очень интуитивный сынтаксыс, приходилось гуглить. Но запрещать я бы не стал. Вот собсно и весь мой бустовский багаж. А вообще open-sources приходится привлекать довольно часто, 3-4 раза в год, но вот буста в них почему-то нет (std практически тоже). Ну может скоро придется собирать "alembic", там вроде много, вот и потренируюсь.

Цитировать
И вот там тимлид сидит и пишет свои костыли для работы с файловой системой: итерация по директории, удаление файла и т.д.
Не думаю что здесь много фанатов boost::filesystem. Наверное потому что и с QDir все очень неплохо

Цитировать
И это касается не только Filesystem. Он ещё своё жалкое подобие lexical_cast впихнул и много чего ещё...
Откуда такая может быть ненависть к Boost? И как с этим можно бороться?
Тут ясно видна "ненависть к великам", видимо человек затратил много сил на постижение бустовских премудростей, теперь считает их "единственно правильными" и пытается их навязывать другим - это в любом случае нехорошо, да и толку не будет. По-человечески я конечно понимаю - "разобрался", "дошло", хочется поделиться - это нормально. Только вот какую часть проекта покроют эти разборки? У меня - ну точно не скажу, где-то порядка 1% (может быть)



Название: Re: Igors, это ты? :)
Отправлено: Racheengel от Январь 19, 2017, 16:42
Либо тимлид понимает, что он как тимлид некомпетентен и таким образом старается повысить свою значимость на проекте.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Январь 19, 2017, 17:08
Не думаю что здесь много фанатов boost::filesystem. Наверное потому что и с QDir все очень неплохо

Беда в том, что дуст::файлсистем в стандарт запихнули:(


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 13, 2018, 14:18
Нет, не я. Мое знакомство с бустом началось когда один из контракторов сказал что нужна boost::polygon. Я подумал и разрешил - оказалось очень к месту. В прошлом году работал с либой где использовалась boost::filesystem. Не могу сказать что в восторге - не очень интуитивный сынтаксыс, приходилось гуглить. Но запрещать я бы не стал. Вот собсно и весь мой бустовский багаж. А вообще open-sources приходится привлекать довольно часто, 3-4 раза в год, но вот буста в них почему-то нет (std практически тоже). Ну может скоро придется собирать "alembic", там вроде много, вот и потренируюсь.

Цитировать
И вот там тимлид сидит и пишет свои костыли для работы с файловой системой: итерация по директории, удаление файла и т.д.
Не думаю что здесь много фанатов boost::filesystem. Наверное потому что и с QDir все очень неплохо

Цитировать
И это касается не только Filesystem. Он ещё своё жалкое подобие lexical_cast впихнул и много чего ещё...
Откуда такая может быть ненависть к Boost? И как с этим можно бороться?
Тут ясно видна "ненависть к великам", видимо человек затратил много сил на постижение бустовских премудростей, теперь считает их "единственно правильными" и пытается их навязывать другим - это в любом случае нехорошо, да и толку не будет. По-человечески я конечно понимаю - "разобрался", "дошло", хочется поделиться - это нормально. Только вот какую часть проекта покроют эти разборки? У меня - ну точно не скажу, где-то порядка 1% (может быть)




а что именно в std::filesystem не интуитивно понятно?


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 13, 2018, 14:58
Нет, не я. Мое знакомство с бустом началось когда один из контракторов сказал что нужна boost::polygon. Я подумал и разрешил - оказалось очень к месту. В прошлом году работал с либой где использовалась boost::filesystem. Не могу сказать что в восторге - не очень интуитивный сынтаксыс, приходилось гуглить. Но запрещать я бы не стал. Вот собсно и весь мой бустовский багаж. А вообще open-sources приходится привлекать довольно часто, 3-4 раза в год, но вот буста в них почему-то нет (std практически тоже). Ну может скоро придется собирать "alembic", там вроде много, вот и потренируюсь.

Цитировать
И вот там тимлид сидит и пишет свои костыли для работы с файловой системой: итерация по директории, удаление файла и т.д.
Не думаю что здесь много фанатов boost::filesystem. Наверное потому что и с QDir все очень неплохо

Цитировать
И это касается не только Filesystem. Он ещё своё жалкое подобие lexical_cast впихнул и много чего ещё...
Откуда такая может быть ненависть к Boost? И как с этим можно бороться?
Тут ясно видна "ненависть к великам", видимо человек затратил много сил на постижение бустовских премудростей, теперь считает их "единственно правильными" и пытается их навязывать другим - это в любом случае нехорошо, да и толку не будет. По-человечески я конечно понимаю - "разобрался", "дошло", хочется поделиться - это нормально. Только вот какую часть проекта покроют эти разборки? У меня - ну точно не скажу, где-то порядка 1% (может быть)




а что именно в std::filesystem не интуитивно понятно?

directory_iterator который сам себе и итератор и контейнер по которому итерируется.
path который string на 1й системе и wstring на другой. прям взяли книжку "как не надо писать на плюсах" и написали


Название: Re: Igors, это ты? :)
Отправлено: Igors от Август 14, 2018, 06:34
а что именно в std::filesystem не интуитивно понятно?
Ну вот зачем так тупо цитировать (пусть даже мои посты  :))?

Я и не подозревал о существовании std::filesystem и узнал о нем только сегодня, из Вашего вопроса. Поэтому что там (не)интуитивно - сказать не могу. Но смущает сам подход - да мало ли чего где "есть", так что, бросаться учить всякую новую "фишку"? Ну это если проектом не сильно загружен и есть время лазить там и сям.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 15, 2018, 13:08
а что именно в std::filesystem не интуитивно понятно?
Ну вот зачем так тупо цитировать (пусть даже мои посты  :))?

Я и не подозревал о существовании std::filesystem и узнал о нем только сегодня, из Вашего вопроса. Поэтому что там (не)интуитивно - сказать не могу. Но смущает сам подход - да мало ли чего где "есть", так что, бросаться учить всякую новую "фишку"? Ну это если проектом не сильно загружен и есть время лазить там и сям.

речь не о том, нужно ли что учить или нет.
выше вы писали:
использовалась boost::filesystem. Не могу сказать что в восторге - не очень интуитивный сынтаксыс, приходилось гуглить
что именно не интуитивно понятно?

fs очень маленькая.
содержит только типичный набор функциональности.
просто любопытно, что там может быть не понятным?


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 15, 2018, 13:20
directory_iterator который сам себе и итератор и контейнер по которому итерируется.

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

а вот фраза: "сам себе и итератор и контейнер по которому итерируется" - смахивает на какой то бред.

path который string на 1й системе и wstring на другой. прям взяли книжку "как не надо писать на плюсах" и написали

path - платформо-зависимое явление.
очевидно жеж, что в зависимости от платформы он может быть utf-8, utf-16, ansi, etc.

к тому же, совершенно не принципиально, как именно хранит path свои буковки
принципиально, что у пользователя в распоряжении кучка методов,
которые позволяют извлечь path явно, как std::string, std::wstring, как utf-8, etc

это удобно, и логично.

и причем тут книжка "как не надо писать на плюсах"?


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 15, 2018, 17:25

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

а вот фраза: "сам себе и итератор и контейнер по которому итерируется" - смахивает на какой то бред.

И часто вы можете от итератора позвать std::begin? Или всё таки от контейнера? а от dir iteratora - можете (чтобы работал for_range). for по итератору! Причем достаточно было бы поменять название.


path - платформо-зависимое явление.
очевидно жеж, что в зависимости от платформы он может быть utf-8, utf-16, ansi, etc.

к тому же, совершенно не принципиально, как именно хранит path свои буковки
принципиально, что у пользователя в распоряжении кучка методов,
которые позволяют извлечь path явно, как std::string, std::wstring, как utf-8, etc

это удобно, и логично.

Угу, и это превращается в код вида
Код:
#ifdef Q_OS_WIN
label->setText(QString::fromStdWString(path.wstring()));
#else
label->setText(QString::fromStdString(path.string()));
#endif

Удобно. Логично. То есть даже тот факт, что WString никто не исользует просто потому, что он непереносим между платформами, их ничему не научил.

и причем тут книжка "как не надо писать на плюсах"?

При том, что другие разработчики стандартных библиотек на это уже напарывались и достаточно было почитать энторнеты, а не тащить дуст в стандарт.

Upd: вот это тоже прекрасно

Цитировать
Otherwise, if path::value_type is wchar_t, conversion, if any, is unspecified. This is the case on Windows, where wchar_t is 16 bit and the native encoding is UTF-16.
Otherwise, if path::value_type is char16_t, native encoding is UTF-16 and the conversion method is unspecified.
Otherwise, if path::value_type is char32_t, native encoding is UTF-32 and the conversion method is unspecified.


Название: Re: Igors, это ты? :)
Отправлено: Igors от Август 16, 2018, 07:37
речь не о том, нужно ли что учить или нет.
выше вы писали:
использовалась boost::filesystem. Не могу сказать что в восторге - не очень интуитивный сынтаксыс, приходилось гуглить
что именно не интуитивно понятно?

fs очень маленькая.
содержит только типичный набор функциональности.
просто любопытно, что там может быть не понятным?
Ну хорошо, вот я открыл упомянутую либу и взял наугад шматок с boost::filesystem.
Код:
		boost::filesystem::path p( soundCacheDir );
#if (BOOST_VERSION > 104400)
boost::filesystem::path abs_p = boost::filesystem::absolute( p );
#else
boost::filesystem::path abs_p = boost::filesystem::complete( p );
#endif

//            char full[ _MAX_PATH ];
//            if ( _fullpath( full, "..\\..\\..\\..\\..", _MAX_PATH ) != NULL )
#if (BOOST_VERSION > 104400)
        if ( boost::filesystem::exists( abs_p ) )
#else
        if ( boost::filesystem2::exists( abs_p ) )
#endif
        {
            //soundFile = string( full ) + string( "/" ) + soundFile;
p  /= soundFile;
            soundFile = abs_p.string() + string("/") + soundFile;
        }
Чехарда с версиями - и править код сторонней либы как-то не тянет. И оказывается есть filesystem и filesystem2 - какую читать? Оператор /=, ну наверное добавляет путь, хз. Быстренько в этом убедиться (просто открыв букварь) не получится, не та система. И предположение что используется правый слеш - значит кто-то должен заботиться о нативных вызовах злосчастного Вындоуз.

Что же тут "такого уж хорошего"? Разве это интуитивно? Или может это как-то компенсируется "глубиной концепций"? По-моему вовсе нет, особенно если сравнить с QDir и QFileInfo - вот удобные классы для людей, а не так. операторы задрочить.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 16, 2018, 21:03
Igors

Очевидно, что в std::filesystem чехарды с версиями нет, а / платформозависимый.


Название: Re: Igors, это ты? :)
Отправлено: Racheengel от Август 16, 2018, 23:03
вот сколько лет в плюсах, еще никогда,  ну ни разу не было необходимости обращаться к дусту... всегда находились более адекватные альтернативы,  вернее,  даже не так - имея qt под рукой,  даже не встал вопрос о поиске альтернативы.


Название: Re: Igors, это ты? :)
Отправлено: Igors от Август 17, 2018, 10:07
Очевидно, что в std::filesystem чехарды с версиями нет, а / платформозависимый.
Зато есть словечко "experimental" быстро охлаждающее энтузиазм  :)

вот сколько лет в плюсах, еще никогда,  ну ни разу не было необходимости обращаться к дусту... всегда находились более адекватные альтернативы,  вернее,  даже не так - имея qt под рукой,  даже не встал вопрос о поиске альтернативы.
Не, ну идеи/задумки там конечно интересные, но елы-палы, как "неласково" :'( Чем-то быстро попользоваться (попастись) практически нереально.  Надо вникать в концепции, потом где-то изыскивать примеры, потренироваться, ну и вот тогда.. (может быть)... Но обычно дело-то этого не стоит. Ну та же filesystem - да нафиг мне надо во что-то там "вникать", мне надо удобно выдрать список файлов каталога, и чем быстрее я это решу - тем лучше.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 17, 2018, 10:55
Зато есть словечко "experimental" быстро охлаждающее энтузиазм  :)

Макопролемы, на венде и линуксе уже есть полная поддержка с++17 без experimental::.

Просто яблоко забыло новые (с++17) хедера положить, проблема известная.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 17, 2018, 13:51
И часто вы можете от итератора позвать std::begin? Или всё таки от контейнера? а от dir iteratora - можете (чтобы работал for_range). for по итератору! Причем достаточно было бы поменять название.

не часто.
Цитировать
error: ‘class boost::filesystem::directory_iterator’ has no member named ‘begin’

а вот идея "итерируйся пока валиден" - очень даже правильная.
применяется повсеместно везде, кроме стандартных итераторов std


Угу, и это превращается в код вида
Код:
#ifdef Q_OS_WIN
label->setText(QString::fromStdWString(path.wstring()));
#else
label->setText(QString::fromStdString(path.string()));
#endif

а кто вам запрещал юзать всегда std::string? или всегда std::wstring?

ваш label->setText это не поддерживает?

бывает. только fs тут причем?



Удобно. Логично. То есть даже тот факт, что WString никто не исользует просто потому, что он непереносим между платформами, их ничему не научил.

это - не факт.
потому что его юзают, и ещё как.
под виндой юзают на полную катушку.
потому что там юникод во все поля.

только fs то тут причем? она заставляет вас юзать std::wstring?

При том, что другие разработчики стандартных библиотек на это уже напарывались и достаточно было почитать энторнеты, а не тащить дуст в стандарт.
другие разработчики вынудили вас написать это:
Цитировать
#ifdef Q_OS_WIN

фокус в том, что разработчики пляшут от платформы.
а платформа поклала на проблемы разработчиков.

Upd: вот это тоже прекрасно

Цитировать
Otherwise, if path::value_type is wchar_t, conversion, if any, is unspecified. This is the case on Windows, where wchar_t is 16 bit and the native encoding is UTF-16.
Otherwise, if path::value_type is char16_t, native encoding is UTF-16 and the conversion method is unspecified.
Otherwise, if path::value_type is char32_t, native encoding is UTF-32 and the conversion method is unspecified.

а ещё, порядок вычисления аргументов функции есть unspecified
у вас какая то проблема?

может быть аргументы плохо вычисляются?
или conversion method как то плохо работает на какой то конкретной платформе?


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 17, 2018, 14:05
Ну хорошо, вот я открыл упомянутую либу и взял наугад шматок с boost::filesystem.
Код:
		boost::filesystem::path p( soundCacheDir );
#if (BOOST_VERSION > 104400)
boost::filesystem::path abs_p = boost::filesystem::absolute( p );
#else
boost::filesystem::path abs_p = boost::filesystem::complete( p );
#endif

//            char full[ _MAX_PATH ];
//            if ( _fullpath( full, "..\\..\\..\\..\\..", _MAX_PATH ) != NULL )
#if (BOOST_VERSION > 104400)
        if ( boost::filesystem::exists( abs_p ) )
#else
        if ( boost::filesystem2::exists( abs_p ) )
#endif
        {
            //soundFile = string( full ) + string( "/" ) + soundFile;
p  /= soundFile;
            soundFile = abs_p.string() + string("/") + soundFile;
        }
Чехарда с версиями - и править код сторонней либы как-то не тянет.
зачем его править? у вас что-то не работает?

И оказывается есть filesystem и filesystem2 - какую читать?
впервые слышу про filesystem2
гугл кстати, тоже ничего о ней не знает.

Оператор /=, ну наверное добавляет путь, хз.
вот видите как все интуитивно.

мне вот любопытно, а что ещё мог бы делать слэш в файловых путях?

Быстренько в этом убедиться (просто открыв букварь) не получится, не та система.

то есть, написать:
Код:
fs::path p = fs::current_path()/"..";
это что-то запредельно сложное?
http://rextester.com/QYP64737

И предположение что используется правый слеш - значит кто-то должен заботиться о нативных вызовах злосчастного Вындоуз.

ээээ... не распарсил этот поток сознания. винде вообще пофигу: правый/левый.
причем тут fs?

Что же тут "такого уж хорошего"? Разве это интуитивно? Или может это как-то компенсируется "глубиной концепций"? По-моему вовсе нет, особенно если сравнить с QDir и QFileInfo - вот удобные классы для людей, а не так. операторы задрочить.

я покамест не увидел примеров не интуитивности.
QDir и QFileInfo - те же яйца.
в чем принципиальное отличие?


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 17, 2018, 15:45

а кто вам запрещал юзать всегда std::string? или всегда std::wstring?

ваш label->setText это не поддерживает?

бывает. только fs тут причем?


Всегда std::string мешает юзать то, что conversion uncpecified.
Всегда std::wstring мешает юзать то, что на линуксе он 4 байта, а не 2 как на венде.
Проблемки-с.


Название: Re: Igors, это ты? :)
Отправлено: Igors от Август 17, 2018, 16:59
я покамест не увидел примеров не интуитивности.
QDir и QFileInfo - те же яйца.
в чем принципиальное отличие?
Да я собсно ничего доказывать не собирался, Вы спросили чем мне boost::filesystem не приглянулся - я ответил. Насчет Qt реализации - ну поприятнее и побогаче, напр задать фильтры так и сяк и забрать контейнер, а не тюкать по одному тем итератором..

Принципиальной разницы - разумеется никакой, НО опять-таки: мне не нравится сам подход. Ну вот ЗАЧЕМ мне "асиливать" тот или иной std класс ? Просто так, "повышать повышаемость"?  У любого использующего Qt эта потребность давным-давно закрыта. Ах, вот если надо будет сделать консольное приложение.. ну вот тогда этот класс и открою, а так "на всякий случай" есть бездарное разбазаривание  интеллектуальных ресурсов.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 20, 2018, 14:14
Всегда std::string мешает юзать то, что conversion uncpecified.

каким именно образом conversion uncpecified мешает вам юзать std::string?
приведите пример.

Всегда std::wstring мешает юзать то, что на линуксе он 4 байта, а не 2 как на венде.
Проблемки-с.

не очевидно, при чем тут вообще fs.
и не очевидно, как вообще факт плавающего размера типа может помешать его использовать.
приведите пример.

сейчас ваши тезисы со стороны выглядят так:

- я не могу использовать int, потому что его размер может плавать на разных платформах
- ээээ.... и как тебе это помешало????



Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 20, 2018, 14:39
Да я собсно ничего доказывать не собирался,
я не просил никаких доказательств. я спросил: что именно не удобно? приведите пример неинтуитивности, или и неудобств?

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

Вы спросили чем мне boost::filesystem не приглянулся - я ответил.
но вы же вообще не привели никакой конкретики.
не очевидно: что именно не так?

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

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

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

где сама по себе идея: "перебрать файлы" - и есть по сути работа с итератором.



Ну вот ЗАЧЕМ мне "асиливать" тот или иной std класс ?
с таким же успехом, этот вопрос можно задать в отношении любой технологии.
например: "ну вот зачем мне осиливать классы Qt?"

ответ прост и очевиден: осиливать Qt придется, если хочется состояться,
как программист Qt.

осиливать std придется, если хочется состояться,
как программист с++

У любого использующего Qt эта потребность давным-давно закрыта. Ах, вот если надо будет сделать консольное приложение.. ну вот тогда этот класс и открою, а так "на всякий случай" есть бездарное разбазаривание  интеллектуальных ресурсов.

я использую Qt.
при этом у меня есть потребность знать с++.
что бы являться специалистом по с++.
или что бы понимать чужой исходный код, например.
или что бы эффективнее использовать возможности языка.
или потому что std во многих случаях тупо удобнее, чем решения Qt.

например, нужно по быстрому создать независимый (детачнутый) тред.
Код:
std::thread(threadFunction).detach();
в случае с qt всегда нужно помнить о нюансах: система кютешных сообщений.
которые по итогу выливаются в подобную хрень:
https://toster.ru/q/289471
https://habr.com/post/202312/
http://rsdn.org/forum/cpp.qt/6946232.all

куча кода ради кода, только за ради поддержания куютешной архитектуры.



Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 20, 2018, 21:17
каким именно образом conversion uncpecified мешает вам юзать std::string?
приведите пример.

Я, может быть, неправильно читаю документацию, но это значит, что конвертации UTF16 -> UTF8 (std::string) на венде нет. Может вам сделают её, а может и нет. А может это будет cp1251 или любая другая local8bit. То есть надо ЯВНО указать, как конвертировать (QString::fromWChar(path.wstring()).toUtf8()).

не очевидно, при чем тут вообще fs.
и не очевидно, как вообще факт плавающего размера типа может помешать его использовать.
приведите пример.

сейчас ваши тезисы со стороны выглядят так:

- я не могу использовать int, потому что его размер может плавать на разных платформах
- ээээ.... и как тебе это помешало????

При  том, что wchar_t на венде - это UTF16, а та же самая строка на линуксе - это UTF32 и с ними вообще всё по разному (int, во-первых, в реальности везде 32бита, а во вторых, над ним определены операции, дающие определенный результат (пока нет переполнения)). А в случае wchar_t даже простая итерация различается из-за размера (с учетом суррогатной пары или без))


Название: Re: Igors, это ты? :)
Отправлено: Igors от Август 21, 2018, 03:29
осиливать std придется, если хочется состояться,
как программист с++
Не разделяю этого мнения (к сожалению, популярного). Бездумное пожирание std ничего не дает ни уму ни сердцу, зато изрядно калечит молодых ребят.

или потому что std во многих случаях тупо удобнее, чем решения Qt.

например, нужно по быстрому создать независимый (детачнутый) тред.
Код:
std::thread(threadFunction).detach();
в случае с qt всегда нужно помнить о нюансах: система кютешных сообщений.
которые по итогу выливаются в подобную хрень:
https://toster.ru/q/289471
https://habr.com/post/202312/
http://rsdn.org/forum/cpp.qt/6946232.all

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

- сделать 2 нитки, одна принимает символ с клавы, другая печатает

Сделать это пуляя Qt сигналами - не вопрос, а вот на std - придется изрядно попыхтеть. Конечно std::thread - это хорошо, избавляет от походов в нативняк всякий раз когда нет фреймворка. Но упиваться std решениями опрометчиво, стандартная библиотека и не должна быть "лучшей", она всего лишь должна "обеспечивать достойную конкуренцию".


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 21, 2018, 12:08
Я, может быть, неправильно читаю документацию, но это значит, что конвертации UTF16 -> UTF8 (std::string) на венде нет. Может вам сделают её, а может и нет. А может это будет cp1251 или любая другая local8bit. То есть надо ЯВНО указать, как конвертировать (QString::fromWChar(path.wstring()).toUtf8()).
вы не правильно понимаете понятие "uncpecified".
в плюсах есть два понятия: "undefined behavior" и "uncpecified behavior"
первое означает: "поведение не определенно, но все плохо".
второе - "поведение не определено, но все хорошо".

вам не нужно думать,
как именно fs выполнит преобразования для std::string на конкретной платформе.
раз оно "uncpecified", значит каким бы оно ни было - все будет хорошо.

конвертации UTF16 -> UTF8 (std::string) на венде нет
uppsss...
std::filesystem::path::generic_u8string


вы вообще документацию смотрели?
я ж не зря выше писал: к вашим услугам целая пачка функций-конвертеров.

хотите UTF16?
о боже!
std::filesystem::path::generic_u16string

или может быть UTF32? ну вы понэли.







При  том, что wchar_t на венде - это UTF16, а та же самая строка на линуксе - это UTF32 и с ними вообще всё по разному
"все по разному" - так бабы говорят. у них часто либо "все", либо "ничего".
безотносительно здравому смыслу.

очевидно жеж, что у них не все по разному.
приведите хоть один пример,
как на практике вам внезапно помешало различие в размере типа на разных платформах.

и почему я каждый раз вынужден задавать вам один и тот же вопрос: "почему вы так думаете? приведите пример"
вы в состоянии сразу аргументировать свои тезисы?


(int, во-первых, в реальности везде 32бита, а во вторых, над ним определены операции, дающие определенный результат (пока нет переполнения)). А в случае wchar_t даже простая итерация различается из-за размера (с учетом суррогатной пары или без))

по-первых, в реальности int реально плавающий.
а во вторых, для basic_string<char_type> определены операции, дающие определенный результат

случае wchar_t даже простая итерация различается из-за размера (с учетом суррогатной пары или без))
это что за бред?
пример "различий" вы конечно привести не в состоянии.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 21, 2018, 12:20
Может я чего-то не понял, поясните зачем такое чудо (независимая нитка) нужно?
зачем вообщще нужны нитки вы в курсе?
чем более они независимые в контексте решаемой задачи - тем лучше.
это как бе азбука "фри-лок" алгоритмов.



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

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



И что плохого в Qt сообщениях?
тормозные. неудобные. не интуитивные.

Пример

- сделать 2 нитки, одна принимает символ с клавы, другая печатает

Сделать это пуляя Qt сигналами - не вопрос, а вот на std - придется изрядно попыхтеть.
попыхтеть?

Код:
std::thread(processKeyboard).detach();
std::thread(processPrinter).detach();

это конечно неиллюзорно трудно!

Конечно std::thread - это хорошо, избавляет от походов в нативняк всякий раз когда нет фреймворка. Но упиваться std решениями опрометчиво, стандартная библиотека и не должна быть "лучшей", она всего лишь должна "обеспечивать достойную конкуренцию".

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

кутешный тред - прожорливая скатина.
стандартный - тупо оч тонкая обертка над системным апи.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 21, 2018, 12:21

это что за бред?
пример "различий" вы конечно привести не в состоянии.


Очень удобно называть аргументы бредом:)

Я, если честно, так и не понял, чем generic отличается от native. До того, как вы о нем сказали, я даже не знал. Вот я читаю документацию и вижу копипасту с заменой native/generic. И чо?


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 21, 2018, 12:26

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

Не нужно. До какой-то версии QThread::run был вообще pure virtual.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 21, 2018, 12:30
Очень удобно называть аргументы бредом:)

бред - неадекватное, не соответствующее реальности представление, рассуждение, или вывод

ваши "аргументы" - это бред,
потому что итерация по wstring абсолюбтно точно такая же,
как итерация по string,
или итерация по какому нибудь basic_string<custom_type>

привести пример различий итераций для string и wstring вы не сможете.
потому что их не существует.




Я, если честно, так и не понял, чем generic отличается от native. До того, как вы о нем сказали, я даже не знал. Вот я читаю документацию и вижу копипасту с заменой native/generic. И чо?

и то, вы как то странно смотрите.

нет там никакой копипасты.
есть кучка конвертеров,  и один единственный метод 'native'



Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 21, 2018, 12:31

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

Не нужно. До какой-то версии QThread::run был вообще pure virtual.

приведите пример "не нужности"
я сам помниццо, наступил на эти грабли, и пинал вручную евент-луп.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 21, 2018, 12:36

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

Не нужно. До какой-то версии QThread::run был вообще pure virtual.

приведите пример "не нужности"
я сам помниццо, наступил на эти грабли, и пинал вручную евент-луп.


1. http://doc.qt.io/qt-5/qthread.html#create
2. берете и переопреляете run() и не нужен никакой эвентлуп из 7 залуп


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 21, 2018, 12:51

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

Не нужно. До какой-то версии QThread::run был вообще pure virtual.

приведите пример "не нужности"
я сам помниццо, наступил на эти грабли, и пинал вручную евент-луп.


1. http://doc.qt.io/qt-5/qthread.html#create
2. берете и переопреляете run() и не нужен никакой эвентлуп из 7 залуп

и этот новый тред не получает сигналов.

а что бы получал, придется мало мало залупиццо.

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

мне что б тупо сделать отдельный тред нужно от чего то там наследоваться?
и пинать в ручную евент-луп.

вместо одной простоq строки: std::thread(threadFunction).detach();

сама по себе технология слотов-сигналов - ущербное унылое г.

если я захочу послать объектам сообщение, я сделаю:

Код:
struct message { /* любые поля и методы */ };

const message msg{ /*intialization*/ };

send_message(msg); // <--- все кто подписан на message (или на имена мемберов посылки)
// получат это сообщение

разруливается времени компиляции. и для этого мне не нужны никакие моки.


Название: Re: Igors, это ты? :)
Отправлено: Igors от Август 21, 2018, 14:51
Пример

- сделать 2 нитки, одна принимает символ с клавы, другая печатает

Сделать это пуляя Qt сигналами - не вопрос, а вот на std - придется изрядно попыхтеть.
попыхтеть?

Код:
std::thread(processKeyboard).detach();
std::thread(processPrinter).detach();

это конечно неиллюзорно трудно!
А что делает этот detach? Теперь нитка не может быть joined - зачем? И что это дает? Да ничего, наоборот, добавляет проблем

зачем вообщще нужны нитки вы в курсе?
чем более они независимые в контексте решаемой задачи - тем лучше.
это как бе азбука "фри-лок" алгоритмов.
Ну а lock-free то здесь причем? И что это за (не)зависимость такая? Разве команды не выполняются параллельно (simultaneously как говорят буржуи) при наличии 2 и более ядер?

На всякий случай повторю задачку
Цитировать
- сделать 2 нитки, одна принимает символ с клавы, другая печатает
Прошу исполнить на чудесном std


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 21, 2018, 15:21
А что делает этот detach?
детачит тред. внезапно, да?

Теперь нитка не может быть joined - зачем? И что это дает? Да ничего, наоборот, добавляет проблем
если вам ничего не дает - можете и не детачить.
никто как бе и не заставляет.
однако в большинстве случаев одиночные треды как раз таки юзают в свободном плаваньи.
а там, где все таки нужен объект связанный с тредом, уже просится тред-пул,
а не тред-одиночка.



Ну а lock-free то здесь причем? И что это за (не)зависимость такая?

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

очевидно, что чем больше в программе встречаются вот таких вот мутексов,
тем медленнее будет работать вся система.

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

структуры данных и алгоритмы, которые обеспечивают безопасную работу в условиях многопоточности,
без использования примитивов синхронизации,
в простонорадье называют "lock-free"

На всякий случай повторю задачку
сделать 2 нитки, одна принимает символ с клавы, другая печатает
Прошу исполнить на чудесном std


я же уше выше показал как это можно сделать:
Код:
std::thread(processKeyboard).detach();
std::thread(processPrinter).detach();

и не нужно ничего ни от кого наследовать,
и переопределять какоё то дураццкий run,
и завязываться на дураццкие не нужные слоты-сигналы,
только для того, что бы тред заработал.

QT - слишком многословный.
приходится печатать много буковок за ради простых вещей.


Название: Re: Igors, это ты? :)
Отправлено: Igors от Август 21, 2018, 16:16
я же уше выше показал как это можно сделать:
Код:
std::thread(processKeyboard).detach();
std::thread(processPrinter).detach();

и не нужно ничего ни от кого наследовать,
и переопределять какоё то дураццкий run,
и завязываться на дураццкие не нужные слоты-сигналы,
только для того, что бы тред заработал.
И что  ??? Как это поможет? Напр "печатающей" нитке нужно знать что символ "готов" и его можно печатать. В Qt c помощью тех самых "дураццких" сигналов это легко сделать и новичку (кстати и перекрывать ничего не надо). А вот как на std - покажите


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 21, 2018, 16:53

и этот новый тред не получает сигналов.

а что бы получал, придется мало мало залупиццо.

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

мне что б тупо сделать отдельный тред нужно от чего то там наследоваться?
и пинать в ручную евент-луп.

вместо одной простоq строки: std::thread(threadFunction).detach();

сама по себе технология слотов-сигналов - ущербное унылое г.

если я захочу послать объектам сообщение, я сделаю:

Вы сами себе противоречите, то вам нужны сигнал-слоты и приходится чо-то там делать с эвентлупом, то не нужны. Какие слоты в std::thread??


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 22, 2018, 11:47
И что  ??? Как это поможет? Напр "печатающей" нитке нужно знать что символ "готов" и его можно печатать.
печатающая нитка сама знает, когда готовы её данные
потому что она отвечает за их подготовку.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 22, 2018, 11:53

и этот новый тред не получает сигналов.

а что бы получал, придется мало мало залупиццо.

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

мне что б тупо сделать отдельный тред нужно от чего то там наследоваться?
и пинать в ручную евент-луп.

вместо одной простоq строки: std::thread(threadFunction).detach();

сама по себе технология слотов-сигналов - ущербное унылое г.

если я захочу послать объектам сообщение, я сделаю:

Вы сами себе противоречите, то вам нужны сигнал-слоты и приходится чо-то там делать с эвентлупом, то не нужны. Какие слоты в std::thread??


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

Какие слоты в std::thread??

std::function<type> должно хватить всем.
для особых ценителей есть boost::signals2

мне он не нра. слишком многословный.
предпочитаю свою собственную event-system,
которая разруливает всю коммуникацию времени компиляции,
и не вынуждает хранить какие то объекты, или от чего то там наследоваццо.

но на практике в 99% за глаза хватает std::function<type>


Название: Re: Igors, это ты? :)
Отправлено: Igors от Август 22, 2018, 13:12
печатающая нитка сама знает, когда готовы её данные
потому что она отвечает за их подготовку.
Похоже "включается непонималка".
Цитировать
- сделать 2 нитки, одна принимает символ с клавы, другая печатает
Разумеется "печатает тот самый символ что первая приняла с клавы" (неудобно разжевывать). Поэтому ничего она не знает, символ надо как-то передавать. Как Вы это сделаете средствами std ?


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 22, 2018, 14:06
Похоже "включается непонималка".
Цитировать
- сделать 2 нитки, одна принимает символ с клавы, другая печатает
Разумеется "печатает тот самый символ что первая приняла с клавы" (неудобно разжевывать). Поэтому ничего она не знает, символ надо как-то передавать. Как Вы это сделаете средствами std ?

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


ну ок. тогда так:

Код:
tools::thread_pool pool;

const auto proccessKey = [](const auto& key) { /*...*/ };

const auto inputKey = [&pool]()
{
    const auto key = keyboard();

    if(check_need_exit(key))
        pool.stop();
    else
        pool.add_task(proccessKey, key);
};

pool.add_task(inputKey);
pool.start();

pool.wait_stop_all();


Название: Re: Igors, это ты? :)
Отправлено: Igors от Август 23, 2018, 16:29
ну ок. тогда так:
По меньшей мере трижды было сказано "сделать 2 нитки" - а Вы лепите пул, это совсем не одно и то же. И разве tools::thread_pool - штатное средство std? Где же богатырская сила если для студенческой лабы "производитель-потребитель" уже приходится привлекать сторонние зависимости?

вам нафига два потока, если согласно вашему алгоритму,
юзаться потоки должны последовательно?
Профессионал не спрашивает отчего да почему и не критикует задачу, он просто ее делает. А умельцев типа "как не делать (и обосновать)" всегда было и будет с избытком и без нас  :)

это что за бред?
Грубость ни к чему


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 27, 2018, 11:49
По меньшей мере трижды было сказано "сделать 2 нитки" - а Вы лепите пул, это совсем не одно и то же. И разве tools::thread_pool - штатное средство std? Где же богатырская сила если для студенческой лабы "производитель-потребитель" уже приходится привлекать сторонние зависимости?
вы можете хоть 10 раз сказать: "мне нужны именно нитки",
но лично я не полезу на первый этаж через чердак,
если могу зайти через парадные двери.

tools::thread_pool - тонкая обертка над std::thread и std::conditional_variable.

если вам хочется глянуть, что там под капотом:
https://en.cppreference.com/w/cpp/thread/condition_variable


Код:
#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable>
 
std::mutex m;
std::condition_variable cv;
std::string data;
bool ready = false;
bool processed = false;
 
void worker_thread()
{
    // Wait until main() sends data
    std::unique_lock<std::mutex> lk(m);
    cv.wait(lk, []{return ready;});
 
    // after the wait, we own the lock.
    std::cout << "Worker thread is processing data\n";
    data += " after processing";
 
    // Send data back to main()
    processed = true;
    std::cout << "Worker thread signals data processing completed\n";
 
    // Manual unlocking is done before notifying, to avoid waking up
    // the waiting thread only to block again (see notify_one for details)
    lk.unlock();
    cv.notify_one();
}
 
int main()
{
    std::thread worker(worker_thread);
 
    data = "Example data";
    // send data to the worker thread
    {
        std::lock_guard<std::mutex> lk(m);
        ready = true;
        std::cout << "main() signals data ready for processing\n";
    }
    cv.notify_one();
 
    // wait for the worker
    {
        std::unique_lock<std::mutex> lk(m);
        cv.wait(lk, []{return processed;});
    }
    std::cout << "Back in main(), data = " << data << '\n';
 
    worker.join();
}

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

Профессионал не спрашивает отчего да почему и не критикует задачу, он просто ее делает.

нет. профессионал всегда исходит из "отчего и почему",
он именно что критикует задачу.
вырабатывая наименее трудозатратное по времени и деньгам решение.

"написать код не сложно. сложно понять какую на самом деле задачу нужно решить"
(ц) Макконелл. "Идеальный код"

это что за бред?
Грубость ни к чему

бред - неадекватное, не соответствующее (либо противоречиещее объективной реальности)
виденье положения вещей.

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

правильно ваша задача решается так:
Код:
for(auto key = waitKey(); !needExit(key); key = waitKey())
    print(key);

подождали, распечатали. ждем дальше


Название: Re: Igors, это ты? :)
Отправлено: Igors от Август 27, 2018, 13:09
но лично я не полезу на первый этаж через чердак,
При работе с пользователями чердак - еще не худший вариант  :)

если вам хочется глянуть, что там под капотом:
https://en.cppreference.com/w/cpp/thread/condition_variable


Код:
#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable>
 
std::mutex m;
std::condition_variable cv;
std::string data;
bool ready = false;
bool processed = false;
 
void worker_thread()
{
    // Wait until main() sends data
    std::unique_lock<std::mutex> lk(m);
    cv.wait(lk, []{return ready;});
 
    // after the wait, we own the lock.
    std::cout << "Worker thread is processing data\n";
    data += " after processing";
 
    // Send data back to main()
    processed = true;
    std::cout << "Worker thread signals data processing completed\n";
 
    // Manual unlocking is done before notifying, to avoid waking up
    // the waiting thread only to block again (see notify_one for details)
    lk.unlock();
    cv.notify_one();
}
 
int main()
{
    std::thread worker(worker_thread);
 
    data = "Example data";
    // send data to the worker thread
    {
        std::lock_guard<std::mutex> lk(m);
        ready = true;
        std::cout << "main() signals data ready for processing\n";
    }
    cv.notify_one();
 
    // wait for the worker
    {
        std::unique_lock<std::mutex> lk(m);
        cv.wait(lk, []{return processed;});
    }
    std::cout << "Back in main(), data = " << data << '\n';
 
    worker.join();
}

как видите - смысл принципиально не изменился.
По-моему этот пример так же неверен как и этот (http://www.prog.org.ru/index.php?topic=32189.msg237374#msg237374)

Допустим thread стартует с солидной задержкой и главная нитка успела выполнить  cv.notify_one() - но на мутексе еще никто не ждет. Или worker был вытеснен и не успел с cv.wait, Тогда побудка notify_one не имеет эффекта. А когда worker наконец получит управление и отдастся на мутекс - его будет некому будить.

Ну это как я знаю - а может в std это уже не так? Глянул доку

Цитировать
The effects of notify_one()/notify_all() and each of the three atomic parts of wait()/wait_for()/wait_until() (unlock+wait, wakeup, and lock) take place in a single total order that can be viewed as modification order of an atomic variable: the order is specific to this individual condition_variable. This makes it impossible for notify_one() to, for example, be delayed and unblock a thread that started waiting just after the call to notify_one() was made.

The notifying thread does not need to hold the lock on the same mutex as the one held by the waiting thread(s); in fact doing so is a pessimization, since the notified thread would immediately block again, waiting for the notifying thread to release the lock.
С собсно переводом - проблем нет, но смысл доходит плохо. Хреново сформулировано (язык ни при чем)

Или я где-то ошибаюсь?


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 27, 2018, 14:59
В код особо не вчитывался, но навскидку возможно тут надо два cv а с одним могут быть баги\дедлоки.


Название: Re: Igors, это ты? :)
Отправлено: Old от Август 27, 2018, 19:52
Допустим thread стартует с солидной задержкой и главная нитка успела выполнить  cv.notify_one() - но на мутексе еще никто не ждет. Или worker был вытеснен и не успел с cv.wait, Тогда побудка notify_one не имеет эффекта. А когда worker наконец получит управление и отдастся на мутекс - его будет некому будить.
Вы так и не разобрались как работают условные переменные? Мы же это несколько раз разбирали. :)

Ничего не будет из-за того, что главная нитка успеет выполнить cv.notify_one(), когда его никто не ждет. Если это произойдет, воркер даже не станет на wait, а сразу пойдет дальше.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 27, 2018, 21:59
А, там прекондишн проверяется через эти модные лямбды. Ну ок.


Название: Re: Igors, это ты? :)
Отправлено: ssoft от Август 28, 2018, 08:01
Мимо крокодил)), но добавлю свои пять копеек.
На мой взгляд совершенно не корректно так вот сравнивать два инструмента без акцента на особенностях их применения.
Любая задача решается с помощью того и другого инструмента, при этом самыми разными способами. В итоге обсуждение перейдет в русло - какой способ решения лучше.

В теме предлагается рассмотреть академическую задачу Producer/Consumer, имеющую большое прикладное значение. Количество способов реализации с учетом всяких частных случаев огромно.

Представленное решение на std использует глобальные переменные и жесткую взаимосвязь между Producer и Consumer. Для решения конкретной задачи подойдет, почему бы и нет. Но практически также можно всё написать и на Qt.

Реализация Producer/Consumer с помощью механизма signal/slot преследует цель - исключить зависимости между Producer и Consumer, для возможности их независимого повторного использования в любом сочетании.
Можно, конечно, отметить, что реализация механизма signal/slot в Qt кособокая - требует наследование, нарушает принципы инкапсуляции, использует генерацию кода, потоко зависимая и т.п.
Но порог вхождения в Qt достаточно низкий, функционал богатый, поэтому инструмент имеет большое распространение.

Думаю, что не стоит сравнивать "синее с кислым", а лучше изучить и то и другое, а потом уже делать обоснованный (все-равно субъективный) выбор того или иного инструмента при решении конкретных задач.


Название: Re: Igors, это ты? :)
Отправлено: Old от Август 28, 2018, 09:54
Реализация Producer/Consumer с помощью механизма signal/slot преследует цель - исключить зависимости между Producer и Consumer, для возможности их независимого повторного использования в любом сочетании.
Но это же наколенный пример. :)
Можно написать еще более независимую очередь, в которую можно добавлять любые задания и дожидаться их появления. А использовать ее можно везде: от передачи заданий между двумя потоками и до реализации пула потоков. Без всяких сигналов/слотов.


Название: Re: Igors, это ты? :)
Отправлено: ssoft от Август 28, 2018, 11:25
Но это же наколенный пример. :)
Можно написать еще более независимую очередь, в которую можно добавлять любые задания и дожидаться их появления. А использовать ее можно везде: от передачи заданий между двумя потоками и до реализации пула потоков. Без всяких сигналов/слотов.

Я про тоже самое.  ;D Сигнал/слот, очереди, подписки, последовательный/параллельный, пул потоков/один поток, синхронный/асинхронный, блокированный/неблокированный и т.п. Алгоритмов реализации много.
Чтобы адекватно сравнить два инструмента, их нужно рассматривать в одинаковом алгоритме. Иначе будет "битва подходов", где сами инструменты почти ни при чем.


Название: Re: Igors, это ты? :)
Отправлено: kuzulis от Август 28, 2018, 11:26
А накидайте - ка что-нить реально рабочее, а не наколенное.. Мож пригодится. :)


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 28, 2018, 15:50
Код:
#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable>
 
std::mutex m;
std::condition_variable cv;
std::string data;
bool ready = false;
bool processed = false;
 
void worker_thread()
{
    // Wait until main() sends data
    std::unique_lock<std::mutex> lk(m);
    cv.wait(lk, []{return ready;});
 
    // after the wait, we own the lock.
    std::cout << "Worker thread is processing data\n";
    data += " after processing";
 
    // Send data back to main()
    processed = true;
    std::cout << "Worker thread signals data processing completed\n";
 
    // Manual unlocking is done before notifying, to avoid waking up
    // the waiting thread only to block again (see notify_one for details)
    lk.unlock();
    cv.notify_one();
}
 
int main()
{
    std::thread worker(worker_thread);
 
    data = "Example data";
    // send data to the worker thread
    {
        std::lock_guard<std::mutex> lk(m);
        ready = true;
        std::cout << "main() signals data ready for processing\n";
    }
    cv.notify_one();
 
    // wait for the worker
    {
        std::unique_lock<std::mutex> lk(m);
        cv.wait(lk, []{return processed;});
    }
    std::cout << "Back in main(), data = " << data << '\n';
 
    worker.join();
}
По-моему этот пример так же неверен как и этот (http://www.prog.org.ru/index.php?topic=32189.msg237374#msg237374)

Допустим thread стартует с солидной задержкой и главная нитка успела выполнить  cv.notify_one() - но на мутексе еще никто не ждет. Или worker был вытеснен и не успел с cv.wait, Тогда побудка notify_one не имеет эффекта. А когда worker наконец получит управление и отдастся на мутекс - его будет некому будить.
Или я где-то ошибаюсь?

ошибаетесь. код безупречен.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 28, 2018, 17:24
Но это же наколенный пример. :)
Можно написать еще более независимую очередь, в которую можно добавлять любые задания и дожидаться их появления. А использовать ее можно везде: от передачи заданий между двумя потоками и до реализации пула потоков. Без всяких сигналов/слотов.

Очередь событий называется ;)


Название: Re: Igors, это ты? :)
Отправлено: Old от Август 28, 2018, 17:50
Очередь событий называется ;)
Ну это очень общее название. Я бы это скорее назвал очередью задач. :)


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 28, 2018, 18:16
Очередь событий называется ;)
Ну это очень общее название. Я бы это скорее назвал очередью задач. :)

всегда думал - что обычный тред-пул.


Название: Re: Igors, это ты? :)
Отправлено: Old от Август 28, 2018, 18:21
всегда думал - что обычный тред-пул.
В тред пуле, как раз, потоки из очереди задач задачи и достают. Очередь задач как бы часть пула потоков.


Название: Re: Igors, это ты? :)
Отправлено: Igors от Август 29, 2018, 09:07
А, там прекондишн проверяется через эти модные лямбды. Ну ок.
Да, тоже не заметил  :)

А накидайте - ка что-нить реально рабочее, а не наколенное.. Мож пригодится. :)
Схема одна и та же, другой нет, ее надо просто зазубрить

В теме предлагается рассмотреть академическую задачу Producer/Consumer, имеющую большое прикладное значение. Количество способов реализации с учетом всяких частных случаев огромно.

Представленное решение на std использует глобальные переменные и жесткую взаимосвязь между Producer и Consumer. Для решения конкретной задачи подойдет, почему бы и нет. Но практически также можно всё написать и на Qt.
Реализация std (вернее выбранный примитив) пожалуй самая сложная/трудная. Попробуйте напр сделать то же но в цикле - и уже придется чесать репу. В то же время слот/сигналом не составляет труда, а если хочется на примитивах - есть прекрасный (Q)Semaphore

Можно, конечно, отметить, что реализация механизма signal/slot в Qt кособокая - требует наследование, нарушает принципы инкапсуляции, использует генерацию кода, потоко зависимая и т.п.
Что это за мода появилась хаять Qt, причем "в самых общих чертах"?  :) Даже если согласиться с "кособокостью" - это невысокая цена за удобство использования. Даже знать базовые примитивы синхронизации необязательно, есть средства удобнее/приятнее



Название: Re: Igors, это ты? :)
Отправлено: Old от Август 29, 2018, 09:57
Реализация std (вернее выбранный примитив) пожалуй самая сложная/трудная. Попробуйте напр сделать то же но в цикле - и уже придется чесать репу.
Ну это вам придется чесать репу, а человеку знающему как работают условные переменные - не придется. Потому, что эта конструкция для циклов как раз и приспособлена. :)


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 29, 2018, 13:23
всегда думал - что обычный тред-пул.
В тред пуле, как раз, потоки из очереди задач задачи и достают. Очередь задач как бы часть пула потоков.

дык. о том и речь.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 29, 2018, 14:40
Ну это вам придется чесать репу, а человеку знающему как работают условные переменные - не придется. Потому, что эта конструкция для циклов как раз и приспособлена. :)

Вот не надо тут "ляля" про условные переменные. То, что в стд засунули лямбду как проверку предусловия, конечно, удобно и избавляет от ошибок, но лямбды появились только в 11х плюсах, а для "человека, знающего, как работают условные перменные" горааааздо дольше примером были QWaitCondition или pthread_cond_wait где никаких лямбд не было и прекондишн надо было проверять руками. На что мы с Igors и напоролись - не увидели малюсенький вызов лямбды.

На самом деле бесят апологеты стд которым НАКОНЕЦ-то дали какое-то АПИ которым они везде тыкают как будто это омагад какое изобретение.
Ну да, std::vector лучше QVector из-за мув-семантики, которой не было когда писался QVector, а поменять теперь QVector нельзя из-за совместимости (как и сделать в std::vector signed size_t для индекса или сделать struct {key, value} вместо богомерзкой пары в std::map). Я же не троллю вас тем что у вас для строки надо писать std::string::npos вместо банальной -1.
Стд тоже далеко не идеально, взять те же футуры или строки или регэкспы или... Но чертова совместимость мешает это всё исправить.


Название: Re: Igors, это ты? :)
Отправлено: Old от Август 29, 2018, 15:33
Авварон, а я именно про простые условные переменные и говорю. :)
Лямбды это просто синтаксический, я до сих пор этот цикл пишу руками и это не мешает мне использовать условные переменные в циклах. :)


Название: Re: Igors, это ты? :)
Отправлено: Igors от Август 29, 2018, 15:40
То, что в стд засунули лямбду как проверку предусловия, конечно, удобно и избавляет от ошибок,
Не могу с Вами согласиться.
Цитировать
cv.wait(lk, []{return ready;});
Цитировать
while (!ready)
  cv.wait(lk);
Да, первый вариант экономит строку, но ценой "запоминания". И вот за что я не люблю std - он весь прямо-таки засыпан таким калом. Немногие нужные полезные вещи просто тонут в таких "экономиях 1-2 строк" на которые и уходит > 90% энергии изучающего. Впрочем есть люди которые стремятся запомнить как можно больше, им это в кайф.

Однако вернемся к теме. Задача что я предложил - да, относится к категории производитель-потребитель, но есть особенность - операции должны выполняться строго последовательно, сначала одна нитка читает, потом вторая пишет. Очередь и/или событийный цикл для этого, строго говоря, избыточны. Наиболее естественной мне представляется реализция на семафорах
Код
C++ (Qt)
#include <QtWidgets>
 
QString data;
QSemaphore semWork(0), semMain(1);
 
class MyThread : public QThread {
void run( void )
{
while (true) {
semWork.acquire();
if (!data.size())
break;
data += " proccesed";
qDebug() << data;
semMain.release();
}
}
};
 
int main()
{
MyThread worker;
worker.start();
 
const int numTest = 5;
for (int i = 0; i < numTest + 1; ++i) {
semMain.acquire();
if (i == numTest)
data.clear();
else
data = "data " + QString::number(i + 1);
semWork.release();
}
   worker.wait();
}
 
Никаких заморочек, знай себе открывай-закрывай семафоры, все совершенно естественно. Но увы, зная собеседников, уверен что это будет охаяно, ведь в великом std такого нет...


Название: Re: Igors, это ты? :)
Отправлено: Old от Август 29, 2018, 15:54
Класс. :)
Очередное одноразовое решение, которое уже завтра пойдет в корзину... :)
Завтра мы поняли, что нам нужно маштабировать решение и у нас теперь 10 производителей и 20 потребителей. Все перепишем? :)


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 29, 2018, 16:06
Завтра мы поняли, что нам нужно маштабировать решение и у нас теперь 10 производителей и 20 потребителей. Все перепишем? :)

Или не нужно будет масштабировать:)


Название: Re: Igors, это ты? :)
Отправлено: Old от Август 29, 2018, 16:11
Или не нужно будет масштабировать:)
Но тут от подхода зависит. Можно один раз написать нормально и через какое то время просто изменить значения пары констант, а можно написать одноразово и надеятся что поток кто то перепишет нормально. :)


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 29, 2018, 16:14
Или не нужно будет масштабировать:)
Но тут от подхода зависит. Можно один раз написать нормально и через какое то время просто изменить значения пары констант, а можно написать одноразово и надеятся что поток кто то перепишет нормально. :)

#define нормально. С моей колокольни кажется, что вы предлагаете заниматься оверинженирингом ради premature optimisation.
Далеко не факт что именно это место будет узким местом.
Но да, какая-нибудь универсальная очередь может и решит задачу (эвентлуп с блокирующим ожиданием, наверное, решит). Но это если кто-то добрый написал эту очередь; писать её только под эту задачу с мыслью "когда-нибудь мы ее замасштабируем и переюзаем" - ну такое, похоже у вас оч много свободного времени:)


Название: Re: Igors, это ты? :)
Отправлено: Old от Август 29, 2018, 16:19
Авварон, эта очередь пишется за 10 минут (это несколько десятков строк кода). Я сейчас с телефона, поищите тему про самодельные очереди, там это все обсуждалось. И было еще несколько тем, в одной я такую очередь выкладывал полностью. Не найдете я выложу универсальную.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 29, 2018, 16:27
Авварон, эта очередь пишется за 10 минут (это несколько десятков строк кода). Я сейчас с телефона, поищите тему про самодельные очереди, там это все обсуждалось. И было еще несколько тем, в одной я такую очередь выкладывал полностью. Не найдете я выложу универсальную.

Ну, очевидно, что очередь в десяток строк кода не имеет всей полноты функционала, который можно придумать:)
Как например то, что в случае очереди событий одно событие может обрабатываться по разному разными объектами, очередь задач этого не умеет.
Чейнить задачи - тоже весьма полезная фича (чего, например, не умеют QFuture/std::future, а дустовые, вроде, умеют).


Название: Re: Igors, это ты? :)
Отправлено: Old от Август 29, 2018, 16:52
А какой функционал там нужен, если нам нужно положить некий функциональный объект в очередь + разбудить спяших и выташить этот объект из очереди? А дальше запускай его - как он что будет обрабатывать зависит исключительно от этого функционального объекта.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 29, 2018, 16:52
Никаких заморочек, знай себе открывай-закрывай семафоры, все совершенно естественно. Но увы, зная собеседников, уверен что это будет охаяно, ведь в великом std такого нет...

std::mutex? не, не слышал.
если заменить им ваш семафор, будет ровно тоже самое.






Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 29, 2018, 16:56
в случае очереди событий одно событие может обрабатываться по разному разными объектами, очередь задач этого не умеет.

тут какой то фейл.

"очередь событий" это и есть "очередь задач".
задача сама знает как себя исполнять.

"события" которые по разному обрабатывают разные "объекты" - не нужны.




Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 29, 2018, 18:21
"события" которые по разному обрабатывают разные "объекты" - не нужны.

Скажите это любой гуи-библиотеке или игровому движку:)


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 29, 2018, 18:41
"события" которые по разному обрабатывают разные "объекты" - не нужны.

Скажите это любой гуи-библиотеке или игровому движку:)

сказал своим.
они ответили: мухи отдельно, котлеты отдельно.
событийно-управляемая модель ортогональна тред-пулу.


Название: Re: Igors, это ты? :)
Отправлено: Igors от Август 29, 2018, 19:12
сказал своим.
они ответили: мухи отдельно, котлеты отдельно.
событийно-управляемая модель ортогональна тред-пулу.
Какой мудрый ответ! И главное - оригинальный и остроумный :) Про мухи и котлеты никто еще не додумался! Но вернемся к (сопливой) задачке
Цитировать
- сделать 2 нитки, одна принимает символ с клавы, другая печатает
Задача поставлена конкретно - 2 нитки. Чего базарить? Сказано для 2 - делайте для 2. Сказано для N - делайте для N. Разумеется это уже до задача, и заказчик обязан сформулировать внятные требования - а кто кого тогда должен печатать. А Вы обязаны снять с него за это еще бабло. Не надо лезть с решениями "на все случаи жизни" - можно (мягко) предложить -и быстренько заткнуться если нет понимания. Тише едешь - дальше будешь

Если же чисто технически - то схема семафора вполне хороша и здесь. Небольшим ее минусом обычно является то что может потребоваться еще блокировка для доступа к данным - ну это не смертельно


Название: Re: Igors, это ты? :)
Отправлено: Racheengel от Август 29, 2018, 19:17
Цитировать
cv.wait(lk, []{return ready;});

Write-only code detected.


Название: Re: Igors, это ты? :)
Отправлено: Old от Август 29, 2018, 19:24
и заказчик обязан сформулировать внятные требования - а кто кого тогда должен печатать.
Как вы ловко в воздухе переобуваетесь. :)
Вы же сами в большинстве своих тем рассказываете, что заказчик ничего не знает и сформулировать ничего не может. Нужно самим дорабатывать. :)
Не всегда заказчик с разработчиком могут оценить нагрузки. На примере интернет проектов, заказчик планировал что посещаемость сайта будет 100 человек в день, а через месяц она выросла до 10000 человек в день. Что ему делать, закрывать проект и приглашать нормальных программистов? :)


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 29, 2018, 22:28
сказал своим.
они ответили: мухи отдельно, котлеты отдельно.
событийно-управляемая модель ортогональна тред-пулу.


Не совсем, есть ряд задач, которые решаются пулом и воркерами, подписанными на бродкаст сообщений. К примеру, торговая площадка - у вас происходит сделка и надо её обработать; в каком потоке это делать - всё равно (тредпул), а вот как её обрабатывать - нет (один или несколько воркеров).


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 30, 2018, 12:00
сказал своим.
они ответили: мухи отдельно, котлеты отдельно.
событийно-управляемая модель ортогональна тред-пулу.
Какой мудрый ответ! И главное - оригинальный и остроумный :) Про мухи и котлеты никто еще не додумался! Но вернемся к (сопливой) задачке
Цитировать
- сделать 2 нитки, одна принимает символ с клавы, другая печатает
Задача поставлена конкретно - 2 нитки. Чего базарить? Сказано для 2 - делайте для 2. Сказано для N - делайте для N. Разумеется это уже до задача, и заказчик обязан сформулировать внятные требования - а кто кого тогда должен печатать. А Вы обязаны снять с него за это еще бабло. Не надо лезть с решениями "на все случаи жизни" - можно (мягко) предложить -и быстренько заткнуться если нет понимания. Тише едешь - дальше будешь

Если же чисто технически - то схема семафора вполне хороша и здесь. Небольшим ее минусом обычно является то что может потребоваться еще блокировка для доступа к данным - ну это не смертельно

во-первых, заказчику нужен продукт. он хочет "сделай красиво".
и ему глубоко фиолетово, что там под капотом.
а вот что там под капотом - решает исполнитель.
и если он решил заюзать параллельность там,
где необходима последовательность,
ну может просто не выспался?

а во-вторых: мухи отдельно, котлеты отдельно.
событийная модель ортогональна тред-пулу.

ну это не смертельно
вот так и рождаеццо говнокод.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 30, 2018, 12:05
а во-вторых: мухи отдельно, котлеты отдельно.
событийная модель ортогональна тред-пулу.

Также, как и исполнение задач:) Тред пул - это просто пул тредов, не более, не менее. А хотите вы в нем выполнять таски или крутить эвентлупы - это уже другой вопрос. Вы же почему-то различаете эвентлупы и пул но не различаете очередь задач и пул.


Название: Re: Igors, это ты? :)
Отправлено: Racheengel от Август 30, 2018, 14:49
имхо, сравнивать тред-пул с моделью событий, это все равно, что сравнивать газонокосилку с бананом :)


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 30, 2018, 14:50
имхо, сравнивать тред-пул с моделью событий, это все равно, что сравнивать газонокосилку с бананом :)


Ну изначально претензия была что кутред слишком СЛОЖНА он эвентлуп крутит


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 30, 2018, 16:34
а во-вторых: мухи отдельно, котлеты отдельно.
событийная модель ортогональна тред-пулу.

Также, как и исполнение задач:) Тред пул - это просто пул тредов, не более, не менее.
А хотите вы в нем выполнять таски или крутить эвентлупы - это уже другой вопрос.
Вы же почему-то различаете эвентлупы и пул но не различаете очередь задач и пул.


нет. тред-пул - это не просто пул тредов.
потому что просто пул тредов никому не нужен.
точно так же, как никому не нужны просто треды.

тред-пул нужен именно для того, что бы юзать заранее созданные треды,
для выполнения задач, по мере их поступления.
внезапно, да?

и в тред-пуле нет никаких эвент-лупов,
потому что эвент-лупы для работы ему не нужны.

и я различаю очередь задач (банальный стек из std::function),
и пул (механизм управления временем сна и жизни своих тредов)


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 30, 2018, 16:37
имхо, сравнивать тред-пул с моделью событий, это все равно, что сравнивать газонокосилку с бананом :)


Ну изначально претензия была что кутред слишком СЛОЖНА он эвентлуп крутит

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


Название: Re: Igors, это ты? :)
Отправлено: Racheengel от Август 30, 2018, 17:42
Ну изначально претензия была что кутред слишком СЛОЖНА он эвентлуп крутит

Кутред тоже говно, именно из-за этого эвентлупа.
Это поведение абсолютно неочевидно и приводит к кривому коду и багам.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 30, 2018, 22:24
не было такой притензии.
глубоко фиолетова, насколько сложен кутред (его устройство никого не волнует)
важно насколько удобно его использовать.
а он - редкосное г, ни разу не удобный.
и мало того, что он вынуждает писать тонны дополнительного кода:
создавать какие то классы, наследоваться, тополя.
так ещё он завязан на кютешную систему сообщений.
в результате имеет тормоза, и можно поймать нежданчиков в сплаве с std.


Я на предыдущей странице распинался про обратную совместимость.
Уж извините, на момен написания QThread не было ни лябд, ни сраной std::function,  а мелкософтный компилятор не умел даже в шаблоные мембер функции.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 30, 2018, 22:27
Ну изначально претензия была что кутред слишком СЛОЖНА он эвентлуп крутит

Кутред тоже говно, именно из-за этого эвентлупа.
Это поведение абсолютно неочевидно и приводит к кривому коду и багам.


Мммм, как ведет себя класс написано в документации.
Если кутред сабкласснуть, но никакого эвентлупа не будет.
Как он может мешать если его нет?
А если вы не сабклассили кутред, то что вы ожидали?


Название: Re: Igors, это ты? :)
Отправлено: Igors от Август 31, 2018, 06:51
не было такой притензии.
глубоко фиолетова, насколько сложен кутред (его устройство никого не волнует)
важно насколько удобно его использовать.
а он - редкосное г, ни разу не удобный.
и мало того, что он вынуждает писать тонны дополнительного кода:
создавать какие то классы, наследоваться, тополя.
так ещё он завязан на кютешную систему сообщений.
в результате имеет тормоза, и можно поймать нежданчиков в сплаве с std.
Мое мнение совершенно противоположное. QThread - прекрасный механизм. Единственное что можно поставить ему в упрек - он разлагает пользователя Qt, настолько просто и удобно все делать на QThread что и знать/понимать особо ничего не надо. Впрочем есть и QThreadPool и QtConcurrent

Низкоуровневые примитивы синхронизации используются крайне редко. Практически всегда нужно обеспечить хотя бы abort (cancel) и stop (pause), попробуйте добавить этот ф-ционал в любой из примеров std - это окажется совсем не так просто как кажется (та просто  флажок - и усе).

Основная заслуга std - в ее названии :) Т.е. на нее всегда можно рассчитывать, любой компилятор ее обязан поддерживать. Но пупом земли она никогда не была и не будет.


Название: Re: Igors, это ты? :)
Отправлено: Old от Август 31, 2018, 07:32
Низкоуровневые примитивы синхронизации используются крайне редко.
Ну это у вас. Весь остальной мир по прежнему их использует. :)

Практически всегда нужно обеспечить хотя бы abort (cancel) и stop (pause), попробуйте добавить этот ф-ционал в любой из примеров std - это окажется совсем не так просто как кажется (та просто  флажок - и усе).
Вы не знаете как остановить выполнение потока? :)
А пауза, не смотря на свою полную бесполезность (ну может в GUI программах можно придумать хоть какое-то применение), легко делается на тех же условных переменных.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 31, 2018, 12:33
Я на предыдущей странице распинался про обратную совместимость.
Уж извините, на момен написания QThread не было ни лябд, ни сраной std::function,  а мелкософтный компилятор не умел даже в шаблоные мембер функции.

с тех много воды утекло. плюсы шагнули далеко в будущие.
а кутред как был г. так им и остался.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 31, 2018, 12:44
настолько просто и удобно все делать на QThread что и знать/понимать особо ничего не надо.
вы находите удобным писать каждый раз на каждый чих очередной класс с наследованием?
писать тонны кода там, где можно было бы ничего не писать?

кстати, что будет с кутешным сокетом,
если запихать его в обычный std::tread,
и попробовать читать/писать ?

внезапно окажется, что знать/понимать нужно,
что бы не поиметь нежданчиков.

Практически всегда нужно обеспечить хотя бы abort (cancel) и stop (pause), попробуйте добавить этот ф-ционал в любой из примеров std - это окажется совсем не так просто как кажется (та просто  флажок - и усе).

выше, пример с std::conditional собственно иллюстрирует функциональность паузы.
что такое cancel - сильно зависит от конкретной задачи.
в общем случае поджигаем флажок и пробуждаем тред.
тред просыпается, смотрит: флажок горит, значит нужно сворачивать лавочку.
флажок не горит - делаем дело, и спим дальше.

Основная заслуга std - в ее названии :) Т.е. на нее всегда можно рассчитывать, любой компилятор ее обязан поддерживать. Но пупом земли она никогда не была и не будет.

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


Название: Re: Igors, это ты? :)
Отправлено: Igors от Август 31, 2018, 13:34
вы находите удобным писать каждый раз на каждый чих очередной класс с наследованием?
писать тонны кода там, где можно было бы ничего не писать?
Какие тонны? Где?  ??? Давайте не скатываться в пустые пререкания, а возьмем простую задачку и сравним.  Ну вот хотя бы банальщина - копирование файла в фоне (типичный "вынос в поток"). С минимальным стервисом - показ прогресса в главной нитке (пусть в консоли) и возможность отмены. Или предложите свою, я не против.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 31, 2018, 18:07
Я на предыдущей странице распинался про обратную совместимость.
Уж извините, на момен написания QThread не было ни лябд, ни сраной std::function,  а мелкософтный компилятор не умел даже в шаблоные мембер функции.

с тех много воды утекло. плюсы шагнули далеко в будущие.
а кутред как был г. так им и остался.

Вы предлагает сломать весь существующий код или чо?
Ну давайте заодно в std::vector на signed перейдем, а то говно какое-то, приходится size_t богомерзкий использовать.
Или std::string наконец уже допилим до поддержки utf-8 и различных кодировок.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 31, 2018, 18:09
она уже - пуп земли. и всегда им была.
именно потому, что на неё всегда можно рассчитывать,
и любой моральный компилятор обязан её поддерживать.


Ахаахах, то-то в последнем XCode забыли положить хедера из с++14))))
Я уж молчу про мелкомягких


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 31, 2018, 18:12
вы находите удобным писать каждый раз на каждый чих очередной класс с наследованием?
писать тонны кода там, где можно было бы ничего не писать?

Но кутред не нужно наследовать уже версии с 4.5.
Нужно запустить функцию - юзаете std::thread.
Нужен эвентлуп - юзаете QThread.
Ничо что они решают несколько разные задачи теперь? Ну да, до сих пор есть виртуальный run который не выкинешь потому что сломается куча старого кода. Но вас кто-то заставляет им пользоваться в новом коде?


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 31, 2018, 19:27
Вы предлагает сломать весь существующий код или чо?
я ничего не предлагаю.
лишь сожалению, что в работе с кутей приходиццо мириццо с ущербностью её подхода.

не могут сделать по человечечьи - что ж теперь...

Ну давайте заодно в std::vector на signed перейдем, а то говно какое-то, приходится size_t богомерзкий использовать.
не давайте. богомерзкие хотят использовать знаковый для хранения без знаковых величин.
богомерзкие - омерзительный народ. противоречат здравому смыслу.
к счастью, дизайнеры крестов моральные люди.
и подобной ереси не допустили.

Или std::string наконец уже допилим до поддержки utf-8 и различных кодировок.

интересно, как вообще может быть связанно знаковость/беззнаковость размера вектора и поддержка кодировок строки?
вы там случаем ничего такого не употребляете?





Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 31, 2018, 19:34
Нужно запустить функцию - юзаете std::thread.
Нужен эвентлуп - юзаете QThread.
запустил функцию. просрался QSocket.
и нафиг я должен думать о каких то там эвентлупах,
когда мне тупо хотелось прочитать пару байт в отдельном треде?

Ничо что они решают несколько разные задачи теперь?

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

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




Название: Re: Igors, это ты? :)
Отправлено: _Bers от Август 31, 2018, 19:54
вы находите удобным писать каждый раз на каждый чих очередной класс с наследованием?
писать тонны кода там, где можно было бы ничего не писать?
Какие тонны? Где?  ???

вот здесь:
каждый раз на каждый чих очередной класс с наследованием

тут вроде по-русски написано, не?

вы там выше в этой самой теме приводили пример,
где переопределяли метод run.
и вот нафига это нужно?

Давайте не скатываться в пустые пререкания, а возьмем простую задачку и сравним.  Ну вот хотя бы банальщина - копирование файла в фоне (типичный "вынос в поток"). С минимальным стервисом - показ прогресса в главной нитке (пусть в консоли) и возможность отмены. Или предложите свою, я не против.

Код:
// бизнес-логика дергает этот метод для копирования в фоне
template<class s>
void samle::copy(const s& from, const s& to)
{
    // само копирование делаем в фоне
    const auto background_copying = [this]()
    {
        // коллбек вызывается для уведомления текущего прогресса
        // что бы внешняя сторона могла его как то нарисовать
        // если бизнес-логика захочет прекратить копирование
        // данный коллбек вернёт false
        // если же все хорошо, и нужно копировать дальше,
        // тогда возвращаем true
        const auto progress = [this](const size_t bytes)
        { 
            // рисуем текущее состояние прогресса
            std::cout << calculateProgressPercentage(bytes, total) << "%\n";

            // false - отменить копирование
            return !this->wasStopped();
        }
        tools::copy(from, to, progress);
    };

    // задача исполняется в отдельной ниточке
    std::thread(background_copying ).detach();
};





Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 31, 2018, 20:55
Больше загадочных tools::


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Август 31, 2018, 22:35
А, ну и да, у вас не выполнено требоание "показ прогресса в главной нитке".
Можно конечно долго спорить что это никому не нужно но на практике таки когда-то да и нужно.


Название: Re: Igors, это ты? :)
Отправлено: Igors от Сентябрь 01, 2018, 15:28
Код:
// бизнес-логика дергает этот метод для копирования в фоне
Ну по такому огрызку понять мудрено. Вот мой компилябельный пример (аттач). Файлы копируются в тот же фолдер, к имени добавляется " test_copy".  Добавлять файлы (кнопка "Add Files") можно в любой момент, по одному и пачками. Отмена одна на всех. Файл .pro писала MSVC, поэтому не уверен 100% что он рабочий.

вы там выше в этой самой теме приводили пример,
где переопределяли метод run.
и вот нафига это нужно?
Чтобы работать "по старинке" с примитивами синхронизации - нужда в этом возникает весьма редко. Обычно посылать/принимать сигналы из одной нитки в другой прекрасно устраивает, сидеть на событийном цикле очень удобно.

Вернемся к теме. Вы утверждаете что std "тупо лучше", в Qt, мол, "многословно", а слот/сигналы вообще "г" (ну "кидаться говном все мастера" как говорил еще незабвенный Пастор). Будьте добры привести рабочий код подтверждающий Вашу точку зрения.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Сентябрь 03, 2018, 11:27
А, ну и да, у вас не выполнено требоание "показ прогресса в главной нитке".
Можно конечно долго спорить что это никому не нужно но на практике таки когда-то да и нужно.

"главная нитка" - это к тем, кто в многопоточку не умеет.





Название: Re: Igors, это ты? :)
Отправлено: _Bers от Сентябрь 03, 2018, 11:36
Больше загадочных tools::

под капотом будет что-то вроде:

Код:
void *thread_proc(void *arg)
{
    // Error checking omitted for expository purposes
    char buffer[BUFSIZE];
    int in = open("source_file", O_RDONLY);
    int out = open("destination_file", O_WRONLY | O_CREAT | O_TRUNC);

    // Get the input file size
    struct stat st;
    fstat(in, &st);

    progress = 0;
    max_progress = st.st_size;

    ssize_t bytes_read;
    while((bytes_read = read(in, buffer, BUFSIZE)) > 0)
    {
        write(out, buffer, BUFSIZE
        progress += bytes_read;
    }

    // copy is done, or an error occurred
    close(in);
    close(out);

    return 0;
}

void start_file_copy()
{
    pthread_t t;
    pthread_create(&t, NULL, &thread_proc, 0);
}


Название: Re: Igors, это ты? :)
Отправлено: kuzulis от Сентябрь 03, 2018, 12:43
> и нафиг я должен думать о каких то там эвентлупах,

Не, ну так нельзя. Qt - это фреймворк со своими правилами.

> запустил функцию. просрался QSocket.

Где? Просто надо юзать блокирующие waitForXXX(), т.к. в не-Qt-шных тредах нет евент лупа. Иначе - ССЗБ, читай доку.

PS: Можно все перевернуть с ног на голову, заявив, что, мол беру boost asio, и нифига не работает, т.к. там тоже есть луп/сервис (и его надо запускать),
а я не хочу его запускать, кочу юзать чтобы из QThread оно само работало. Мол, boost гавно, не работает в Qt.



Название: Re: Igors, это ты? :)
Отправлено: kuzulis от Сентябрь 03, 2018, 12:47
> "главная нитка" - это к тем, кто в многопоточку не умеет.

Многопоточка для тех, кто асинхронный ввод/вывод не осилил. Пачкование тредов это не есть хороший дизайн, это костыли. Так и тредов не хватит.  :)


Название: Re: Igors, это ты? :)
Отправлено: Old от Сентябрь 03, 2018, 13:13
Многопоточка для тех, кто асинхронный ввод/вывод не осилил.
Коллеги, давайте не смешивать теплое с мягким. Многопоточность и асинхронность решают совершенно разные задачи и чудесно сосуществуют вместе.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Сентябрь 03, 2018, 17:05
"главная нитка" - это к тем, кто в многопоточку не умеет.

Ну возьмите любую другую нитку - часто возникает задача передать управление в _определенный_ тред (обычно тот, который запускал задачу) без явного вызова wait().


Название: Re: Igors, это ты? :)
Отправлено: Igors от Сентябрь 03, 2018, 17:52
"главная нитка" - это к тем, кто в многопоточку не умеет.
А что, Вы умеете обновлять UI из любой нитки (а не только главной)? Расскажите как, я так не умею  :)

под капотом будет что-то вроде:
Что/где и под каким капотом - никто не спрашивал. Речь идет о простейшем "выносе длинной операции в поток"(чтоб UI не замерзал) который здесь делают все кому не лень. Потому что - да, на Qt это легко и приятно. А вот как на std -хз. Ни о каком тамошнем механизме обмена инфой между нитками я не знаю. Мы увидим std реализацию этой простейшей задачки - или только понты типа
лишь сожалению, что в работе с кутей приходиццо мириццо с ущербностью её подхода.

не могут сделать по человечечьи - что ж теперь...
У меня давно уже стойкое подозрение - человек "ниасилил" букварь. Развейте пожалуйста, очень не хочется разочаровываться в человеке  :'(


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Сентябрь 03, 2018, 18:43
А что, Вы умеете обновлять UI из любой нитки (а не только главной)? Расскажите как, я так не умею  :)

Ну это просто Qt говно - вон, винапи же умеет.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Сентябрь 04, 2018, 03:18
т.к. в не-Qt-шных тредах нет евент лупа. Иначе - ССЗБ, читай доку.
бинго!

закономерный вопрос:
а нафига треду нужен ещё какой то костыль в придачу
в виде ниразу не очевидного эвент лупа?

PS: Можно все перевернуть с ног на голову, заявив, что, мол беру boost asio, и нифига не работает, т.к. там тоже есть луп/сервис (и его надо запускать),
а я не хочу его запускать, кочу юзать чтобы из QThread оно само работало. Мол, boost гавно, не работает в Qt.
дык, с асей то как раз таки проблем нет.
всмысле, она вполне себе дружит с тредами вообще.
наверное, это потому, что луп/сервис есть у аси, а не у тредов.
в тредах - чистая бизнес-логика.







Название: Re: Igors, это ты? :)
Отправлено: _Bers от Сентябрь 04, 2018, 03:21
> "главная нитка" - это к тем, кто в многопоточку не умеет.
Многопоточка для тех, кто асинхронный ввод/вывод не осилил.
а асинхронный ввод/вывод конечно же реализуется не на многопоточке, да?
Пачкование тредов это не есть хороший дизайн, это костыли. Так и тредов не хватит.  :)

четкие поцаны юзают тред-пул.
и о боже! так реализуется асинхронка.




Название: Re: Igors, это ты? :)
Отправлено: _Bers от Сентябрь 04, 2018, 03:30
"главная нитка" - это к тем, кто в многопоточку не умеет.

Ну возьмите любую другую нитку - часто возникает задача передать управление в _определенный_ тред (обычно тот, который запускал задачу) без явного вызова wait().

лямбда-геттер жеж.
и пускай дергает, когда ему нужно из своего треда.
какие проблемы?

Код:
const auto getData = [](auto& src) { ... };
sample.setData(getData);

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



Название: Re: Igors, это ты? :)
Отправлено: _Bers от Сентябрь 04, 2018, 03:53
А что, Вы умеете обновлять UI из любой нитки (а не только главной)? Расскажите как, я так не умею  :)
а зачем вообще об этом думать? вот есть какая нибудь библиотека. CEGUI например.
я тупо запускаю инстанс прямо в main (или в любом треде, где захочу). и забываю про него.
когда кто нибудь жмакнет закрытие окна, ну или просто пришлет событие о том,
что нужно сворачивать лавочку, я тупо дергаю этому инстансу "сворачивайся".
и все. он сам отлипнет, и его тред завершится.
а как он там у себя внутри свои потроха обновляет - это уже его личные проблемы.

сами виджеты я могу создавать/двигать/разрушать в любом треде, где мне удобно.
и мне не нужно вообще думать о том, как и когда ядро обновит эти изменения.
проблемы CEGUI его пользователей не колышат.

Речь идет о простейшем "выносе длинной операции в поток"(чтоб UI не замерзал) который здесь делают все кому не лень. Потому что - да, на Qt это легко и приятно. А вот как на std -хз.
делать гуй легко и приятно на любом высокоразвитом гуи-фреймворке.
а вот std к гую вообще не имеет никакого отношения.

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

Мы увидим std реализацию этой простейшей задачки - или только понты типа
я уже выше привел примеры. для иллюстрации вполне сойдёт.
если в танке - ничем не могу помочь.
пилить с нуля gui на голых плюсах, разумеется я не буду.
мог бы наколбасить на голом MFC, например. но мне лень.
и о боже! MFC - это тоже оказывается своя экосистема.

У меня давно уже стойкое подозрение - человек "ниасилил" букварь. Развейте пожалуйста, очень не хочется разочаровываться в человеке  :'(
так это же вы в вашем примере выше зачем то колбасили наследование, с переопределением метода run.
наверное, зачем то это все таки вам было нужно сделать.

мой тезис остаётся в силе:
колбасить ещё один класс, только для того,
что бы тред запустить - напрасное раздутие кода,
неудобный, убогий дизайн.




Название: Re: Igors, это ты? :)
Отправлено: Old от Сентябрь 04, 2018, 06:44
а асинхронный ввод/вывод конечно же реализуется не на многопоточке, да?
Нет. Асинхронка может работать и в одном потоке.


Название: Re: Igors, это ты? :)
Отправлено: Igors от Сентябрь 04, 2018, 14:08
я уже выше привел примеры. для иллюстрации вполне сойдёт.
если в танке - ничем не могу помочь.
пилить с нуля gui на голых плюсах, разумеется я не буду.
А делать какое-то UI никто и не просил. Можете взять мое, или просто печатать в консоль. Если создается нитка, то она должна хотя бы минимально общаться с другими. Запуск "на деревню дедушке" никому не нужен, придется так или иначе "мониторить" запущенную задачу. В Qt для этого есть удобный механизм, а в std - ни кола, ни двора.

мой тезис остаётся в силе:
колбасить ещё один класс, только для того,
что бы тред запустить - напрасное раздутие кода,
неудобный, убогий дизайн.
Да какой там "тезис" - так, мелочная претензия. Уже говорилось что run перекрывается только если хочется самому побаловаться с синхронизацией - пожалуйста, можно и так. Но делать это всякий раз - да кто Вам такое сказал? См мой пример в аттаче - никаких наследований от QThread там нет, нитке можно кинуть любое кол-во задач не прилагая никаких усилий. Можно просто запустить нитку без задач - и это ничем не грозит, и проц она не жрет. Можно удобно подсесть на сигналы завершения нитки и/или задачи. Вкусные плюшки. Наоборот, std-шный стиль запуска выглядит "каменным веком" - обязует заботиться обо всем самому. Ну спасибо хоть это дали, раньше вообще ничего не было.

В общем, в очередной раз убеждаюсь - изучение std отрицательно влияет на изучающего  :)


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Сентябрь 04, 2018, 17:05
а асинхронный ввод/вывод конечно же реализуется не на многопоточке, да?

Конечно нет, она реализуется на эвентлупе (select/poll/epoll/kqueue)


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Сентябрь 04, 2018, 17:06
лямбда-геттер жеж.
и пускай дергает, когда ему нужно из своего треда.
какие проблемы?


И как оно узнает, когда надо дергать? Поллинг сделать? Ну-ну.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Сентябрь 04, 2018, 17:13
мой тезис остаётся в силе:
колбасить ещё один класс, только для того,
что бы тред запустить - напрасное раздутие кода,
неудобный, убогий дизайн.

Мне кажется или вы читать не умеете? Третий раз на пишу - на момент написания QThread другого способа НЕ БЫЛО, а ваш хваленый стд ни тредов не имел, ни анордеред мапы.
Аналог std::function написать было нельзя потому что компиляторы не умели в шаблоны нормально.

Сейчас QThread нужен ТОЛЬКО для того чтобы крутить эвентлуп, НЕ НУЖНО перегружать run. Используйте для этого std::thread.
У них сейчас РАЗНЫЕ задачи.

Метод run есть ТОЛЬКО ДЛЯ СОВМЕСТИМОСТИ чтобы не сломать кучу кода.

Я как со стенкой разговариваю, ей-богу.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Сентябрь 04, 2018, 17:19
Кстати _Bers спалился что не опускался на уровень еполла и не писал сервак решающий "проблему 10к" ;)


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Сентябрь 04, 2018, 18:42
а асинхронный ввод/вывод конечно же реализуется не на многопоточке, да?
Нет. Асинхронка может работать и в одном потоке.

вы осознаете, что противоречите здравому смыслу?


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Сентябрь 04, 2018, 18:43
а асинхронный ввод/вывод конечно же реализуется не на многопоточке, да?

Конечно нет, она реализуется на эвентлупе (select/poll/epoll/kqueue)

которые реализуются за счет многопоточки. Карл.





Название: Re: Igors, это ты? :)
Отправлено: _Bers от Сентябрь 04, 2018, 18:45
лямбда-геттер жеж.
и пускай дергает, когда ему нужно из своего треда.
какие проблемы?


И как оно узнает, когда надо дергать? Поллинг сделать? Ну-ну.

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


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Сентябрь 04, 2018, 18:49
мой тезис остаётся в силе:
колбасить ещё один класс, только для того,
что бы тред запустить - напрасное раздутие кода,
неудобный, убогий дизайн.

Мне кажется или вы читать не умеете? Третий раз на пишу - на момент написания QThread другого способа НЕ БЫЛО, а ваш хваленый стд ни тредов не имел, ни анордеред мапы.
Аналог std::function написать было нельзя потому что компиляторы не умели в шаблоны нормально.

Сейчас QThread нужен ТОЛЬКО для того чтобы крутить эвентлуп, НЕ НУЖНО перегружать run. Используйте для этого std::thread.
У них сейчас РАЗНЫЕ задачи.

Метод run есть ТОЛЬКО ДЛЯ СОВМЕСТИМОСТИ чтобы не сломать кучу кода.

Я как со стенкой разговариваю, ей-богу.

Мне кажется или вы читать не умеете?
самолеты нужны, что бы летать.
у них у всех одинаковая задача.

с std::thread всякие кутешные сокеты начнут лагать.

кутя без своего убогого лупа как бе не особо юзабельна.
тупо же, когда слоты-сигналы перестают слотиттить-сигналить

а что там было в бородатых - не суть важно.

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



Название: Re: Igors, это ты? :)
Отправлено: _Bers от Сентябрь 04, 2018, 18:51
Кстати _Bers спалился что не опускался на уровень еполла и не писал сервак решающий "проблему 10к" ;)

Авварон в курсе, как устроен епулл изнутри?


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Сентябрь 04, 2018, 18:53
которые реализуются за счет многопоточки. Карл.

Эээээ, нет.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Сентябрь 04, 2018, 18:57

самолеты нужны, что бы летать.
у них у всех одинаковая задача.

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

с std::thread всякие кутешные сокеты начнут лагать.

Правильно, потому для нормальной работы сокетов нужен epoll


а что там было в бородатых - не суть важно.

Вообще-то важно. Вас пошлют на три буквы (перестанут юзать ваш фреймворк) те, кому вы сломаете код, убрав run из треда.

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

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


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Сентябрь 04, 2018, 18:58
Кстати _Bers спалился что не опускался на уровень еполла и не писал сервак решающий "проблему 10к" ;)

Авварон в курсе, как устроен епулл изнутри?

Да, поток засыпает на системном вызове, передавая управление ядру.
В ядре происходит событие о сокете, тред пробуждает ядро.
Тут стоит добавить, что планировщик скорее всего догадывается, что тред, спящий на епулле не надо будить.

А вы думали там внутри эвентлуп в юзерспейсе как в азио? Ооок.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Сентябрь 04, 2018, 19:12
Можете взять мое, или просто печатать в консоль.
просто печать в консоль см. выше.

В Qt для этого есть удобный механизм, а в std - ни кола, ни двора.
ещё std не умеет окошки рисовать.
вы вообще осознаете, что  и с чем сравниваете?

Наоборот, std-шный стиль запуска выглядит "каменным веком" - обязует заботиться обо всем самому.

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

вот такой дизайн вымораживает:
Код:
fc->moveToThread(&mThread);

перевожу на русский: "сношай меня в отдельном треде"
вот сколько всяких моделей (винапи, сдл, позикс, etc)
до такого бреда только кутя додумалась.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Сентябрь 04, 2018, 19:14
которые реализуются за счет многопоточки. Карл.

Эээээ, нет.

а ещё земля плоская, Карл.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Сентябрь 04, 2018, 19:24
Но кутред - это шаттл. То что что у него есть крылья (слово тред в названии) не делает его самолетом. Это вы хотите на шаттле в нью-йорк летать, а он нужен чтобы в космос.

нет. шаттл. это шаттл. а тред - это тред. если тред называют тредом, значит он должен вести себя как тред.
моральные люди не называют шаттл самолетом, что бы потом возвражать: "но это же не самолет, это шаттл"


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

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


а что там было в бородатых - не суть важно.


Вообще-то важно. Вас пошлют на три буквы (перестанут юзать ваш фреймворк) те, кому вы сломаете код, убрав run из треда.

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

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


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

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


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Сентябрь 04, 2018, 19:26
Да, поток засыпает на системном вызове, передавая управление ядру.
и о боже, это и есть многопоточка, Карл!

А вы думали там внутри эвентлуп в юзерспейсе как в азио? Ооок.
сам придумал - сам ответил. сам оокнул.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Сентябрь 04, 2018, 19:48

пример годного дизайна - ася.


Пример хренового дизайна, вообще-то.


Название: Re: Igors, это ты? :)
Отправлено: Old от Сентябрь 04, 2018, 19:48
вы осознаете, что противоречите здравому смыслу?
Вовсе нет. Ассинхронка не имеет ничего общего с многопоточкой. И никогда с ее помощью не реализовалась.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Сентябрь 04, 2018, 19:51
и о боже, это и есть многопоточка, Карл!

Юзерский поток тут один (как и процесс).

То, что ядро работает в другом процессе нас волновать как бы не должно.

Так можно сказать, что любое приложение, юзающее системный вызов (read, например), многопоточно.


Название: Re: Igors, это ты? :)
Отправлено: ssoft от Сентябрь 04, 2018, 21:07
а асинхронный ввод/вывод конечно же реализуется не на многопоточке, да?
Нет. Асинхронка может работать и в одном потоке.

вы осознаете, что противоречите здравому смыслу?

Асинхронность и многопоточность никак не связаны друг с другом. Обычно говорят об их ортогональности.
Программа может работать в их любом сочетании:

  • Асинхронно однопоточно
  • Синхронно однопоточно
  • Асинхронно многопоточно
  • Синхронно многопоточно


Название: Re: Igors, это ты? :)
Отправлено: Igors от Сентябрь 05, 2018, 06:04
да все тоже самое практически.
только сигналы не нужны.
пихай коллбек, который будет отрисовывать прогресс.
вернет фальш - копирование завершиться.
Вы что, правда думаете что можно вот так, не снимая грязных тапок, выполнять код другой нитки?

вот такой дизайн вымораживает:
Код:
fc->moveToThread(&mThread);

перевожу на русский: "сношай меня в отдельном треде"
вот сколько всяких моделей (винапи, сдл, позикс, etc)
до такого бреда только кутя додумалась.
Ну вот зачем бросаться такими заявлениями если, как все уже видели, ответить за них Вам совершенно нечем? Внимательное изучение архитектуры Qt классов даст намного больше для понимания плюсов чем бестолковое всасывание синтаксического сахара std.

Что плохого Вы видите в том что объекты имеют принадлежность к ниткам (их eventLoop'ам)? Это как-то не укладывается в Ваши теперешние понятия? Так может их-то и надо расширить? :) Ведь "детский лепет" (мягко говоря) с callback'ами просто неудобно слушать. У меня вообще впечатление что пока Вы рады "запуску нитки", а с остальными вещами еще и не сталкивались.

Третий раз на пишу - на момент написания QThread другого способа НЕ БЫЛО, а ваш хваленый стд ни тредов не имел, ни анордеред мапы.
Аналог std::function написать было нельзя потому что компиляторы не умели в шаблоны нормально.
Не надо "оправдываться". Что изменилось что std там что-то "заимел"? Серьезные вещи не решаются цыганщиной типа std::function, нужна глубоко продуманная архитектура, взаимодействие классов. В Qt все это есть, а в std нет и не было, то так - какой ф-цией поудобнее тыцнуть, там-сям строку сэкономить. Мелкотемье/мелкочленье.



Название: Re: Igors, это ты? :)
Отправлено: Old от Сентябрь 05, 2018, 09:33
В Qt все это есть, а в std нет и не было
Более того и не будет никогда. Потому что std это стандартная библиотека C++, которая не должна диктовать разработчику как ему взаимодействовать между нитками. Она предоставляет ему нижний уровень, на котором разработчик может реализовать удобные для него и задачи механизмы взаимодействия.
А высокоуровневые механизмы уже реализуются в отдельных библиотеках, построенных на std. Для тех кто не может сам написать удобные и эффективные механизмы, существует множество сторонних библиотек (asio одна из них), в них есть все необходимое.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Ноябрь 29, 2018, 11:16
а асинхронный ввод/вывод конечно же реализуется не на многопоточке, да?
Нет. Асинхронка может работать и в одном потоке.

вы осознаете, что противоречите здравому смыслу?

Асинхронность и многопоточность никак не связаны друг с другом. Обычно говорят об их ортогональности.
Программа может работать в их любом сочетании:

  • Асинхронно однопоточно
  • Синхронно однопоточно
  • Асинхронно многопоточно
  • Синхронно многопоточно

у них дизайн одинаковый.

простой вопрос:
в чем принципиальное различие между стилями программирования:
"асинхронным однопоточным" и "синхронным многопоточным"?

простой ответ:
принципиальной разницы не существует.

меня удивляет, что находятся персонажи, которые этого не догоняют.
и начинают нести всякий бред про "асинхронку в одном потоке, и epoll, который пинает евент луп"

учитывая, что система, о боже! однопоточная, эвент луп у них, наверное,
в сферическом вакууме крутиццо.





Название: Re: Igors, это ты? :)
Отправлено: ssoft от Ноябрь 29, 2018, 14:30
у них дизайн одинаковый.

простой вопрос:
в чем принципиальное различие между стилями программирования:
"асинхронным однопоточным" и "синхронным многопоточным"?

простой ответ:
принципиальной разницы не существует.

меня удивляет, что находятся персонажи, которые этого не догоняют.
и начинают нести всякий бред про "асинхронку в одном потоке, и epoll, который пинает евент луп"

учитывая, что система, о боже! однопоточная, эвент луп у них, наверное,
в сферическом вакууме крутиццо.

А меня удивляют персонажи которые не догоняют разницу).

В асинхронном однопоточном - эвент луп.
В синхронном многопоточном - нафиг нужен ваш евент луп, переключайтесь между потоками через мютексы/семафоры и другие средства синхронизации.


Название: Re: Igors, это ты? :)
Отправлено: Igors от Ноябрь 30, 2018, 13:09
А меня удивляют персонажи ...
Ну если уж все свалилось в треп, то предлагаю такую темку

Вот говорят, std то, std се, это, мол, "основа основ" которую совершенно необходимо изучать, и чем больше - тем лучше. Ну если так, то и все либы что пользуемся должны быть "на основе std", иначе что это за основа такая? Но моя практика говорит обратное. Вот большие, солидные либы что я много пользовался в этом году

- ну конечно, Qt. Не считая мелких "жестов вежливости" позиция разработчиков ясна "чтобы духу тут std-шного не было!". Даже контейнеры свои (и с успехом)

- GStreamer - ну тут до std дело просто не нашло, суровый "С" (статУя вообще без плюсов)

- FBX  (фактически стандарт обмена данными между 3D приложениями). API никакого std не использует

Вспоминая предыдущие 5 лет - то же самое. Ну да, одна либа юзала std::string и std::vector, другая - только std::vector (впрочем и то в примерах). И это ВСЕ. Может я мало юзаю всякие либы (по мне чем меньше - тем лучше). Ну может и так. А может все проще - эта функторная срань никому не нужна? Может все хотят писать нормально, естественно, а не захлебываться итераторными соплями?


Название: Re: Igors, это ты? :)
Отправлено: ssoft от Ноябрь 30, 2018, 14:02
Ну если уж все свалилось в треп, то предлагаю такую темку
...
Вспоминая предыдущие 5 лет - то же самое. Ну да, одна либа юзала std::string и std::vector, другая - только std::vector (впрочем и то в примерах). И это ВСЕ. Может я мало юзаю всякие либы (по мне чем меньше - тем лучше). Ну может и так. А может все проще - эта функторная срань никому не нужна? Может все хотят писать нормально, естественно, а не захлебываться итераторными соплями?

Когда я был маленький ... )))

Изначально (до C++11) конструкций std было недостаточно, чтобы покрыть большУю часть задач.
Не было atomic, thread, function, mutex, unordered_map, turple и др. Не говоря уже о самом языке (rvalue, variadic template, thread-safe static и т.п.).
Приходилось писать много чего самостоятельно. Сколько всяких велосипедов изъезжено  ;D. Зато сколько опыта и знаний получено!

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

Тем не менее sdt C++ стал заметно богаче и кое-где эффективнее, чем раньше.
В своих проектах потихоньку переползаю на std, оставляя Qt только для GUI.


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Ноябрь 30, 2018, 15:26
Вот говорят, std то, std се, это, мол, "основа основ" которую совершенно необходимо изучать, и чем больше - тем лучше. Ну если так, то и все либы что пользуемся должны быть "на основе std", иначе что это за основа такая? Но моя практика говорит обратное. Вот большие, солидные либы что я много пользовался в этом году

- ну конечно, Qt. Не считая мелких "жестов вежливости" позиция разработчиков ясна "чтобы духу тут std-шного не было!". Даже контейнеры свои (и с успехом)

Так трудно использовать то, чего нет :). До С++11 в std особо ничего и не было, вот все свои велосипеды и писали. Теперь может кутешники и рады бы на контейнеры std перейти, да кто за такой рефакторинг возьмётся? Обратная совместимость опять же. Есть ли проекты на С++, рождённые после 2015г., которые бы свои контейнеры изобретали или std принципиально не использовали? И, на всякий случай, много ли их по с равнению с теми, что std используют :).

А может все проще - эта функторная срань никому не нужна? Может все хотят писать нормально, естественно, а не захлебываться итераторными соплями?

Лично мне вот нужна. И судя по тому, что это появляется в стандарте, то это ещё кому-то нужно (вряд ли такие нововведения только ради меня одного :)). Мне с каждым новым стандартом писать становится всё нормальнее и естественнее. Выходило бы это только всё побыстрее и в компиляторах поддерживалось. Но обкатка временем тоже нужна, придётся смириться.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Ноябрь 30, 2018, 17:39
А может все проще - эта функторная срань никому не нужна? Может все хотят писать нормально, естественно, а не захлебываться итераторными соплями?

Ну например, из недавнего. Раньше было:
Код:
void Wrapper::callMethod(QString foo, QString bar)
{
    QMetaObject::invokeMethod(worker, "method", Q_ARG(QString, foo), Q_ARG(QString, bar));
}
Стало

Код:
void Wrapper::callMethod(QString foo, QString bar)
{
    auto methodFunc = [this, foo, bar]()
    {
        worker->method(foo, bar);
    };
    QMetaObject::invokeMethod(worker, methodFunc);
}

Убрались богомерзкие Q_ARG, теперь findUsages находит method в лямбде, а раньше не находил, ибо но был строкой.


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Ноябрь 30, 2018, 18:01
Код:
void Wrapper::callMethod(QString foo, QString bar)
{
    auto methodFunc = [this, foo, bar]()
    {
        worker->method(foo, bar);
    };
    QMetaObject::invokeMethod(worker, methodFunc);
}

О, кто-то ещё invokeMethod использует :). На такой баг (https://bugreports.qt.io/browse/QTBUG-69683) не попадали? А то складывается впечатление, что через invokeMethod никто ничего уникального(некопируемого) не передаёт. Или всем пофиг :).


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Ноябрь 30, 2018, 19:45
ViTech
Пффф, юник_птр в QVector не положишь, а тут инвок вы хотите. Ишь чего!


Название: Re: Igors, это ты? :)
Отправлено: Igors от Декабрь 01, 2018, 11:39
Так трудно использовать то, чего нет :). До С++11 в std особо ничего и не было, вот все свои велосипеды и писали.
А по-моему все (немногое) хорошее в std было уже лет 20 назад. Тот же вектор, мап, сет, лист и десятка 2 по-настоящему хороших ф-ций (как напр lower_bound, nth_element и др). Основа любого проекта - такие простые данные, без них-то никак не обойтись. Ну конечно что "абсолютно необходимо" - всегда спорно. Напр может шаред органически не хватало, рисовать ++refCount приходилось частенько.

Ах, да это же ну очень простые, да чего там - примитивные вещи! Нам (эстетам) нужно намного больше! Не верю. Какой-нибудь задроченый тупл никогда не сделает  "погоды" в проекте. Может быть он поможет лучше (компактнее, проще и.т.п.) что-то решить, но это было и останется мелкой технической деталью - forever. Ну а если уж так необходимо - то кто хотел давно нашел (в Qt, boost и.т.п).

Общие вещи никогда не будут "в единственном числе", альтернатива всегда найдется. И сравнение совсем не в пользу std. Тот же std::thread - он же QThread в подметки не годится. И появился всего-то  лет через 15 (?) существования std. Дошло наконец что кросс-платформенное создание нитки все-таки нужно. Ну и слава богу, "лучше поздно чем никогда"

Есть ли проекты на С++, рождённые после 2015г., которые бы свои контейнеры изобретали или std принципиально не использовали? И, на всякий случай, много ли их по с равнению с теми, что std используют :).
Человек весьма уверен что он "на правильном пути" :) Я никогда не увлекался либами и использую только когда "ну вот совсем никак без нее" (жизнь заставляет). Тем не менее я привел 3 либы широко известные и доказавшие свою эффективность. Могу привести еще десяток, хотя никакой я не эрудит. А можно услышать хотя бы об одной написанной на std? Или оно больше для любительского программирования (начитаться и поумничать) ?  :) Или все еще идет "процесс обкатки" (ну да, понимаю, дело не быстрое)

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


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 01, 2018, 14:01
Пффф, юник_птр в QVector не положишь, а тут инвок вы хотите. Ишь чего!

Поэтому я на быстрый фикс и не надеялся. Хотя в QVector это родовая травма, которая не лечится, а invokeMethod вроде достаточно в некоторых местах по цепочке std::move добавить.

Общие вещи никогда не будут "в единственном числе", альтернатива всегда найдется. И сравнение совсем не в пользу std. Тот же std::thread - он же QThread в подметки не годится. И появился всего-то  лет через 15 (?) существования std. Дошло наконец что кросс-платформенное создание нитки все-таки нужно. Ну и слава богу, "лучше поздно чем никогда"

Вроде никто не отрицает, что в определённый момент времени развитие C++ и std затормозилось. Лет 10 проспали (2000-2010), имхо. За это время все кучу своих велосипедов и понаизобретали, с которых теперь не слезть.В Qt тоже много всего понаписали, и я бы не сказал, что это венец творения. Да, лучше чем ничего, но хуже, чем могло бы быть. А по поводу "чтобы духу тут std-шного не было!", в последних версиях Qt сделайте поиск по "std::" в исходниках, и потом расскажите, много там такого духу или мало.

Человек весьма уверен что он "на правильном пути" :) Я никогда не увлекался либами и использую только когда "ну вот совсем никак без нее" (жизнь заставляет). Тем не менее я привел 3 либы широко известные и доказавшие свою эффективность. Могу привести еще десяток, хотя никакой я не эрудит.

Вы за мою уверенность не переживайте :). Весьма уверен. И судя по последним вестям с полей, не я один. Но ежели кому нравится в лаптях ходить, так это дело личное :). И я говорил о проектах 2015г. и позже, когда С++11 устаканился в С++14, и компиляторы таки начали эти стандарты нормально поддерживать. А не о либах начала 2000, ясное дело, никто их переписывать не будет.

А можно услышать хотя бы об одной написанной на std? Или оно больше для любительского программирования (начитаться и поумничать) ?  :) Или все еще идет "процесс обкатки" (ну да, понимаю, дело не быстрое)

Что значит "написанной на std"? Например, Catch (https://github.com/catchorg/Catch2) достаточно на std написана?


Название: Re: Igors, это ты? :)
Отправлено: Igors от Декабрь 02, 2018, 09:55
В Qt тоже много всего понаписали, и я бы не сказал, что это венец творения. Да, лучше чем ничего, но хуже, чем могло бы быть.
Ну абсолютно любая вещь может быть лучше, а уж за европейскую зарплату - тем более :) Но перед тем как "снисходительно судить" - может применить это к себе? "А я чего понаписал? И как оно "могло быть лучше"? Попробуйте, очень полезная процедура :)

Вы за мою уверенность не переживайте :). Весьма уверен. И судя по последним вестям с полей, не я один.
Не навязываю своего мнения, но считаю такое вложение сил непродуктивным. У приличных людей 3/4 работы не связано с собсно "реализацией". Это может быть чтение статей/диссеров (а лучше тезисов к ним), анализ open-sources (если имеются), поиск алгоритма, разработка архитектуры классов и.т.п. А собсно "написание кода" - скорее легкая и приятная часть. Поэтому если человек сильно носится с какими-то чисто техническими подробностями - ну значит "молодой ишшо"  :) Их-то как раз блестяще знать совсем необязательно.

Однако вернемся к теме
Но ежели кому нравится в лаптях ходить, так это дело личное :). И я говорил о проектах 2015г. и позже, когда С++11 устаканился в С++14, и компиляторы таки начали эти стандарты нормально поддерживать. А не о либах начала 2000, ясное дело, никто их переписывать не будет.
Типа "и вот открывается перед нами большая и светлая дорога"  :)  Не вижу (ну может туповат). Что такого уж хорошего "дают" что, дескать, "был застой", а теперь вот "процесс пошел"? Какие-то улучшения там и сям - ну спасибо конечно, да и, как уже говорил, сам факт радует. Но не переоцениваете ли Вы их значимость?


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 02, 2018, 10:55
Вот говорят, std то, std се, это, мол, "основа основ" которую совершенно необходимо изучать, и чем больше - тем лучше.
У меня другой вопрос: что там в std можно изучать, тем более "чем больше - тем лучше"? :)
Итераторы? Вы уже много раз писали, что не можете с ними разобраться. Ну так и не трогайте их. Но это совсем не означает, что итераторы надо изучать, и их кто-то изучает - это слишком примитивная конструкция.
Вектор вы вроде освоили. Адресацию по индексу тоже. Что там еще в std осталось непостижимого для вас, что требует изучения?


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 02, 2018, 13:04
Ну абсолютно любая вещь может быть лучше, а уж за европейскую зарплату - тем более :) Но перед тем как "снисходительно судить" - может применить это к себе? "А я чего понаписал? И как оно "могло быть лучше"? Попробуйте, очень полезная процедура :)

Ни разу так не делал, надо попробовать. Спасибо, что подсказали :).

Не навязываю своего мнения, но считаю такое вложение сил непродуктивным. У приличных людей 3/4 работы не связано с собсно "реализацией". Это может быть чтение статей/диссеров (а лучше тезисов к ним), анализ open-sources (если имеются), поиск алгоритма, разработка архитектуры классов и.т.п. А собсно "написание кода" - скорее легкая и приятная часть. Поэтому если человек сильно носится с какими-то чисто техническими подробностями - ну значит "молодой ишшо"  :) Их-то как раз блестяще знать совсем необязательно.

Если потом не приходится отвечать на вопросы типа: "Почему так тормозит и гигабайты отжирает?", то да, блестяще знать не обязательно.

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

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

А Вам какие улучшения в std нужны, чтоб вот сразу всё попёрло и не надо было возиться с техническими подробностями? :)


Название: Re: Igors, это ты? :)
Отправлено: Igors от Декабрь 03, 2018, 08:45
Если потом не приходится отвечать на вопросы типа: "Почему так тормозит и гигабайты отжирает?", то да, блестяще знать не обязательно.
Ну вот зачем, мягко говоря, "кривить душой"? :) Да, велосипедист иной раз и перегнет палку с оптимизацией, но это грех простительный. А вот std-шнику на тормоза и ресурсы наплевать. Ведь его цель - взять готовое "и не париться". Поэтому все сосредоточено на тупеньком запоминании "что делает тот или иной вызов". Ага, подходит std::find - ну и хорошо, а то что это "брута форса" - понятия нет. А как Вы давеча залепили N вставок вместо одной? И ничего, ведь главное сделано - нужный вызов std найден! Да еще и "с итераторами" - красота! Нужно с мапой работать по индексу (!?) - так вот же std::distance/advance! (наблюдал на этом форуме)

А Вам какие улучшения в std нужны, чтоб вот сразу всё попёрло и не надо было возиться с техническими подробностями? :)
Ну я не в комитете (и слава богу). Конечно сама идея стандартной библиотеки прекрасна, насколько мне известно, языки помоложе (шарпы всякие) с этого и начинают. Задолбали эти "игры в обобщение", хотелось бы побольше капитальных "сущностей", а то пока аж 2 (unique и shared) - не разогнаться. И может необязательно все сводить к "вумным указателям", без оператора -> я проживу.


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 03, 2018, 14:03
Ну вот зачем, мягко говоря, "кривить душой"? :) Да, велосипедист иной раз и перегнет палку с оптимизацией, но это грех простительный. А вот std-шнику на тормоза и ресурсы наплевать. Ведь его цель - взять готовое "и не париться". Поэтому все сосредоточено на тупеньком запоминании "что делает тот или иной вызов". Ага, подходит std::find - ну и хорошо, а то что это "брута форса" - понятия нет. А как Вы давеча залепили N вставок вместо одной? И ничего, ведь главное сделано - нужный вызов std найден! Да еще и "с итераторами" - красота! Нужно с мапой работать по индексу (!?) - так вот же std::distance/advance! (наблюдал на этом форуме)

Вон оно чо :). Оказывается реализацию std дураки пишут, в лоб. И Вы бы всяко лучше написали обобщенные алгоритмы поиска в контейнерах разного типа и вставки диапазона элементов за одно действие (кусок vector в list и наоборот). В кутешных QList/QVector поиск не брутфорсом делается? И, опять же, можно поискать "std::find" в исходниках Qt. Ещё кутешники подло поступили с Вами и не добавили вставку диапазона элементов в QList (и в QLinkedList заодно). За что они так с Вами? :) И если таки понадобится вставить кусок QVector в QList, то как вставлять будете?

Есть такая штука - QtAlgorithms. Что мы там видим:
Цитировать
Historically, Qt used to provide functions which were direct equivalents of many STL algorithmic functions. Starting with Qt 5.0, you are instead encouraged to use directly the implementations available in the STL; most of the Qt ones have been deprecated (although they are still available to keep the old code compiling).

Чего это они под std прогнулись? Даже в свои хорошие контейнеры пришлось добавлять методы для совместимости с богомерзким std.

Ну я не в комитете (и слава богу).

Тут бог действительно оберегает сообщество. Славься!

Конечно сама идея стандартной библиотеки прекрасна, насколько мне известно, языки помоложе (шарпы всякие) с этого и начинают. Задолбали эти "игры в обобщение", хотелось бы побольше капитальных "сущностей", а то пока аж 2 (unique и shared) - не разогнаться. И может необязательно все сводить к "вумным указателям", без оператора -> я проживу.

Так какие "сущности" нужны? Особенно интересно в разрезе умных указателей. А то мне некоторые недавно на пальцах объясняли, что "shared_ptr хватит всем".


Название: Re: Igors, это ты? :)
Отправлено: Igors от Декабрь 04, 2018, 07:01
(и в QLinkedList заодно)
Хотя список (QLinkedList или std::list, не путать с QList) и не очень популярен, это интереснейший контейнер. Быстрая (практически бесплатная) вставка у него по определению. Вот с ним ота песня с итераторами вполне уместна.

И если таки понадобится вставить кусок QVector в QList, то как вставлять будете?
Не знаю, наверное руками. Увеличу размер QList и расчищу в нем место для новых эл-тов сместив "хвост" (заодно будет возможность подучить конструктор перемещения). Потом скопирую. Возможно оформлю темплейтом.

Тут бог действительно оберегает сообщество. Славься!
Не злитесь  :)

Так какие "сущности" нужны? Особенно интересно в разрезе умных указателей. А то мне некоторые недавно на пальцах объясняли, что "shared_ptr хватит всем".
Ну я точно не был одним из объяснявших  :) Вот пример что нужно (я уже его приводил)
Код
C++ (Qt)
struct SomeClient {
...
 SomeObject * m_Object;
...
};
Типовая ситуевина - клиент не владеет m_Object, не отвечает за его создание/удаление, т.е. клиент его просто использует - и все. В принципе все вполне норм (именно вследствие своей простоты/примитивности), если бы не одно "но" - если m_Object удален, то придется бегать и обнулять его во всех клиентах. И нужно как-то сохранить SomeObject для undo, причем честно (m_Object грохнут), а не так как в Qt. Напрашивающееся решение:
Код
C++ (Qt)
QWeakPointer<SomeObject> m_Object;
Но это вынуждает владельца объявлять его шаред, а это головняк, надо все время смотреть не зашарился ли он где еще. И почему-то автоматом предполагается "продление жизни". Чего это? Я ничего продлевать не просил. Поэтому несколько лучше смотрится
Код
C++ (Qt)
QPointer<SomeObject> m_Object;
Но эта радость только для QObject, общности нет.
И в любом случае проблем undo это не решает - все равно надо "бегать по всем клиентам".

Как же так? Случай простейший ("элементарный" и.т.п.) - всего-навсего член-указатель, а никаких средств не видать, приходится городить велики (а шо делать?)
 


Название: Re: Igors, это ты? :)
Отправлено: m_ax от Декабрь 04, 2018, 11:43
Цитировать
если бы не одно "но" - если m_Object удален, то придется бегать и обнулять его во всех клиентах.

Ну так сделайте его отслеживаемым (trackable).. Помнится, это уже обсуждалось:
Код
C++ (Qt)
#include <iostream>
#include <memory>
 
class trigger
{
public:
   trigger() : m_flag(true) {}
   bool get() const { return m_flag; }
 
   friend class trackable;
 
private:
   void set(bool flag) { m_flag = flag; }
   bool m_flag;
};
 
typedef std::shared_ptr<trigger> spy_type;
 
class trackable
{
public:
   trackable(const trackable &)
       : spy(std::make_shared<trigger>())
   {}
 
   trackable()
       : spy(std::make_shared<trigger>())
   {}
 
   trackable &operator=(const trackable &) { return *this; }
 
   ~trackable() { spy->set(false); }
   spy_type spy;
};
 
 
struct SomeObject : public trackable
{
   //...
};
 
struct SomeClient
{
   SomeObject * m_Object;
 
   bool objectIsValid() const { return (spy) ? spy->get() : false; }
 
   void setObject(SomeObject * obj)
   {
       m_Object = obj;
       spy = obj->spy;
   }
 
private:
   spy_type spy;
};
 
 
int main()
{
   SomeClient Client;
 
   std::cout << std::boolalpha << Client.objectIsValid() << std::endl;
 
   SomeObject * Object = new SomeObject();
 
   Client.setObject(Object);
 
   std::cout << Client.objectIsValid() << std::endl;
 
   delete Object;
 
   std::cout << Client.objectIsValid() << std::endl;
 
   return 0;
}
 
 
https://ideone.com/q3IbxF (https://ideone.com/q3IbxF)
Undo тоже не сложно реализовать..


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 04, 2018, 13:46
Быстрая (практически бесплатная) вставка у него по определению. Вот с ним ота песня с итераторами вполне уместна.
...
Увеличу размер QList и расчищу в нем место для новых эл-тов сместив "хвост" (заодно будет возможность подучить конструктор перемещения). Потом скопирую. Возможно оформлю темплейтом.

Без доступа к методам reserve(), end() ничего не выйдет.

Я говорил в общем о подходе. Определяется необходимый и достаточный набор методов для контейнеров (в STL описываются в Named requirements (https://en.cppreference.com/w/cpp/named_req)), остальное выносится в алгоритмы (https://en.cppreference.com/w/cpp/algorithm).

Если вот это всё вместе сложить, что получится? :)

В С++20 будут добавлены Concepts (https://en.cppreference.com/w/cpp/experimental/constraints), с их помощью можно узнать, есть ли в классе определенные типы/методы/поля. В С++17 уже есть if constexpr. С этими возможностями можно сделать алгоритм:
1. В классе есть свой метод insert(pos, first, last) - используем его напрямую.
2. Есть reserve(), end() (условно) - с их помощью реализуется обобщенный алгоритм вставки диапазона.
3. Есть одиночный insert(pos, value) - вставляем в цикле по одному. Тупо и для некоторых контейнеров дико не эффективно - а шо делать, хоть как-то надо вставить.
4. Ничего подходящего нет - ошибка компиляции.

Может "встроенные" методы insert(pos, first, last) в контейнерах и есть "необходимый и достаточный набор", и с помощью "reserve(), end()" не всегда или не для всех контейнеров можно написать обобщенный алгоритм, тут я ничего точно утверждать не могу, так глубоко в тему не погружался. Но в С++20 добавятся ещё и Ranges (https://en.cppreference.com/w/cpp/experimental/ranges), и чтобы была возможность вставки Range в контейнер, что будут делать: добавлять в каждый контейнер перегрузку insert с параметром Range, или сделают внешнюю функцию (ака алгоритм), которая этот Range передаст в виде итераторов в метод insert контейнера? И будут ли у этой внешней функции перегрузки для итераторов? Делаем ставки :).

Код
C++ (Qt)
QWeakPointer<SomeObject> m_Object;
Код
C++ (Qt)
QPointer<SomeObject> m_Object;

Посмотрите в исходниках, что из себя представляет этот QPointer ;).

Типовая ситуевина - клиент не владеет m_Object, не отвечает за его создание/удаление, т.е. клиент его просто использует - и все.
...
Но это вынуждает владельца объявлять его шаред, а это головняк, надо все время смотреть не зашарился ли он где еще. И почему-то автоматом предполагается "продление жизни". Чего это? Я ничего продлевать не просил.

Если "клиент не владеет m_Object, не отвечает за его создание/удаление, т.е. клиент его просто использует" и "надо все время смотреть не зашарился ли он где еще", можно ли сказать, что кто-то владеет SomeObject уникально, а SomeClient имеет "невладеющую ссылку" на него? std тогда предлагает для владения unique_ptr, и голый указатель или observer_ptr (https://en.cppreference.com/w/cpp/experimental/observer_ptr) в качестве "невладеющей ссылки". Но если unique_ptr удалится (вместе с объектом), то ни голый указатель, ни observer_ptr об этом не узнают. Это и была одной из основных причин(плюс ещё многопоточность), по которой я начал мутить свои указатели. Но некоторые (не Вы) говорят, что shared_ptr хватит для всех, чтобы он еще где-то не шарился - "так смотрите внимательнее, что пишите", а что из weak_ptr можно получить shared_ptr - "так сам дурак, раз так делаешь" :). Но чтобы shared_ptr таки нельзя было так просто шарить дальше, на пальцах показали такое решение (http://rsdn.org/forum/cpp.applied/7174004.1) , можете воспользоваться :).

Как же так? Случай простейший ("элементарный" и.т.п.) - всего-навсего член-указатель, а никаких средств не видать, приходится городить велики (а шо делать?)

Вот и я вопрошал: "Доколе?" :). Но ждать не стал, и сделал себе велик сам. Нужен ли такой в std? Не уверен, может даже скорее "нет", потому как в upl::unique присутствуют накладные расходы, в отличие от std::unique_ptr. В качестве сторонней библиотеки - каждый сам решает, для меня-то она не сторонняя :). К тому же она интегрирована с std, насколько это возможно.


Название: Re: Igors, это ты? :)
Отправлено: Igors от Декабрь 05, 2018, 16:05
Ну так сделайте его отслеживаемым (trackable).. Помнится, это уже обсуждалось:
...
Undo тоже не сложно реализовать..
Да, ясно: создадим флажок и пусть его шарят объект и клиент(ы). Объект при удалении сбрасывает флажок, и, увидев это false, клиент узнает что объект уже удален. Критика:

- (используемым) объектом может быть очень многое, поэтому навязывание интерфейса trackabe всем и каждому не радует

- клиент: мне кажется более естественным хранить указатель и шаред флажок в структуре, снабдив ее бесхитростным методом get(). Чтобы не дорисовывать методы если появятся еще такие "используемые" указатели

Но это все цветочки. Главное - от беготни с поиском "кто ссылается на объект" эта конструкция никак не избавляет. Можно оборачивать шаред так и сяк - но он хранит только "факт ссылки". Собсно любая "вумность" указателей на этом и заканчивается. Пример: та же запись данных для undo. Известно что SomeObject грохнут, значит надо найти клиентов - а никакой инфы о них в SomeObject нет. Приходится решать это "как-нибудь" (напр пробежкой по глобальному списку объектов, или сигналами или еще как). Но тогда зачем городить еще какие-то конструкции - ведь найдя клиента можно просто обнулить в нем указатель - и все.

Не спорю, просто "указатель с валидностью" тоже неплохо, иногда достаточно и его, но часто/обычно нет.





Название: Re: Igors, это ты? :)
Отправлено: Авварон от Декабрь 05, 2018, 16:14
Igors
хз, свазок shared/weak и unique/observer достаточно ИМХО для любых нужд.
К примеру весь парент-чайлд Qt делается при помощи второй.
Код:
auto parent = std::make_unique<QMainWindow>();
std::observer_ptr<QWidget> w1 = QObject::makeChild<QWidget>(parent);
auto w2 = std::make_unique<QWidget>();
w1->addChild(std::move(w2));

Вот, к примеру, ваше любимое дерево (https://github.com/ABBAPOH/textureviewer/blob/master/src/libs/textureviewcore/thumbnailsmodel_p.h#L8). Думаю завернуть в шаблон через идиому base/derived и таскать между проектами


Название: Re: Igors, это ты? :)
Отправлено: m_ax от Декабрь 05, 2018, 16:50
Цитировать
- (используемым) объектом может быть очень многое, поэтому навязывание интерфейса trackabe всем и каждому не радует
Не нравится наследование, сделайте trackable членом класса, например..

Цитировать
Но это все цветочки. Главное - от беготни с поиском "кто ссылается на объект" эта конструкция никак не избавляет. Можно оборачивать шаред так и сяк - но он хранит только "факт ссылки". Собсно любая "вумность" указателей на этом и заканчивается. Пример: та же запись данных для undo. Известно что SomeObject грохнут, значит надо найти клиентов - а никакой инфы о них в SomeObject нет. Приходится решать это "как-нибудь" (напр пробежкой по глобальному списку объектов, или сигналами или еще как). Но тогда зачем городить еще какие-то конструкции - ведь найдя клиента можно просто обнулить в нем указатель - и все.
Это решается с помощью некоторого manager'а, который знает какие клиенты подписаны/следят за SomeObject. И в деструкторе m_Object просто пинаете этого менеджера, чтоб он автоматически передавал сигналы (со всеми необходимыми данными для undo) всем подписанным клиентам. Тогда не придётся "руками" бегать по всему списку..


Название: Re: Igors, это ты? :)
Отправлено: Igors от Декабрь 05, 2018, 17:34
Это решается с помощью некоторого manager'а, который знает какие клиенты подписаны/следят за SomeObject. И в деструкторе m_Object просто пинаете этого менеджера, чтоб он автоматически передавал сигналы (со всеми необходимыми данными для undo) всем подписанным клиентам. Тогда не придётся "руками" бегать по всему списку..
Да, такие наметки напрашиваются, но.. это выглядит совсем другой задачей, никак не связанной ни с "вумными указателями" ни с новыми "сущностями" в стандарте. По сути мы признаем что эти фичес так, "мелочь по карманам тырить" (валидный указатель но не серьезный менеджер). Ну не знаю, я бы с такими выводами не спешил, все-таки задача выглядит весьма общей.

хз, свазок shared/weak и unique/observer достаточно ИМХО для любых нужд.
К примеру весь парент-чайлд Qt делается при помощи второй.
Код:
auto parent = std::make_unique<QMainWindow>();
std::observer_ptr<QWidget> w1 = QObject::makeChild<QWidget>(parent);
auto w2 = std::make_unique<QWidget>();
w1->addChild(std::move(w2));
"То що це йому дало?". Расскажите чего Вы таким образом добились, observer_ptr только мельком глядел, по смыслу вроде"само то" но ни одного примера нет и experimental


Название: Re: Igors, это ты? :)
Отправлено: m_ax от Декабрь 05, 2018, 18:14
Цитировать
Да, такие наметки напрашиваются, но.. это выглядит совсем другой задачей, никак не связанной ни с "вумными указателями" ни с новыми "сущностями" в стандарте. По сути мы признаем что эти фичес так, "мелочь по карманам тырить" (валидный указатель но не серьезный менеджер). Ну не знаю, я бы с такими выводами не спешил, все-таки задача выглядит весьма общей.
В std и не должно быть решений на все случаи жизни. Она даёт концепции и инструментарий/кирпичики из которых уже можно сложить и manager и клиентов и т.д.. 


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Декабрь 05, 2018, 20:05
"То що це йому дало?". Расскажите чего Вы таким образом добились

Того, что по сигатуре функции видно, кто кем владеет.
Код:
QAbstractItemModel *QAbstractItemView::model() const

Возвращаемый указатель надо удалять? Или его вью удалит? А если я всё-таки удалю, что произойдет?
А тут?
Код:
QGraphicsRectItem *QGraphicsScene::addRect()
А тут?
Код:
void QDataStream::setDevice(QIODevice *d)
Чуете проблему, к каждой функции приходится писать пространные объяснения кто кем владеет или догадываться по словам add/set. Думаю, если поискать, то можно найти неочевидных контрпримеров в АПИ Qt.

observer_ptr только мельком глядел, по смыслу вроде"само то" но ни одного примера нет и experimental

Ну обычный "вумный" указатель, который не владеет и за временем жизни не следит (как делает weak/QPointer). Используется чтобы показать, что объект удалять не надо, им владеет кто-то ещё как-то ещё и что он может быть удален. Апи 1в1 как у unique_ptr или shared_ptr (operator*, ->, bool, метод get()).

Например:
Код:
std::observer_ptr<QIODevice> QDataStream::device(d) const;
void QDataStream::setDevice(std::observer_ptr<QIODevice> d);

Видно, что датастрим хранит указатель на объект но им не владеет.

Я юзаю его так (https://github.com/ABBAPOH/textureviewer/blob/master/include/ObserverPointer#L17)
Впрочем, мб уже и под вендой появилось


Название: Re: Igors, это ты? :)
Отправлено: Igors от Декабрь 06, 2018, 10:24
Возвращаемый указатель надо удалять? Или ...
Когда-то читал отличный учебник английского языка. Там примерно так
Цитировать
Если увидели глагол с предлогом - никогда не полагайтесь на здравый смысл, всегда открывайте словарь
.
Видно, что датастрим хранит указатель на объект но им не владеет.
Здесь немного "не вкурил", ну ладно, не все сразу. Спасибо

В std и не должно быть решений на все случаи жизни. Она даёт концепции и инструментарий/кирпичики из которых уже можно сложить и manager и клиентов и т.д..  
Ну так давайте складывать. Боюсь что реальная реализация не будет использовать никаких std концепций/кирпичиков :) Напомню чего мы хотим - имея объект уметь находить всех ссылающихся на него. Ну и, само собой, уметь добавлять/удалять эти ссылки. При этом никакого владения нет, более того, даже цикличные ссылки могут быть разрешены.

Не нравится наследование, сделайте trackable членом класса, например..
Это чуть приятнее, но все равно накладно - придется добавлять этот член везде. И тогда не будет общей возможности взять target (на что ссылаемся). А не сделать ли хранение ссылок вообще "внешним"? Тогда использование может выглядеть напр так
Код
C++ (Qt)
CSomeObject * refTarget;    // на него ссылаемся
CAnotherObject * refНandle; // а этот ссылается на кого-то
 
... // устанавливаем связь между объектами
СReferenceManager::InstallLink(refTarget, refHandle, LINK_TYPE_DEFAULT);
..
// имея target перебираем ссылающихся
int numLinks = СReferenceManager::GetHandleCount(refTarget); // вернет 1 (один объект ссылается)
int linkType, index = 0;
void * handle = СReferenceManager::GetIndexedHandle(refTarget, index, &linkType);
void * handle2 = СReferenceManager::GetTypedHandle(refTarget, LINK_TYPE_DEFAULT);
...
// имея ссылающегося извлекаем target
void * target = СReferenceManager::GetTarget(refНаndle, LINK_TYPE_DEFAULT);
 
Понимаю, это совсем не модно :), да и с void'ами надо подумать. Ограничения - объект(ы) должен быть неперемещаемым. И в деструкторе объект должен позвать СReferenceManager, не вижу никакой возможности это проконтролировать (да, минус). Зато в остальном - нет никаких обязательств, интерфейсов и.т.п.

Критикуем, пинаем...


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 06, 2018, 12:11
Понимаю, это совсем не модно :), да и с void'ами надо подумать.

Да, осталась самая малость - понять, что с этими объектами, ссылающимися на заданный, вообще можно делать :). Вот получили с помощью СReferenceManager::GetIndexedHandle(refTarget, index, &linkType) какой-то объект, что с ним можно делать?


Название: Re: Igors, это ты? :)
Отправлено: m_ax от Декабрь 06, 2018, 17:01
Цитировать
Понимаю, это совсем не модно  :), да и с void'ами надо подумать.
Я вообще перестал понимать, что здесь происходит)
Если максимально упростить задачу, то в этой истории останется 3 персонажа (в моём понимании): Client (их может быть много), Object,  который используют клиенты и Manager, который контролирует время жизни Object и оповещает всех клиентов, когда тот удаляется.

Вот как пример (на коленке) иллюстрирующий это:
Код
C++ (Qt)
#include <iostream>
#include <list>
 
class Object
{
   //...
};
 
class Client
{
public:
   Object * m_Object;
 
   void makeUndo()
   {
       // ...
       m_Object = nullptr;
   }
};
 
class Manager
{
public:
   Manager(Object * obj = nullptr)
       : m_object(obj)
   {}
 
   void addClient(Client * client)
   {
       m_subscribers.push_back(client);
   }
 
   void killObject()
   {
       for (auto c : m_subscribers)
           c->makeUndo();
 
       delete m_object;
       m_object = nullptr;
   }
 
private:
   Object * m_object;
   std::list<Client*> m_subscribers;
};
 
 
int main()
{
   Object * obj = new Object;
 
   Client client1;
   Client client2;
 
   client1.m_Object = obj;
   client2.m_Object = obj;
 
   Manager manager(obj);
 
   manager.addClient(&client1);
   manager.addClient(&client2);
 
   manager.killObject();
 
   return 0;
}
 
 


Название: Re: Igors, это ты? :)
Отправлено: Igors от Декабрь 06, 2018, 17:46
Да, осталась самая малость - понять, что с этими объектами, ссылающимися на заданный, вообще можно делать :). Вот получили с помощью СReferenceManager::GetIndexedHandle(refTarget, index, &linkType) какой-то объект, что с ним можно делать?
Как уже говорилось, объект "используется" клиентом, т.е. клиент просто-напросто дергает методы объекта, ну или читает/пишет его public члены. Напр в случае undo нужно записать в файл пару уникальных ID (объекта и клиента), чтобы, если дело дойдет до undo, восстановить связку. А если таких связок несколько (почему нет), то дополнительно еще и идентификатор связки (linkType). Итого: при выполнении undo (перед удалением Object) значение возвращаемое GetIndexedHandle используется для получения уникального ID этого клиента.

Я вообще перестал понимать, что здесь происходит)
Если максимально упростить задачу, то в этой истории останется 3 персонажа (в моём понимании): Client (их может быть много), Object,  который используют клиенты и Manager, который контролирует время жизни Object и оповещает всех клиентов, когда тот удаляется.
Изначально персонажей только 2 - клиент(ы) и (используемый) объект. Клиенты должен знать объекты, которые они используют, а объекты - всех использующих клиентов. Как это реализуется (с manager'ом или без) - дело разработчика. Также "оповещение" (типа "ссылка изменилась") - вариант возможный но совсем не единственный (см пример undo выше)


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 07, 2018, 11:04
Клиенты должен знать объекты, которые они используют, а объекты - всех использующих клиентов.

Эти клиенты/ссылающиеся одного типа (или имеют общий базовый тип)? Или могут быть несвязанными между собой типами и ссылаться на один объект?


Название: Re: Igors, это ты? :)
Отправлено: m_ax от Декабрь 07, 2018, 14:44
Цитировать
Эти клиенты/ссылающиеся одного типа (или имеют общий базовый тип)? Или могут быть несвязанными между собой типами и ссылаться на один объект?
Меня тут другой вопрос вопрос беспокоит: С какого кхм-кхм.. объекту знать о всех клиентах? :)


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 07, 2018, 17:51
Клиенты должен знать объекты, которые они используют, а объекты - всех использующих клиентов.
И все это поместить в MainWindow и композиция будет завершенной. :)


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 07, 2018, 18:25
И все это поместить в MainWindow и композиция будет завершенной. :)

А в центре вишенку - вьюху дерева (http://www.prog.org.ru/topic_32246_0.html) с 300 методами, которая синглтон.


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 07, 2018, 20:52
А в центре вишенку - вьюху дерева (http://www.prog.org.ru/topic_32246_0.html) с 300 методами, которая синглтон.
Ну это же идеальный MainWindow. :)


Название: Re: Igors, это ты? :)
Отправлено: m_ax от Декабрь 07, 2018, 21:51
А в центре вишенку - вьюху дерева (http://www.prog.org.ru/topic_32246_0.html) с 300 методами, которая синглтон.
Ну это же идеальный MainWindow. :)
Представил ситуацию на каком-нибудь CppCon на кофебрейке, когда после этих слов возникла тишина, и кто то в дальнем углу выронил кружку с кофе :)


Название: Re: Igors, это ты? :)
Отправлено: Igors от Декабрь 08, 2018, 09:50
Эти клиенты/ссылающиеся одного типа (или имеют общий базовый тип)? Или могут быть несвязанными между собой типами и ссылаться на один объект?
Ну а почему Вы спрашиваете у меня?  :) Разве "член-указатель" - глухая специфика моего проекта? И как вообще Вам удалось избежать этой проблемы которая возникает повсеместно?

Конкретно в моем проекте - да, есть общий базовый тип, который (увы) давно стал (или всегда был) god-class'ом. Каких-то других "цивильных" решений я лично не вижу, возможно их и нет. Ну на всякий случай спрошу у фанов std (ну а вдруг?  :))

Меня тут другой вопрос вопрос беспокоит: С какого кхм-кхм.. объекту знать о всех клиентах? :)
Ну объявить неудобную задачу неграмотной хочется всегда  :) Но налицо по меньшей мере 3 случая когда это необходимо

1) Объект удаляется - обнулить ссылки на него
2) Сохранить данные undo перед удалением объекта
3) "Оповещение" что данные ссылки изменились

Конечно можно решить "1" напр вумным указателем, а остальные 2 напр сигналами, но... хорошо ли это? Ведь очевидно что во всех случаях нужен доступ к одним и тем же данным (ссылающиеся). Или может это нарушает какие-то прынцыпы, мол, выходит "все о всех знают". Но ведь мы же сами устанавливаем "отношение" между объектами, поэтому появление новых зависимостей - то что и должны были получить. И с какой стати эти зависимости должны быть "одно направленными"? Чем это "отношение" хуже (или лучше) того же парент-чайлд?

А в центре вишенку - вьюху дерева (http://www.prog.org.ru/topic_32246_0.html) с 300 методами, которая синглтон.
Подобное острословие хорошо понятно: никаких идей/мыслей у человека нет, а поиск в std-багаже ничего не дал. Ну тоже какой-то рез-т, пусть маленький


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 08, 2018, 10:19
никаких идей/мыслей у человека нет, а поиск в std-багаже ничего не дал.
А какие идеи/мысли вы ждете? Вы все уже ответили в своем сообщение выше: нужно использовать shared_ptr/wake_ptr, которые вы использовать не хотите, придумывая всякие отговорки.
А запердролить специальный менеджер, познакомить всех со всеми - вот это решение по вам. :)
Но обдумывать и серьезно обсуждать этот трешак уже никто не хочет, не смотря на то знает человек std или нет.


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 08, 2018, 12:29
Ну а почему Вы спрашиваете у меня?  :) Разве "член-указатель" - глухая специфика моего проекта? И как вообще Вам удалось избежать этой проблемы которая возникает повсеместно?

Конкретно в моем проекте - да, есть общий базовый тип, который (увы) давно стал (или всегда был) god-class'ом. Каких-то других "цивильных" решений я лично не вижу, возможно их и нет. Ну на всякий случай спрошу у фанов std (ну а вдруг?  :))

Возможно, следует обратить внимание на SOLID.

А в центре вишенку - вьюху дерева (http://www.prog.org.ru/topic_32246_0.html) с 300 методами, которая синглтон.
Подобное острословие хорошо понятно: никаких идей/мыслей у человека нет, а поиск в std-багаже ничего не дал. Ну тоже какой-то рез-т, пусть маленький

Это Вы правильно подметили: от человека, который не догадается сделать View синглтоном, не стоит ожидать мыслей высокого полёта и ослепительных идей. Даже если какие и появятся, всё одно будут выглядеть бледно на фоне сего :).


Название: Re: Igors, это ты? :)
Отправлено: Igors от Декабрь 09, 2018, 15:35
Это Вы правильно подметили: от человека, который не догадается сделать View синглтоном, не стоит ожидать мыслей высокого полёта и ослепительных идей. Даже если какие и появятся, всё одно будут выглядеть бледно на фоне сего :).
Ну мысли могут быть и не такими уж высокими, а идеи - необязательно ослепительными. Но все-таки они должны быть. Вот напр мне известны простейшие сведения из теории графов - есть вершины и ребра. Почему бы их не реализовать хотя бы прямолинейно - объект имеет вектор/контейнер выходных ребер (объектов на которые он ссылается) и контейнер входных (ссылающихся на него). Очевидно такая простая структура легко решает перечисленные выше задачи, да и на большее способна.

Но увы, такие простенькие соображения почему-то не приходят в std::головы :) Им обязательно надо что-то намутить с очередным вумным указателем, обязательно использовать std::вызовы, хотя очевидно что здесь они никак не помогут. Мнение что, якобы, "std - основа" - совершенно ложно и приносит немало вреда. Это всего лишь либа предоставляющая некоторые возможности (довольно ограниченные) - и не более того. Программиста не должно смущать что в std не находится ничего подходящего - там, правду сказать, вообще мало чего хорошего  :)



Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 09, 2018, 16:04
Почему бы их не реализовать хотя бы прямолинейно - объект имеет вектор/контейнер выходных ребер (объектов на которые он ссылается) и контейнер входных (ссылающихся на него). Очевидно такая простая структура легко решает перечисленные выше задачи, да и на большее способна.

Ну так и реализуйте, в чём проблема :). Контейнеры, кстати, какие будете использовать?


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 09, 2018, 16:14
Ну мысли могут быть и не такими уж высокими, а идеи - необязательно ослепительными. Но все-таки они должны быть. Вот напр мне известны простейшие сведения из теории графов - есть вершины и ребра. Почему бы их не реализовать хотя бы прямолинейно - объект имеет вектор/контейнер выходных ребер (объектов на которые он ссылается) и контейнер входных (ссылающихся на него). Очевидно такая простая структура легко решает перечисленные выше задачи, да и на большее способна.
Ну наверное потому, что управлять всем этим хозяйством будет не удобно и не эффективно.
Не говоря уже о том, что все должны будут знать всех.
Но вы можете это реализовать, это решение по вам. :)

Но увы, такие простенькие соображения почему-то не приходят в std::головы :)
Потому что простенькие решения ничего как правило не решают, а выступают костылями.

Им обязательно надо что-то намутить с очередным вумным указателем, обязательно использовать std::вызовы, хотя очевидно что здесь они никак не помогут.
Не обязательно брать std решения, можете написать свои умные указатели, потому что они здесь как раз подходят. :)

Мнение что, якобы, "std - основа" - совершенно ложно и приносит немало вреда.
Вот именно основа... базовые кирпичики из которых можно реализовывать законченные решения. Причем кроссплатформенные решения, которые будут одинаково работать на всех платформах. Вам это не нужно, но большинству разработчиков они жизненно важны.

Это всего лишь либа предоставляющая некоторые возможности (довольно ограниченные) - и не более того. Программиста не должно смущать что в std не находится ничего подходящего - там, правду сказать, вообще мало чего хорошего  :)
Вы нашли там vector, уже хорошо. :)


Название: Re: Igors, это ты? :)
Отправлено: Igors от Декабрь 10, 2018, 14:50
Контейнеры, кстати, какие будете использовать?
Может и std, незачем здесь завязываться только на Qt
Ну так и реализуйте, в чём проблема :).
А Вы, стало быть, в кусты :) Ну да, вот побаловаться с "семантикой", навернуть еще пяток-десяток вумных указателей, выделить/подчеркнуть "сущности" - это да, заниматься этим интересно (как впрочем и любой "общей" вещью). А вот какая-то там черновая работа типа "найти ссылающихся" - фу какая бяка, "костыль" и.т.п. Да и вообще это "не основной ф-ционал", "да мало ли кто там чего захочет" и.т.п. Ну это Ваше право.

Думается мешает сама "идиома" умных указателей (если я правильно употребляю этот термин). Мол "все как с обычным/голым указателем только.. (или плюс еще..)". Это слишком жиденько/маломощно, если мы хотим управлять зависимостями - то по меньшей мере их надо хранить, отделаться счетчиками точно не удастся. Да и вообще называть вещи своими именами - ну граф так граф (зависимостей), это нормально. А вумные указатели лучше бы реализовывали упр-е этим графом.

Да, ну и конечно это совсем не ново - нечто подобное наблюдаю еще с 90x, последний раз в GStreamer с которым познакомился в этом году. Когда-то обсуждали здесь "а как же (де)сериализовать такой член-указатель" - и по меньшей мере 3 человека рассказали о своих великах (весьма капитальных). Так что делать это приходится если и не всем то многим.

Писать какую-то свою "библиотечку" - ну у меня таких планов нет, и так уже юзвери недовольны моим бесконечным рефакторингом. Да, это место(а) сделано коряво, но работает - и слава богу. Проблемы, стало быть, нет - ну и хорошо что нет. 


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Декабрь 10, 2018, 15:58
Думается мешает сама "идиома" умных указателей (если я правильно употребляю этот термин). Мол "все как с обычным/голым указателем только.. (или плюс еще..)". Это слишком жиденько/маломощно, если мы хотим управлять зависимостями - то по меньшей мере их надо хранить, отделаться счетчиками точно не удастся. Да и вообще называть вещи своими именами - ну граф так граф (зависимостей), это нормально. А вумные указатели лучше бы реализовывали упр-е этим графом.

Почему-то никому не мешает, а вам мешает. Нет, если наконец разрешат перегрузку оператора точка, то можно уйти от указателей к ссылкам и плюсы превратятся в сишарп. Но в целом пофиг "->" юзать или ".", смысл не изменится - ну будут уникальная ссылка и шаредная ссылка.


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 10, 2018, 18:27
А Вы, стало быть, в кусты :)

А Вы хотите, чтобы я за Вас Вашу работу делал? :) Так у меня своих задач хватает, всегда есть над чем голову поломать.

Писать какую-то свою "библиотечку" - ну у меня таких планов нет, и так уже юзвери недовольны моим бесконечным рефакторингом.

Тогда остаётся ждать, когда у других такие планы появятся. Библиотечка-то сама себя не напишет :).

Да, это место(а) сделано коряво, но работает - и слава богу. Проблемы, стало быть, нет - ну и хорошо что нет.
Аминь!


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 10, 2018, 20:49
и так уже юзвери недовольны моим бесконечным рефакторингом.
И их можно понять. :)
С такими рефакторингами, программа может вообще перестать работать. :)


Название: Re: Igors, это ты? :)
Отправлено: Igors от Декабрь 11, 2018, 11:49
Почему-то никому не мешает, а вам мешает. Нет, если наконец разрешат перегрузку оператора точка, то можно уйти от указателей к ссылкам и плюсы превратятся в сишарп. Но в целом пофиг "->" юзать или ".", смысл не изменится - ну будут уникальная ссылка и шаредная ссылка.
Все эти игры с синтаксисом/семантикой ничего не меняют, так или иначе все крутится вокруг блочка памяти где сидят счетчики ссылок, а из этого ничего особо не выжать.


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 11, 2018, 12:07
Все эти игры с синтаксисом/семантикой ничего не меняют, так или иначе все крутится вокруг блочка памяти где сидят счетчики ссылок, а из этого ничего особо не выжать.
А из этого ничего выжимать и не надо. Даже, при вновь всплывших, операциях сериализации/десериализации.
Есть слабый указатель, если он ссылается на валидный объект - сериализуем id этого объекта, что бы при десериализации можно было восстановить связь, если ссылается на не валидный - сериализуем null-id, и при десериализации связь не восстанавливаем. id должен позволять однозначно находить объект при десериализации.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Декабрь 11, 2018, 12:36
Все эти игры с синтаксисом/семантикой ничего не меняют, так или иначе все крутится вокруг блочка памяти где сидят счетчики ссылок, а из этого ничего особо не выжать.

Как раз выжать можно что угодно, концептуально есть 2 способа владения - уникальное и шаредное. Есть ещё копия, но это то же уникальное (на стеке ли, через clone() ли).
Если вы придумаете какую-то друную идиому, вперед, я послушаю.
Дерево - это уникальное владение (дерево уникально владеет всеми нодами или нода уникально владеет детьми, ноды ссылаются друг на друга через Observer).
Граф - это уникальное владение (граф владеет нодами, связи между нодами задаются через observer_ptr). Я уж молчу что граф можно тупо на индексах постоить а данные хранить в векторе.


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 11, 2018, 13:02
Как раз выжать можно что угодно, концептуально есть 2 способа владения - уникальное и шаредное. Есть ещё копия, но это то же уникальное (на стеке ли, через clone() ли).
Если вы придумаете какую-то друную идиому, вперед, я послушаю.
Дерево - это уникальное владение (дерево уникально владеет всеми нодами или нода уникально владеет детьми, ноды ссылаются друг на друга через Observer).
Граф - это уникальное владение (граф владеет нодами, связи между нодами задаются через observer_ptr). Я уж молчу что граф можно тупо на индексах постоить а данные хранить в векторе.

Уникальное владение - это хорошо :). А кто-нибудь "снаружи" дерева может хранить ссылки на его узлы(через observer_ptr)? Или доступ к узлам есть только внутри дерева?


Название: Re: Igors, это ты? :)
Отправлено: Igors от Декабрь 11, 2018, 13:46
Как раз выжать можно что угодно, концептуально есть 2 способа владения - уникальное и шаредное. Есть ещё копия, но это то же уникальное (на стеке ли, через clone() ли).
Если вы придумаете какую-то друную идиому, вперед, я послушаю.
Дерево - это уникальное владение (дерево уникально владеет всеми нодами или нода уникально владеет детьми, ноды ссылаются друг на друга через Observer).
Граф - это уникальное владение (граф владеет нодами, связи между нодами задаются через observer_ptr). Я уж молчу что граф можно тупо на индексах постоить а данные хранить в векторе.
А владение здесь ни при чем. Граф сам по себе никак с ним не связан, это скорее "наблюдатель" хранящий информацию о связках/ребрах. Когда эти связки обеспечиваются самой структурой данных - необходимости в графе нет, напр узел дерева "знает" свое чайлдво, а часто и наоборот. Однако в случае напр "просто использования" таких связок нет, и придется их создавать. Про индексы Вы что-то загнули, не понял откуда им взяться.

Еще пример когда без графа, мягко говоря, хреновато: скопировать объекты которые могут ссылаться друг на друга. С конструктора/оператора копирования взять нечего, копия ссылается на тот же объект, а тут нужно не так. 


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 11, 2018, 14:22
А владение здесь ни при чем.
Да что вы.

Граф сам по себе никак с ним не связан, это скорее "наблюдатель" хранящий информацию о связках/ребрах.
Т.е. объекты между собой никак не связаны и спокойно функционируют, а наблюдатель знает какие то связи, но для функционирования системы они не нужны? Кому нужны такие связи?


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 13, 2018, 15:46
А меня удивляют персонажи которые не догоняют разницу).
трудно найти черную кошку в темной комнате, особенно если её там нет.

В асинхронном однопоточном - эвент луп.

под капотом эвент лупа у вас, вестимо,
сферический ваккуум, ога.

попробуйте самостоятельно, с нуля, разработать механизм,
который позволяет совершать асинхронные действия.
тогда может быть до ваших мозгов допрет,
что задача не реализуема в single-thread.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 13, 2018, 15:48
Вот говорят, std то, std се, это, мол, "основа основ" которую совершенно необходимо изучать, и чем больше - тем лучше. Ну если так, то и все либы что пользуемся должны быть "на основе std", иначе что это за основа такая? Но моя практика говорит обратное. Вот большие, солидные либы что я много пользовался в этом году

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


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 13, 2018, 16:41
тогда может быть до ваших мозгов допрет,

Всегда восхищали люди, которые уверены, что у них самый правильный мозг в мире :). Заходите сюда почаще и накидывайте побольше, а то скучно тут.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 13, 2018, 16:49
тогда может быть до ваших мозгов допрет,

Всегда восхищали люди, которые уверены, что у них самый правильный мозг в мире :). Заходите сюда почаще и накидывайте побольше, а то скучно тут.

асинхронный дизайн реализуется через многопоточный
по определению понятия самой концепции асинхронного программирования.

асинхронный дизайн придумал не я.
и он никак не зависит от моих мозгов.


вы можете попробовать (хотя бы чисто умозрительно-гипотетически, используя псевдоязык)
реализовать ансинхронный дизайн в условиях отсутствия много-поточности.

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







Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 13, 2018, 16:58
асинхронный дизайн реализуется через многопоточный
по определению понятия самой концепции асинхронного программирования.

асинхронный дизайн придумал не я.
и он никак не зависит от моих мозгов.

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


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 13, 2018, 17:00
реализовать ансинхронный дизайн в условиях отсутствия много-поточности.
Глупости какие. :)
Я так понимаю вы под bare metal без RTOS никогда не писали?

Асинхронность легко достигается в одном потоке исполнения.
В нем вы крутите event loop, где одним из действий проверяете поступление данных, например, из uart.
Пока данных нет - вы обрабатываете другие поступающие события, а как только данные появились - зовете обработчик читающий эти данные.

Так же это работает и на обычных система. Вы крутите event loop в одном потоке, в котором проверяете доступность сетевых данных, например, используя механизмы типа select/epoll. Если данные пришли - вызываем обработчик их читающий, нет обрабатываем другие события системы.

Или вы под асинхронностью понимаете только C++ async? :)


Название: Re: Igors, это ты? :)
Отправлено: ssoft от Декабрь 14, 2018, 08:57
асинхронный дизайн придумал не я.
и он никак не зависит от моих мозгов.

;D Ну с этим то я полностью согласен. И это очень даже хорошо).

вы можете попробовать (хотя бы чисто умозрительно-гипотетически, используя псевдоязык)
реализовать ансинхронный дизайн в условиях отсутствия много-поточности.

Про сопрограммы или прерывания ничего не слышали? Только про эвент луп?

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

Понятия синхронный/асинхронный относится к логике - прямой вызов/отложенный вызов.
Понятия однопоточный/многопоточный относится к технической реализации - без синхронизации/с синхронизацией.

Заходите сюда почаще и накидывайте побольше, а то скучно тут.

Да уж  ;D ;D ;D. Сразу намного веселее становится.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 11:10
асинхронный дизайн реализуется через многопоточный
по определению понятия самой концепции асинхронного программирования.

асинхронный дизайн придумал не я.
и он никак не зависит от моих мозгов.

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

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



Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 11:22
Асинхронность легко достигается в одном потоке исполнения.
В нем вы крутите event loop, где одним из действий проверяете поступление данных, например, из uart.
Пока данных нет - вы обрабатываете другие поступающие события, а как только данные появились - зовете обработчик читающий эти данные.


во-первых,
что бы данные смогли поступить, должна отработать процедура их получения.
что в условиях single-thread уже противоречит идее асинхронного дизайна.

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



вы вообще понимаете что такое "асинхронный дизайн" ?

асинхронный дизайн: запуск на выполнение не блокирующей функции.

ваш бизнес-поток не блокируется.
инициировав команду: "старт", он продолжает выполнение своей работы.

Код:
...
wait(callbackDataReady);  // <--- когда задача созреет - вам позвонят.
...
...  // <--- остальное время можете заниматься всем, чем угодно
...

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

здравствуйте мутексы, здравствуй, много-поточное нутро.


асинхронный дизайн невозможно реализовать в условиях single-thread.
но вы можете попытаться его проиллюстрировать хотя бы в псевдокоде.

не можете?
увы. это - невозможно.





Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 11:29
во-первых,
что бы данные смогли поступить, должна отработать процедура их получения.
что в условиях single-thread уже противоречит идее асинхронного дизайна.
Глупости. Данные получаются и хранятся в регистре uart, пока не будут вычитаны процедурой получения.

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

вы вообще понимаете что такое "асинхронный дизайн" ?
Я да, а вот вы не очень. :)

асинхронный дизайн: запуск на выполнение не блокирующей функции.

ваш бизнес-поток не блокируется.
инициировав команду: "старт", он продолжает выполнение своей работы.
А он и не блокируется, этот поток выполнения другие операции, которые готовы к обслуживанию.

асинхронный дизайн невозможно реализовать в условиях single-thread.
Еще раз, легко возможно и я выше расписал как.

но вы можете попытаться его проиллюстрировать хотя бы в псевдокоде.

не можете?
увы. это - невозможно.
Конечно могу, посмотрите любой пример из boost.asio использующий async функции. Ту же демку с таймерами. Он выполняется в одном потоке и это легко проверить в любом отладчике.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 11:31
вы можете попробовать (хотя бы чисто умозрительно-гипотетически, используя псевдоязык)
реализовать ансинхронный дизайн в условиях отсутствия много-поточности.

Про сопрограммы или прерывания ничего не слышали? Только про эвент луп?

сопрограммы ортогональны асинхронному программированию.
внезапно.

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





Асинхронный дизайн на одном потоке отличается от асинхронного дизайна на множестве потоков только отсутствием необходимости использовать какую-либо синхронизацию.
"асинхронный дизайн на одном потоке" - это что такое вообще?

покажите приме-иллюстрацию.

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


Понятия синхронный/асинхронный относится к логике - прямой вызов/отложенный вызов.

а теперь правильный отве:

нет никакого  "отложенного вызова" в контексте асинхронки.

инициация выполнения процедуры задачи происходит сразу же
по факту вызова связанной с нею функции.

отложенным является факт получения результата выполнения задачи.


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





Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 11:38
Конечно могу, посмотрите любой пример из boost.asio использующий async функции. Ту же демку с таймерами. Он выполняется в одном потоке и это легко проверить в любом отладчике.

1.
ася то как раз мульти-поточная.

2.
под капотом системного епула так же много-поточный дизайн.

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

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


я решил, не комментировать далее голословные бла бла бла.







Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 11:46
Набросал вам пример с двумя таймерами, который работает в одном потоке.
Код
C++ (Qt)
#include <boost/asio.hpp>
#include <boost/chrono.hpp>
#include <iostream>
 
using namespace std;
using namespace boost::asio;
 
void onTimeout1( const boost::system::error_code &ec, deadline_timer &timer )
{
 if( ec == error::operation_aborted )
   return;
 
 cout << "Timer1 triggered" << endl;
 
 timer.expires_from_now( boost::posix_time::seconds( 3 ) );
 timer.async_wait( [&timer]( const boost::system::error_code &ec ){ onTimeout1( ec, timer ); } );
}
 
void onTimeout2( const boost::system::error_code &ec, deadline_timer &timer )
{
 if( ec == error::operation_aborted )
   return;
 
 cout << "Timer2 triggered" << endl;
 
 timer.expires_from_now( boost::posix_time::seconds( 10 ) );
 timer.async_wait( [&timer]( const boost::system::error_code &ec ){ onTimeout2( ec, timer ); } );
}
 
int main()
{
 cout << "Run demo" << endl;
 
 io_context io;
 deadline_timer timer1( io );
 deadline_timer timer2( io );
 
 onTimeout1( boost::system::error_code(), timer1 );
 onTimeout2( boost::system::error_code(), timer2 );
 
 io.run();
 
 return 0;
}
 


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 11:51
1.
ася то как раз мульти-поточная.
asio мультипоточная, когда вам надо, а когда не надо - однопоточная. :)

2.
под капотом системного епула так же много-поточный дизайн.
Ну конечно, ядро современных ОС мультипоточны, поэтому абсолютно все программы являются мультипоточными (даже Hello world) - ну ок. :)

человек, который думает:
"да у меня всего один поток, за меня всю асинхронку ось реализовала, значит асинхронка возможна в одном треде" - тупой дебил.
Это человек который не знает, как работает периферия компьютера - тупой дебил. :)
Я вам уже привел пример с uart, а еще есть прерывания, зеленые треды и т.д. :)

я решил, не комментировать далее голословные бла бла бла.
Ну и правильно, сложно комментировать вещи о которых вы понятия не имеете. :)

Новое поколение "специалистов", которые умеют нажать кнопочку в visual studio и дождаться появления окошка со своей прикладной программой. А что там в "компьютерах" происходит между нажатием и появлением считают магией. :)


Название: Re: Igors, это ты? :)
Отправлено: Igors от Декабрь 14, 2018, 12:04
а теперь правильный отве:

нет никакого  "отложенного вызова" в контексте асинхронки.

инициация выполнения процедуры задачи происходит сразу же
по факту вызова связанной с нею функции.

отложенным является факт получения результата выполнения задачи.
Ну хорошо, вот простейший пример
Код:
m_timerID = this->startTimer();
Рано или поздно я отдам упр-е и выйду в событийный цикл. По таймеру будет что-то делаться, напр читаться файл по частям. Да, в одном потоке это выполняется последовательно, обычно чередуясь с UI операциями, и что с того? Почему это нельзя считать "асинхронкой"? Упр-е возвращается сразу, блокировки нет, момент окончания задачи неизвестен. И какая мне разница "отложенный вызов" или "отложенный факт получения" ?

Ну и вообще.. неужели программистам не о чем поговорить, свалились уже в полную фигню. Грустно   :'(


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 14, 2018, 12:08
возьми любой букварь (документацию) по любой библиотеке (функции),
которая работает в асинхронном режиме.
и почитай, что это значит.

Цитировать
Задержался мужик у любовницы и приходит домой очень поздно.
Жена:
— Где был, почему так поздно?
— Да вот, э-эээ...
— Опять, наверно, на партийном собрании задержался?
— А, да-да, конечно!
— А почему от тебя духами пахнет чужими?
— Да это, как его...
— Наверно, просто рядом на собрании сидели одни женщины?
— Ну да, конечно, дорогая!
— А чей это волос у тебя на костюме и след помады на шее?
— Да я, да...
— Наверно, давка была в автобусе, когда возвращался?
— О, да, да!
— Ну, ложись спать, дорогой.
Муж раздевается.
— Постой, а почему на тебе женские трусы?
— Маша, ну ты же умная женщина, ну придумай что-нибудь!

Молодец, отличная аргументация :). Сам себя отмазать не может, пущай другие этим занимаются :).


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 12:46
Молодец, отличная аргументация :)
если ты не веришь, например, документации boost::asio.
или, допустим, тебе из неё не вполне понятно, что такое "асинхронный дизайн",
и чем он отличается например, от "синхронного",
тогда можешь почитать мои сообщения выше.

я там его ну очень просто описал.
даже блондинка, третьекурсница медицинского факультета сможет понять.

Сам себя отмазать не может, пущай другие этим занимаются :).

есть особая разновидность дебилов: "дебил эгоцентричный".
такие в силу ущербности ума, но невхерственности мифической короны на голове,
почему то думают, будто бы кто-то будет перед ними как то отмазываться.
и вообще, что-то особое делать, или думать.

правда заключается в том, что не считая твоих близких,
окружающему миру (людям) на тебя по большому счету наплевать.



Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 14, 2018, 12:49
а теперь правильный отве:

нет никакого  "отложенного вызова" в контексте асинхронки.

инициация выполнения процедуры задачи происходит сразу же
по факту вызова связанной с нею функции.

отложенным является факт получения результата выполнения задачи.

Ну хорошо, вот простейший пример
Код:
m_timerID = this->startTimer();
Рано или поздно я отдам упр-е и выйду в событийный цикл. По таймеру будет что-то делаться, напр читаться файл по частям. Да, в одном потоке это выполняется последовательно, обычно чередуясь с UI операциями, и что с того? Почему это нельзя считать "асинхронкой"? Упр-е возвращается сразу, блокировки нет, момент окончания задачи неизвестен. И какая мне разница "отложенный вызов" или "отложенный факт получения" ?

С помощью ложного утверждения можно обосновать всё что угодно. Пример: утверждение «если дважды два равно пяти, то снег красный» является истинным. Парадокс импликации (https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D1%80%D0%B0%D0%B4%D0%BE%D0%BA%D1%81_%D0%B8%D0%BC%D0%BF%D0%BB%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8).

Осталось выяснить, чья исходная посылка "более правильная". Но это скорей всего скатится в вопрос веры и принятия/непринятие чужой веры. Если человек верит, что "инициация выполнения процедуры задачи происходит сразу же" (и, скорей всего в другом потоке, хотя в его же правильном отве про потоки не упоминается), то и пускай, значит в его мире такая вот асинхронность. У нас, получается, другая. Будем устраивать крестовые походы? :)

Ну и вообще.. неужели программистам не о чем поговорить, свалились уже в полную фигню. Грустно   :'(

Дело тут уже не в программистах, а в человеческой натуре. Люди разные, таков наш мир :).


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 14, 2018, 12:56
есть особая разновидность дебилов: "дебил эгоцентричный".
такие в силу ущербности ума, но невхерственности мифической короны на голове,
почему то думают, будто бы кто-то будет перед ними как то отмазываться.
и вообще, что-то особое делать, или думать.

правда заключается в том, что не считая твоих близких,
окружающему миру (людям) на тебя по большому счету наплевать.

Я ж говорю, молодец. Сказочный :).


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 13:05
Да, в одном потоке это выполняется последовательно, обычно чередуясь с UI операциями, и что с того? Почему это нельзя считать "асинхронкой"?

потому что противоречит самой идее асинхронного дизайна:
"ты делай спокойно свои дела, а когда твой заказ будет готов, мы тебе позвоним"

то, о чем ты сейчас написал - это тупо синхронный последовательный императив.
причем, что самое забавное:
вызывать в каком то вечном цикле кучку маленьких функций - это имитация многопоточности.
многопоточности, Карл.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Декабрь 14, 2018, 13:12

сопрограммы ортогональны асинхронному программированию.
внезапно.

Сопрогораммы реализуются посредством тех же футур. Только вместо wait() не засыпаем на мьютексе а делаем longjump в эвентлуп. А при наступлении события делаем longjump обратно.
Мне точно надо приводить пример юзания футуры?


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 13:23
Сопрогораммы реализуются посредством тех же футур. Только вместо wait() не засыпаем на мьютексе а делаем longjump в эвентлуп. А при наступлении события делаем longjump обратно.

ортогонально - значит не имеют отношения к асинхронному программированию.

ты конечно можешь привести пример-иллюстрацию
асинхронного дизайна на сопрограммах в single-thread.
я посмотрю как это у тебя получится.

Мне точно надо приводить пример юзания футуры?

откуда ты взял это своё "точно"?
я что, дал тебе повод думать, что мне нужен пример юзания футуры?

почему же ты сразу не привел пример использования сопрограммы
в контексте демонстрации асинхронного дизайна в действии,
раз уж начал говорить о них?

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



Название: Re: Igors, это ты? :)
Отправлено: ssoft от Декабрь 14, 2018, 13:26
вызывать в каком то вечном цикле кучку маленьких функций - это имитация многопоточности.
многопоточности, Карл.

Вот и корень заблуждений).

Вызывать в каком то вечном цикле динамически пополняемую кучку маленьких функций - это асинхронка.

Это асинхронка, а не многопоточность, Карл.
Асинхронка и многопоточность не тождественны, Карл.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Декабрь 14, 2018, 13:34
ортогонально - значит не имеют отношения к асинхронному программированию.

ты конечно можешь привести пример-иллюстрацию
асинхронного дизайна на сопрограммах в single-thread.
я посмотрю как это у тебя получится.


Обоже.

Код:
auto future = run(foo, arg1, arg2).then([](auto future2) {return run(bar, future2.get());}).then([](auto future3) { return run(baz, future3.get()); });
co_wait future;

если чо, подобное реализовано в как минимум одной компании.
run это аналог QtConcurrent::run только без тредпула и на тех же корутинах.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 13:36
Асинхронка и многопоточность не тождественны, Карл.

Кэп, залогинься.

Вот и корень заблуждений).
Это асинхронка, а не многопоточность, Карл.

бла бла бла.

ты можешь сказать: это - заблуждение потому что...
и далее расписать, как будет правильно.

голословные "бла бла бла" - не интересны.

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

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

поток бизнес-логики инициирует процедуру задачи,
и сразу же продолжает идти дальше по своим делам.
он никак не участвует ни в реализации, ни в исполнении этой задачи.





Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 13:44
Обоже.

Код:
auto future = run(foo, arg1, arg2).then([](auto future2) {return run(bar, future2.get());}).then([](auto future3) { return run(baz, future3.get()); });
co_wait future;

я ничего не понял.
не понятно, это что такое вообще? псевдокод?
тогда где коментарии с описанием просходящего?

если это - фрагмент реального кода,
тогда почему нет полноценного примера-иллюстрации?
где хедера, функция main,
с ссылкой на онлайн компилятор?

вот так нужно грамотно оформлять пример-иллюстрацию:

https://rextester.com/VXCE86969

Код:
// future::wait
#include <iostream>       // std::cout
#include <future>         // std::async, std::future
#include <chrono>         // std::chrono::milliseconds

// a non-optimized way of checking for prime numbers:
bool is_prime (int x) {
  for (int i=2; i<x; ++i) if (x%i==0) return false;
  return true;
}

int main ()
{
  // call function asynchronously:
  std::future<bool> fut = std::async (is_prime,194232491);

  std::cout << "checking...\n";
  fut.wait();

  std::cout << "\n194232491 ";
  if (fut.get())      // guaranteed to be ready (and not block) after wait returns
    std::cout << "is prime.\n";
  else
    std::cout << "is not prime.\n";

  return 0;
}

и сразу становится ясно и понятно, как футур используется.

теперь по аналогии приведите пример-иллюстрацию для сопрограммы.



Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 13:45
Набросал вам пример с двумя таймерами, который работает в одном потоке.

теперь набросайте, что под капотом
Код:
timer.async_wait
могу исходники boost::asio скинуть, если нужно.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 13:49
1.
ася то как раз мульти-поточная.
asio мультипоточная, когда вам надо, а когда не надо - однопоточная. :)
что за бред?

2.
под капотом системного епула так же много-поточный дизайн.
Ну конечно, ядро современных ОС мультипоточны, поэтому абсолютно все программы являются мультипоточными (даже Hello world) - ну ок. :)

не знаю откуда вы взягли своё "поэтому".
что за бред?


Я вам уже привел пример с uart, а еще есть прерывания, зеленые треды и т.д. :)
не знаю, что такое "зеленые треды и тд"
прерывания - базис, посредством которого реализуется многопоточный дизайн.

я решил, не комментировать далее голословные бла бла бла.
Ну и правильно, сложно комментировать вещи о которых вы понятия не имеете. :)

слишком жирно.

Новое поколение "специалистов", которые умеют нажать кнопочку в visual studio и дождаться появления окошка со своей прикладной программой. А что там в "компьютерах" происходит между нажатием и появлением считают магией. :)
это ты про себя что ли?
не понятно, к чему был этот дешевый понт.



Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 13:53
теперь набросайте, что под капотом
Код:
timer.async_wait
могу исходники boost::asio скинуть, нужно.
Вы их сами посмотрите. :)
А лучше скомпилируйте и посмотрите в отладчике сколько ниток запускается.

Только не нужно здесь лапотать, что ядро мультитредовое, поэтому и асинхронность примера - мультитредовая. Как выполняется пулинг в ядре исключительно детали реализации конкретного ядра. На железках без ОС пулинг легко может выполняться в том же потоке исполнения, что и бизнес логика.


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 13:58
что за бред?
Вам это кажется бредом, потому что вы не знаете что там под капотом. :)

не знаю откуда вы взягли своё "поэтому".
что за бред?
Вот и я удивляюсь, почему вы так думаете. :)

прерывания - базис, посредством которого реализуется многопоточный дизайн.
По треду уже понятно, что у вас каша в голове. :)

не понятно, к чему был этот дешевый понт.
Потому что, вы часто спорите о вещах, в которых не очень разбираетесь. Так... по вершкам прошлись у себя на вендо-десктопе и на основании этих узких познаний, спорите о фундаментальных понятиях.  :)


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 14:00
Только не нужно здесь лапотать, что ядро мультитредовое, поэтому и асинхронность примера - мультитредовая. Как выполняется пулинг в ядре исключительно детали реализации конкретного ядра. На железках без ОС пулинг легко может выполняться в том же потоке исполнения, что и бизнес логика.
зачем же лапотать?

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


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 14:05
что за бред?
Вам это кажется бредом, потому что вы не знаете что там под капотом. :)

ты там выше писал:
"asio мультипоточная, когда вам надо, а когда не надо - однопоточная"

я спрашиваю: что за бред?
это никак не связанно с тем, что там у неё под капотом.


не знаю откуда вы взягли своё "поэтому".
что за бред?
Вот и я удивляюсь, почему вы так думаете. :)

я не давал повода так думать.
ты пьяный что ли?


прерывания - базис, посредством которого реализуется многопоточный дизайн.
По треду уже понятно, что у вас каша в голове. :)

оно и видно.
такое впечателние, что ты пьян.

не понятно, к чему был этот дешевый понт.
Потому что, вы часто спорите о вещах, в которых не очень разбираетесь. Так... по вершкам прошлись у себя на вендо-десктопе и на основании этих узких познаний, спорите о фундаментальных понятиях.  :)

деццкий сад.

я, кстати, вообще никогда ни с кем не спорю,
если не имею с этого прямого профита (например - деньги)
ты бы это знал, если бы знал меня.

кстати, о вещах, в которых ты не разбираешься.

знаешь чем вообще синхронный вызов отличается от асинхронного?


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 14:10
приведи пример асинхронного дизайна
для железки которая без ОС,
где пулинг выполняется в том же потоке исполнения,
что и бизнес логика.
Поищите в интернете про Arduino и посмотрите как там это работает. Проще этого я даже не знаю что предложить. :)
Но если не разберетесь, то приходите... будем обсуждать асинхронность. :)


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 14:14
приведи пример асинхронного дизайна
для железки которая без ОС,
где пулинг выполняется в том же потоке исполнения,
что и бизнес логика.
Поищите в интернете про Arduino и посмотрите как там это работает. Проще этого я даже не знаю что предложить. :)
Но если не разберетесь, то приходите... будем обсуждать асинхронность. :)

я не хочу искать в интернете про Ардуино.
я хочу видеть твоё мнение.
твой пример-иллюстрацию.

пока что от тебя я видел только: "ты не прав".
ну так покажи, продемонстрируй как правильно.




Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 14, 2018, 14:15
Поищите в интернете про Arduino и посмотрите как там это работает. Проще этого я даже не знаю что предложить. :)

Там же будет имитация многопоточки, это же очевидно :).


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 14:25
ты там выше писал:
"asio мультипоточная, когда вам надо, а когда не надо - однопоточная"

я спрашиваю: что за бред?
это никак не связанно с тем, что там у неё под капотом.
Попробую на пальцах... :)
В asio вы сами (точнее мы сами :) ) выбираем как запускать цикл обработки событий. Можем запустить io_context::run в основном потоке, можем запустить в разных, а можем даже запустить разные контексты в разных потоках.

я не давал повода так думать.
Да ладно, это вы здесь писали, что раз ОС многопоточная, значит вся асинхронщина в ней реализуется на ней.

ты пьяный что ли?
К сожалению нет, но тут алкоголь не поможет, здесь нужно дунуть. :)


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 14:32
ты там выше писал:
"asio мультипоточная, когда вам надо, а когда не надо - однопоточная"

я спрашиваю: что за бред?
это никак не связанно с тем, что там у неё под капотом.
Попробую на пальцах... :)
В asio вы сами (точнее мы сами :) ) выбираем как запускать цикл обработки событий. Можем запустить io_context::run в основном потоке, можем запустить в разных, а можем даже запустить разные контексты в разных потоках.

и? какое отношение это имеет ко мне?
ты там выше вякнул, якобы я считаю, что , цитирую:
"asio мультипоточная, когда вам надо, а когда не надо - однопоточная"

вот это что за бред?
ты зачем мне приписываешь то, чего нет?


я не давал повода так думать.
Да ладно, это вы здесь писали, что раз ОС многопоточная, значит вся асинхронщина в ней реализуется на ней.
прохладно.
приведи пруф.
а то ведь сейчас получится, что ты мало того,
что ведешь себя, как пьяный неадекват.
так ещё и балаболка.

на людей напраслину наводишь.





Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 14:35
я хочу видеть твоё мнение.
твой пример-иллюстрацию.
А мне не хочется набирать бесполезный текст. :)
Для чего сюда тащить примеры, коих кучи в интернете. Не хотите ардуинки, наберите пример использования select/epoll.
Вот нашел для вас первый попавшийся блог с примером epoll:
Код
C++ (Qt)
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <strings.h>
#include <string.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <signal.h>
#include <iostream>
 
namespace
{
 
int setnonblocking(int sock);
void do_read(int fd);
void do_write(int fd);
void process_error(int fd);
 
}
 
int main(int argc, char* argv[])
{
const int MAX_EPOLL_EVENTS = 100;
const int BACK_LOG = 100;
 
if (argc < 2)
{
 std::cout <<  "Usage: server [port]" << std::endl;
 return 0;
}
 
char* p;
int serv_port = strtol(argv[1], &p, 10);
if (*p)
{
 std::cout << "Invalid port number" << std::endl;
 return -1;
}
 
// Игнорируем сигнал ошибки работы с сокетом
signal(SIGPIPE, SIG_IGN);
 
// Создание дескриптора epoll
int efd = epoll_create(MAX_EPOLL_EVENTS);
 
int listenfd;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd < 0)
{
 perror("Socket creation");
 return -1;
}
 
// Неблокирующий режим
setnonblocking(listenfd);
 
struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(serv_port);
 
if (bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
{
 perror("Socket bind");
 return -1;
}
 
if (listen(listenfd, BACK_LOG) < 0)
{
 perror("Socket listen");
 return -1;
}
 
// Добавляем дескриптор в массив ожидания
struct epoll_event listenev;
listenev.events = EPOLLIN | EPOLLPRI | EPOLLET;
listenev.data.fd = listenfd;
if (epoll_ctl(efd, EPOLL_CTL_ADD, listenfd, &listenev) < 0)
{
 perror("Epoll fd add");
 return -1;
}
 
socklen_t client;
// Массив готовых дескрипторов
struct epoll_event events[MAX_EPOLL_EVENTS];
struct epoll_event connev;
struct sockaddr_in cliaddr;
 
int events_cout = 1;
 
for (;;)
{
 // Блокирование до готовности одно или нескольких дескрипторов
 int nfds = epoll_wait(efd, events, MAX_EPOLL_EVENTS, -1);
 
 for (int n = 0; n < nfds; ++n)
 {
  // Готов слушающий дескриптор
  if (events[n].data.fd == listenfd)
  {
   client = sizeof(cliaddr);
   int connfd = accept(listenfd, (struct sockaddr*) &cliaddr, &client);
   if (connfd < 0)
   {
    perror("accept");
    continue;
   }
 
   // Недостаточно места в массиве ожидания
   if (events_cout == MAX_EPOLL_EVENTS-1)
   {
    std::cout << "Event array is full" << std::endl;
    close(connfd);
    continue;
   }
 
   // Добавление клиентского дескриптора в массив ожидания
   setnonblocking(connfd);
   connev.data.fd = connfd;
   connev.events = EPOLLIN | EPOLLOUT | EPOLLET | EPOLLRDHUP;
   if (!epoll_ctl(efd, EPOLL_CTL_ADD, connfd, &connev) < 0)
   {
    perror("Epoll fd add");
    close(connfd);
    continue;
   }
 
   ++events_cout;
  }
  // Готов клиентский дескриптор
  else
  {
   // Выполням работу с дескриптором
   int fd = events[n].data.fd;
 
   if (events[n].events & EPOLLIN)
    do_read(fd);
 
   if (events[n].events & EPOLLOUT)
    do_write(fd);
 
   if (events[n].events & EPOLLRDHUP)
    process_error(fd);
 
   // В даннoм примере дескриптор просто закрывается и удаляется из массива ожидания.
   // В зависимости от логики работы можно не удалять дескриптор и подождать следующую порцию данных
   epoll_ctl(efd, EPOLL_CTL_DEL, fd, &connev);
   --events_cout;
   close(fd);
  }
 }
}
 
return 0;
}
 
namespace
{
 
int setnonblocking(int sock)
{
 int opts;
 
 opts = fcntl(sock,F_GETFL);
 if (opts < 0)
 {
  perror("fcntl(F_GETFL)");
  return -1;
 }
 opts = (opts | O_NONBLOCK);
 if (fcntl(sock,F_SETFL,opts) < 0)
 {
  perror("fcntl(F_SETFL)");
  return -1;
 }
 
 return 0;
}
 
void do_read(int fd)
{
 std::cout << "do_read" << std::endl;
}
 
void do_write(int fd)
{
 std::cout << "do_write" << std::endl;
}
 
void process_error(int fd)
{
 std::cout << "process_error" << std::endl;
}
}
 
Вот функции do_read, do_write, process_error будут вызываются асинхронно.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 14:45
Вот функции do_read, do_write, process_error будут вызываются асинхронно.

у вас тут бизнес-логика в вечном цикле стопориться на блокирующем вызове:

Код:
 for (;;)
 {
  // Блокирование до готовности одно или нескольких дескрипторов
  int nfds = epoll_wait(efd, events, MAX_EPOLL_EVENTS, -1);

зачем вы приводите в качестве примера блокирующую функцию,
для примера иллюстрации асинхронного дизайна?

вы так и не ответили:
вы знаете чем различаются синхронный и асинхронный вызовы?


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 14:48
и? какое отношение это имеет ко мне?
ты там выше вякнул, якобы я считаю, что , цитирую:
"asio мультипоточная, когда вам надо, а когда не надо - однопоточная"

вот это что за бред?
ты зачем мне приписываешь то, чего нет?
Вы еще и читаете плохо или понимаете?
Это вы здесь утверждали, что asio исключительно мультитредовая, я вас поправил, что это не так. asio прекрасно умеет работать в одном потоке, и даже привел компилябельный пример с таймерами. :)

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

на людей напраслину наводишь.

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

Вы считаете системный вызов - многопоточкой. Почему, не знаю.

И здесь:

а асинхронный ввод/вывод конечно же реализуется не на многопоточке, да?
Конечно нет, она реализуется на эвентлупе (select/poll/epoll/kqueue)
которые реализуются за счет многопоточки. Карл.


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 14:54
зачем вы приводите в качестве примера блокирующую функцию,
для примера иллюстрации асинхронного дизайна?
Это первый попавшийся блог. Считайте что там вместо -1 -> 0, и в цикле обрабатываются события бизнес-логики.
К демонстрации асинхронных операций чтения/записи это отношение не имеет.

вы знаете чем различаются синхронный и асинхронный вызовы?
Я то знаю. :)


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Декабрь 14, 2018, 15:05
вы знаете чем различаются синхронный и асинхронный вызовы?
Я то знаю. :)

Можно бы еще одно умное слово добавить: Concurrency, но что-то опасаюсь. Тут с двумя категориями такая буча поднялась, а с тремя комбинаторика увеличится, может переполнение стека случиться :).


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 15:06
Вы еще и читаете плохо или понимаете?
я прекрасно читаю и понимаю.

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

ты лжёшь.
и не сможешь привести пруф,
где я утверждал бы, ася - исключительно мультитредовая.

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

Вы считаете системный вызов - многопоточкой. Почему, не знаю.
ты русский текст что ли читать не умеешь?

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


а асинхронный ввод/вывод конечно же реализуется не на многопоточке, да?
Конечно нет, она реализуется на эвентлупе (select/poll/epoll/kqueue)
которые реализуются за счет многопоточки. Карл.


и?
причем тут:
"Да ладно, это вы здесь писали, что раз ОС многопоточная, значит вся асинхронщина в ней реализуется на ней."
?

с чего ты взял свои "значит" ?







Название: Re: Igors, это ты? :)
Отправлено: ssoft от Декабрь 14, 2018, 15:09
Ну может это поможет).
https://codewala.net/2015/07/29/concurrency-vs-multi-threading-vs-asynchronous-programming-explained/
Больше не знаю, как ещё объяснять. Да и желания нет уже.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 15:10
Я то знаю. :)

да не похоже, что вы знаете.

вот если человек знает, чем отличается синхронный вызов от асинхронного,
разве станет он в качестве примера асинхронного дизайна
приводить блокирующую функцию?


тут одно из двух: либо нифига он не знает, либо.. он какой то неадекват.
может пьяный? а может дебил.


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 15:12
ты лжёшь.
и не сможешь привести пруф,
где я утверждал бы, ася - исключительно мультитредовая.

Как то я уже сомневаюсь в вашей адекватности. :(

Конечно могу, посмотрите любой пример из boost.asio использующий async функции. Ту же демку с таймерами. Он выполняется в одном потоке и это легко проверить в любом отладчике.
1.
ася то как раз мульти-поточная.

2.
под капотом системного епула так же много-поточный дизайн.

Тут и про asio и про epoll.

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

и?
причем тут:
"Да ладно, это вы здесь писали, что раз ОС многопоточная, значит вся асинхронщина в ней реализуется на ней."
?

с чего ты взял свои "значит" ?
Выше ваши слова про epoll. Из нее следует, что работа с epoll в одном потоке все равно является многопоточкой.


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Декабрь 14, 2018, 15:14
Предлагаю переименовать тему в "_Bers, это ты?"  ;)


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Декабрь 14, 2018, 15:15
По сабжу, эвентлуп он как бы всегда ждет пояления новых событий. Ждать без блокирующего вызова сложно. Нет, можно, конечно, молотить в цикле пока комната не прогреется...


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 15:15
вот если человек знает, чем отличается синхронный вызов от асинхронного,
разве станет он в качестве примера асинхронного дизайна
приводить блокирующую функцию?
Я вам уже написал, что это первый попавшийся блог. Замените -1 на 0, если знаете где, и вызов уже будет не блокирующим.
Но вы этого уже не читаете, вам сказать нечего.
Вся работа с epoll может проходить в одном потоке и быть асинхронной. А вы доказываете, что это не возможно. :)


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 15:17
По сабжу, эвентлуп он как бы всегда ждет пояления новых событий. Ждать без блокирующего вызова сложно. Нет, можно, конечно, молотить в цикле пока комната не прогреется...
В этом цикле можно не просто молотить, но еще и обрабатывать другие события.

А на счет переименования темы - я за. :)


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Декабрь 14, 2018, 15:23
В этом цикле можно не просто молотить, но еще и обрабатывать другие события.


Или уведомлять eпулл через eventfd о других событиях и таки ждать=)


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 15:27
Или уведомлять eпулл через eventfd о других событиях и таки ждать=)

Вот вам:  ;D
разве станет он в качестве примера асинхронного дизайна
приводить блокирующую функцию?


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 15:34
ты лжёшь.
и не сможешь привести пруф,
где я утверждал бы, ася - исключительно мультитредовая.
Как то я уже сомневаюсь в вашей адекватности. :(

да мне пофигу твои сомнения.
где пруф?
почему не приводишь?

стало быть, ты балаболка?

Выше ваши слова про epoll. Из нее следует, что работа с epoll в одном потоке все равно является многопоточкой.

ты дурак что ли?
как то по особенному русский текст воспринимаешь?

из моих слов следует, что под капотом epoll многопоточка.

специально для тех кто в танке:
твоё приложение может быть однопоточным.
система многопоточная.
на уровне ядра системы - многопоточность во все поля.




Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 15:40
да мне пофигу твои сомнения.
где пруф?
почему не приводишь?
Так под этим моим предложение как раз ваши цитаты находятся. :)

из моих слов следует, что под капотом epoll многопоточка.

специально для тех кто в танке:
твоё приложение может быть однопоточным.
система многопоточная.
на уровне ядра системы - многопоточность во все поля.
Ага, значит пример с epoll - асинхронка.
А теперь замените epoll на проверку регистра с данными от uart и вызовом функции обработки при наличии, которое выполняется на микроконтроллере без ОС. Это уже будет не асинхронка?


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 15:40
Вся работа с epoll может проходить в одном потоке и быть асинхронной. А вы доказываете, что это не возможно. :)

я ничего тебе не доказываю (нафиг ты мне нужен)

я утверждаю, что ты - лжёшь.
и не сможешь привести пример такой работы.

ты вот оказывается не в курсе, поэтому, я решил тебя посвятить.
блокирующая функция с ожиданием результата своей работы - это не асинхронный дизайн.

не нужно в качестве примера асинхронного дизайна
приводить блокирующе-ожидающие функции.




Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 15:41
ты вот оказывается не в курсе, поэтому, я решил тебя посвятить.
блокирующая функция с ожиданием результата своей работы - это не асинхронный дизайн.
Ну вот, асинхронка значит не правильная. Ну ладно.  ;D


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 15:46
Так под этим моим предложение как раз ваши цитаты находятся. :)

да хватит врать то уже.

это же интернет.
все цитаты - они тут, в этой теме.
ничего ты не приводил.
потому что приводить нечего.

А теперь замените epoll на проверку регистра с данными от uart и вызовом функции обработки при наличии, которое выполняется на микроконтроллере без ОС. Это уже будет не асинхронка?

не могу.
я не знаю, что такое uart
ты замени.
и покажи результат.
там и будем смотреть.
асинхронка или нет.



Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 14, 2018, 15:49
По сабжу, эвентлуп он как бы всегда ждет пояления новых событий.

так ежели он всегда ждёт, стало быть с single-thread вообще никак не совместим?

Нет, можно, конечно, молотить в цикле пока комната не прогреется...

только это уже не асинхронный дизайн.


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 15:55
так ежели он всегда ждёт, стало быть с single-thread вообще никак не совместим?
Это еще почему? :)
Если работы нет, тред спит. Если работа появилась - тред просыпается, выполняет обработчик и снова засыпает в ожидании другой работы. Асинхронка же. :)


Название: Re: Igors, это ты? :)
Отправлено: Old от Декабрь 14, 2018, 16:01
да хватит врать то уже.

это же интернет.
все цитаты - они тут, в этой теме.
ничего ты не приводил.
потому что приводить нечего.
Вот-вот, я и привел кликабельные цитаты на ваши сообщения из этой темы. Почитайте.

я не знаю, что такое uart
Вы не знаете это, не знаете то. А мне нужно все вам разжевать и показать... сами учитесь.

там и будем смотреть.
асинхронка или нет.
Ваше мнение по этому вопросу не очень интересно. С тем же успехом асинхронку можно обсуждать и с балериной. :)

Но все равно спасибо, вы сделали мой день.  ;D


Название: Re: Igors, это ты? :)
Отправлено: Авварон от Декабрь 14, 2018, 16:13
Но все равно спасибо, вы сделали мой день.  ;D

Да, такого горения форум давно не видывал.


Название: Re: Igors, это ты? :)
Отправлено: m_ax от Декабрь 14, 2018, 21:36
Но все равно спасибо, вы сделали мой день.  ;D

Да, такого горения форум давно не видывал.
Ой, поверьте мне, это ещё не горение  :) Хотя для Russian Qt Forum, возможно, и да)

Но чисто на мой дилетантский взгляд, здесь типичная проблема чисто понятийного недопонимания, раздутая, (подчёркиваю на мой взгляд) гипертрофированным перфекционизмом товарища _Bers  :) Прще надо быть  :)


Название: Re: Igors, это ты? :)
Отправлено: Racheengel от Декабрь 15, 2018, 03:07
тут еще можно поговорить про источники синхросигналов для обеспечения синхронной обработки вызовов и ответов.
набросил,не?


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 26, 2018, 11:24
так ежели он всегда ждёт, стало быть с single-thread вообще никак не совместим?
Это еще почему? :)
Если работы нет, тред спит. Если работа появилась - тред просыпается, выполняет обработчик и снова засыпает в ожидании другой работы. Асинхронка же. :)

потому что в сингле-тред тред никогда не спит.
ваш К. О.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 26, 2018, 11:26
Вот-вот, я и привел кликабельные цитаты на ваши сообщения из этой темы. Почитайте.

и где же твои кликабельные цитаты, врушка?



Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 26, 2018, 11:43
Но чисто на мой дилетантский взгляд, здесь типичная проблема чисто понятийного недопонимания, раздутая, (подчёркиваю на мой взгляд) гипертрофированным перфекционизмом товарища _Bers  :)

нет здесь никакой проблемы.
есть идиотизм некоторых дураков.
которые не разумеют простых вещей.

асинхронный дизайн:
"ты занимайся своими делами. а мы сделаем свою работу в фоне, и когда работа будет сделана, мы тебе позвоним".

вот и вся идея асинхронного дизайна.

очень простая для понимания, эксплуатации, и реализации.


очевидно жеж,
что невозможно делать в одном треде две работы одновременно.

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


Прще надо быть  :)

и простейшие потянутся?


Название: Re: Igors, это ты? :)
Отправлено: Igors от Декабрь 26, 2018, 12:28
асинхронный дизайн:
"ты занимайся своими делами. а мы сделаем свою работу в фоне, и когда работа будет сделана, мы тебе позвоним".
Весьма "художественная" формулировка (не техническая). Разве "фон" - обязательно др нитка? А уж "позвоним" - что это? Callbаck выполняемый в "interrupt time" как в старых ОС, что ли? Ну так уже лет 20 никто не делает, т.к. сигнал/событие куда удобнее.

очевидно жеж,
что невозможно делать в одном треде две работы одновременно.

а крутить вечный цикл, греть процессор,
и каждый раз чего то там вручную чекать - это обычный процедурный императив.
Так делали много лет. Это сейчас каждый засранец "потоки создает", а раньше связаться с MP API было отнюдь не просто. И прекрасно обходились таймером. Да и сейчас по меньшей мере добрая половина того что бездумно "выносится в поток" может быть сделана на таймере проще и лучше.

нет здесь никакой проблемы.
есть идиотизм некоторых дураков.
которые не разумеют простых вещей.
Ну допустим даже Вы объективно правы (хотя я так не считаю). И что Вы хотите? Убедить дураков в своей правоте? Поверьте, это Вам точно не удастся  :)  Зачем грубить, опускаться до быдластого тыкания и лепить десятки глупых постов? Не понимают они как правильно - ну и пусть не понимают, им же хуже  :) Если разговор свалился в эту плоскость - никто уже ничего не докажет.


Название: Re: Igors, это ты? :)
Отправлено: _Bers от Декабрь 26, 2018, 17:59
Весьма "художественная" формулировка (не техническая). Разве "фон" - обязательно др нитка?
разумеется да.
или как ещё хотя бы просто теоретически возможно обеспечить "неблокирующий" вызов,
и параллельное исполнение какой либо процедуры?

А уж "позвоним" - что это? Callbаck выполняемый в "interrupt time" как в старых ОС, что ли?
коллбек.
вызывается в момент, когда обещанная работа сделана.
При этом, работа основного приложения не останавливается.

Это важный момент.
Я ещё раз подчеркну: работа основного приложения не останавливается

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

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

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

Так делали много лет.
а ещё много лет не было мульти-ядерных процессоров.
и винды много лет не было.
и линуксов тоже не было.
и вообще, ничего толком не было, кроме стрёмного доса.

и что?
какое это имеет отношение к теме "асинхронного дизайна"?


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

И что Вы хотите?
конкретно от тебя - ничего.

Убедить дураков в своей правоте?
плевать мне на дураков.

Зачем грубить
я никому тут не грубил.
вот если человек врет, я называю его лжецом. врушкой. ну или балаболкой.
это - не грубость. это - констатация факта.

опускаться до быдластого тыкания

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


и лепить десятки глупых постов?

а зачем ты лепишь десятки глупых постов?
и зачем реагируешь на посты, которые считаешь глупыми?

вопросы риторические.



Название: Re: Igors, это ты? :)
Отправлено: Igors от Декабрь 27, 2018, 10:12
и зачем реагируешь на посты, которые считаешь глупыми?
Ну потому что я считал Вас человеком с которым интересно поговорить  :)


Название: Re: Igors, это ты? :)
Отправлено: kambala от Апрель 01, 2019, 14:45
https://habr.com/ru/post/445676/#comment_19968252
Цитировать
20-25 лет назад проект писался максимум тремя программистами на языках для мальчиков и был вылизан до блеска, всё что нужно было — архивирование версий перед крупными доработками, больше для сохранности. Теперь по три сотни программистов пишут свои кривые косяки, используя кривые же библиотеки, путаясь в версиях не только собственных ляпов, но и в версиях багов и «особенностей» библиотек. В итоге на выходе имеем совершенно тривиальные задачи, решённые всё более нетривиальными способами со всё убывающей нагрузочной способностью, релизы софта, год от года становящиеся всё более глючными, обрастающими ненужным функционалом с катастрофически убывающей юзабилити.
И вместо трёх программистов теперь 350 вынужденных инвалидов, решающих больше проблему состоятельности методов решения проблемы, нежели саму проблему.
Я знал, что доживу до времен, когда как программист стану более не нужен на рынке, не знал только, что времена эти наступят при моей еще жизни.


Название: Re: Igors, это ты? :)
Отправлено: ViTech от Апрель 01, 2019, 16:13
Цитировать
И вместо трёх программистов теперь 350 вынужденных инвалидов, решающих больше проблему состоятельности методов решения проблемы, нежели саму проблему.
Я знал, что доживу до времен, когда как программист стану более не нужен на рынке, не знал только, что времена эти наступят при моей еще жизни.

Рано этот программист себя с рынка списывает. Если он с парой собутратников могут реализовать проект, который 300 человек пилят, то есть вероятность получить за него в 100 раз больше денег. И системы контроля версий - они для слабаков, которые не могут сразу нормальный код писать, а возятся со всякими коммитами, ветками, слияниями и прочей ерундой. Таким даже прорывные возможности замыканий в Git не помогут. Слабаки - что с них взять... Прикинул в голове архитектуру продукта, закодировал сразу конечный вариант и всё! Делов-то.