Re[54]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 21:27
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>"Ты в начало треда посмотри и заметишь" что запрошенного примера на C# нет до сих пор

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

Какой именно вопрос? который ты задал после запрошенного примера на C#?

I>Ты напоказывал вагоны кода, которые тебя никто вообще не просил и так и не дал ответа на поставленый вопрос.

EP>>Покажи версию без корутин на C++ — я её переделаю на корутины. А то ты опять будешь кричать что это не "асинхронщина".
EP>>[/q]
I>Вот еще пример — я показал код со Sleep и все на этом закончилось.

Тех примеров что я показал — достаточно. Ты не показал ни одного запрошенного примера

EP>>и если после этого тебе мерещатся заблокированные ui-loop-ы — то как-то совсем печально

I>Ты сам сказал, что getline блокирующий

вызов getline из foo — блокирующий, вызов корутины, которая его содержит — нет
Re[53]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 21:29
Оценка: :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>Вызов getline, с точки зрения метода foo, очевидно блокирующий

I>>Правильно, и с чем ты спорил ?

EP>Где?

EP>Я сразу сказал
Автор: Evgeny.Panasyuk
Дата: 21.06.13
:

EP>

EP>На stackless coroutine такая инкапсуляция не получится — асинхронные кишки будут торчать в клиентском коде, ибо такие сопроцедуры (без асинхронных кишок в клиентском коде) сразу возвращают управление в клиентский код — а это значит что либо данные ещё не получены, либо никакой асинхронности, так как только один поток.


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

I>>Представь — стрим заснул на пол-часа, нет данных. Что будет с UI ?


EP>стрим async_something
Автор: Evgeny.Panasyuk
Дата: 29.06.13
заснул на пол-часа, нет данных minimize'а. Что будет с UI ? UI — не висит.


Висит, потому что getline — блокирующий.
Re[54]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 21:35
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Представь — стрим заснул на пол-часа, нет данных. Что будет с UI ?

EP>>стрим async_something
Автор: Evgeny.Panasyuk
Дата: 29.06.13
заснул на пол-часа, нет данных minimize'а. Что будет с UI ? UI — не висит.

I>Висит, потому что getline — блокирующий.

EP>>строчка await async_download:
EP>>

EP>>await async_download(address);
EP>>on_completion();
EP>>

EP>>также выполняется синхронно?
I>Разумеется. Толко эта хрень не блокирует message pump. Странно, да ?


getline — блокирующий, "толко не блокирует UI. Странно, да ?"
Re[55]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 21:36
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


EP>Какой именно вопрос? который ты задал после запрошенного примера на C#?


Тот самый, про getline и message pump.

I>>Вот еще пример — я показал код со Sleep и все на этом закончилось.


EP>Тех примеров что я показал — достаточно. Ты не показал ни одного запрошенного примера


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

EP>>>и если после этого тебе мерещатся заблокированные ui-loop-ы — то как-то совсем печально

I>>Ты сам сказал, что getline блокирующий

EP>вызов getline из foo — блокирующий, вызов корутины, которая его содержит — нет


Ну так покажи наконец такую инкапсуляцию, что бы ничего не торчало наружу, то asynchronous торчит, то какая то короутина, то yield после вызова метода.
Вроде ж все просто был — "можно инкапсулировать", однако, шота все время чтото торчит — то одно, то другое, то третье.
Беда какая то — getline Блокирующий, значит нужна короутина что бы сделать неблокирующий вызов. getline неблокирующий — снова нужно чего то написать, что бы сделать блокирующий код.
Когда же ты наконец покажешь именно то что обещал ("код будет одинаковым в обоих случаях") ?
Re[55]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 21:37
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>

EP>>>строчка await async_download:
EP>>>

EP>>>await async_download(address);
EP>>>on_completion();
EP>>>

EP>>>также выполняется синхронно?
I>>Разумеется. Толко эта хрень не блокирует message pump. Странно, да ?


EP>getline — блокирующий, "толко не блокирует UI. Странно, да ?"


Ну ка, выдели мне в этом коде getline , чтото я плохо видеть стал.
Re[56]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 21:39
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>>>Представь — стрим заснул на пол-часа, нет данных. Что будет с UI ?

EP>>>>стрим async_something
Автор: Evgeny.Panasyuk
Дата: 29.06.13
заснул на пол-часа, нет данных minimize'а. Что будет с UI ? UI — не висит.

I>>>Висит, потому что getline — блокирующий.
EP>>

EP>>>>строчка await async_download:
EP>>>>

EP>>>>await async_download(address);
EP>>>>on_completion();
EP>>>>

EP>>>>также выполняется синхронно?
I>>>Разумеется. Толко эта хрень не блокирует message pump. Странно, да ?

EP>>getline — блокирующий, "толко не блокирует UI. Странно, да ?"
I>Ну ка, выдели мне в этом коде getline , чтото я плохо видеть стал.

getline в сообщении
Re[56]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 21:45
Оценка:
Здравствуйте, Ikemefula, Вы писали:

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

EP>>Какой именно вопрос? который ты задал после запрошенного примера на C#?
I>Тот самый, про getline и message pump.

ну да, который задан после примера который ты так и не осилил показать

I>>>Вот еще пример — я показал код со Sleep и все на этом закончилось.


EP>>Тех примеров что я показал — достаточно. Ты не показал ни одного запрошенного примера

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

вопросы заданны после запрошенного примера. примера нет до сих пор

I>Беда какая то — getline Блокирующий, значит нужна короутина что бы сделать неблокирующий вызов. getline неблокирующий — снова нужно чего то написать, что бы сделать блокирующий код.

I>Когда же ты наконец покажешь именно то что обещал ("код будет одинаковым в обоих случаях") ?

http://www.rsdn.ru/forum/philosophy/5211729.1
Автор: Evgeny.Panasyuk
Дата: 26.06.13
Re[50]: Что посоветуете как аналог С++
От: alex_public  
Дата: 07.07.13 23:13
Оценка:
Здравствуйте, Ikemefula, Вы писали:

_>>Ещё раз, у нас есть функция Read(buf, callback). Такое частенько встречается. Сама функция не блокирующая, но и не возвращает никаких значений (типа Task). И так, await чего мы тут будем вызывать, что бы код следующий за Read вызвался внутри callback и обработал buf?

I>Значит будет возвращать Task и делать ему await, не вижу принципиальной разницы. Если сравнивать построчно, то можно дойти до того что "В С++ нет using, finally а в С# нет деструкторов"

Ну так покажи как преобразовать void Read(byte* buf, func callback) (которая нам дана извне, например от ОС) в Task MyRead(byte* buf). Я пока не очень представляю как это сделать в C#.
Re[51]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 07:50
Оценка:
Здравствуйте, alex_public, Вы писали:

_>>>Ещё раз, у нас есть функция Read(buf, callback). Такое частенько встречается. Сама функция не блокирующая, но и не возвращает никаких значений (типа Task). И так, await чего мы тут будем вызывать, что бы код следующий за Read вызвался внутри callback и обработал buf?

I>>Значит будет возвращать Task и делать ему await, не вижу принципиальной разницы. Если сравнивать построчно, то можно дойти до того что "В С++ нет using, finally а в С# нет деструкторов"

_>Ну так покажи как преобразовать void Read(byte* buf, func callback) (которая нам дана извне, например от ОС) в Task MyRead(byte* buf). Я пока не очень представляю как это сделать в C#.


Чуть более чем все функции OS в таком вот виде и ничего, как то живут люди
Re[57]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 07:55
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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

EP>>>Какой именно вопрос? который ты задал после запрошенного примера на C#?
I>>Тот самый, про getline и message pump.

EP>ну да, который задан после примера который ты так и не осилил показать


Я все ще жду ответа на самый первый свой вопрос

EP>>>Тех примеров что я показал — достаточно. Ты не показал ни одного запрошенного примера

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

И не будет, потому что я не получил ответа на свой первый вопрос.

I>>Беда какая то — getline Блокирующий, значит нужна короутина что бы сделать неблокирующий вызов. getline неблокирующий — снова нужно чего то написать, что бы сделать блокирующий код.

I>>Когда же ты наконец покажешь именно то что обещал ("код будет одинаковым в обоих случаях") ?

EP>http://www.rsdn.ru/forum/philosophy/5211729.1
Автор: Evgeny.Panasyuk
Дата: 26.06.13


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

Собтсвенно это и есть асинхронщина, а не то что "там, унутре все шоколадно".
Re[57]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 07:57
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>

EP>>>>>строчка await async_download:
EP>>>>>

EP>>>>>await async_download(address);
EP>>>>>on_completion();
EP>>>>>

EP>>>>>также выполняется синхронно?
I>>>>Разумеется. Толко эта хрень не блокирует message pump. Странно, да ?

EP>>>getline — блокирующий, "толко не блокирует UI. Странно, да ?"
I>>Ну ка, выдели мне в этом коде getline , чтото я плохо видеть стал.

EP>getline в сообщении


Очень интересно, про getline приводить код в котором ничего про getline нет.
Re[54]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 08.07.13 08:32
Оценка: 8 (1)
Здравствуйте, Ikemefula, Вы писали:

I>>>Представь — стрим заснул на пол-часа, нет данных. Что будет с UI ?

EP>>стрим async_something
Автор: Evgeny.Panasyuk
Дата: 29.06.13
заснул на пол-часа, нет данных minimize'а. Что будет с UI ? UI — не висит.

I>Висит, потому что getline — блокирующий.

Надеюсь такого bullshit'а про подвисший UI больше не будет после очередного ликбеза:

#include <boost/iostreams/categories.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/coroutine/all.hpp>

#include <functional>
#include <istream>
#include <memory>
#include <cwchar>

using namespace boost;
using namespace std;

#include <windows.h>

typedef function<void(wchar_t)> CharHandler;
CharHandler on_char;
HWND main_hwnd;

template<typename F>
void async_read(F f)
{
    on_char = f;
}

typedef coroutines::coroutine<void()> Coro;
typedef std::shared_ptr<Coro> shared_coro;

struct DataSource
{
    typedef wchar_t char_type;
    typedef iostreams::source_tag category;

    Coro::caller_type &ca;
    const shared_coro *coro;

    std::streamsize read(wchar_t* s, streamsize n) 
    {
        if(n==0) return 0;
        auto &&sc = *coro;
        async_read([s, sc, this](wchar_t ch)
        {
            s[0] = ch;
            coro = &sc;
            (*sc)();
        });
        ca();
        return 1;
    }
};
typedef iostreams::stream<DataSource> InputStream;

void foo(wistream &client_stream)
{
    wstring msg;
    do
    {
        getline(client_stream, msg);
        SendMessage(main_hwnd, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(msg.c_str()));
    } while(msg != L"exit");
}

void task()
{
    auto &&coro = make_shared<Coro>();
    *coro = Coro([&coro](Coro::caller_type &ca)
    {
        DataSource source = {ca, &coro};
        InputStream client_stream(source);
        foo(client_stream);
    });
}

LRESULT CALLBACK window_procedure(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param)
{
    switch (msg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
       case WM_SIZE:
            if(w_param == SIZE_MAXIMIZED)
            {
                static auto once = []{ return task(), 1; }();
            } break;
        case WM_CHAR:
            if(on_char)
            {
                wchar_t ch = w_param;
                auto handler = on_char;
                on_char = CharHandler();
                handler(ch == L'\x0D'? L'\n' : ch);
            } break;
    }
    return DefWindowProc(hwnd, msg, w_param, l_param);
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
    WNDCLASS wincl = {};
    wincl.hInstance = hInstance;
    wincl.lpszClassName = TEXT("SFC");
    wincl.lpfnWndProc = window_procedure;
    RegisterClass(&wincl);

    main_hwnd = CreateWindow(wincl.lpszClassName, TEXT(""), WS_OVERLAPPEDWINDOW, 0, 0, 400, 100, 0, 0, hInstance, 0);
    ShowWindow(main_hwnd, nCmdShow);

    MSG msg;
    while(GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

По первому maximazed запускается foo, которая считывает пользовательский ввод в цикле. После нажатия Enter, строка выводится в окно.
И никакого подвисшего UI
Re[55]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 10:17
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Надеюсь такого bullshit'а про подвисший UI больше не будет после очередного ликбеза:

EP>void task()
EP>{
EP>    auto &&coro = make_shared<Coro>();
EP>    *coro = Coro([&coro](Coro::caller_type &ca)
EP>    {
EP>        DataSource source = {ca, &coro};
EP>        InputStream client_stream(source);
EP>        foo(client_stream);
EP>    });
EP>}


EP>И никакого подвисшего UI


Не совсем понятно зачем тебе сотня строк, если хватило бы и десяти
В таком виде я согласен, что UI не будет блокироваться, так что вопрос снят. Но теперь во всю торчат уши асинхронщины, хотя ты был себя пяткой в грудь что ничо нигде не торчит Такшта дело за малым — упаковать всё это библиотеку, шоб вообще никаких ушей не осталось, а то мне интересно, как без этих самых ушей одна и та же строчка может быть как блокирующей, так и неблокирующей.
Re[56]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 08.07.13 11:07
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Не совсем понятно зачем тебе сотня строк, если хватило бы и десяти


Большую часть кода я скопировал из примеров которые приводил выше — ничего принципиально нового в этот пример я не добавил. async_something превратился в async_read, в foo по очевидным причинам istream заменился на wistream, cout на SendMessage WM_SETTEXT, и т.п.

I>Но теперь во всю торчат уши асинхронщины, хотя ты был себя пяткой в грудь что ничо нигде не торчит


Весь асинхронный stuff размещается на двух концах call stack'а — в начале, где запускается корутина, и в конце, где делается yield. Между ними может быть сколько угодно уровней кода не использующих никаких асинхронных конструкций.
В примере выше task может вызывать не foo, а bar, который вызывает baz, который вызывает qux, который вызывает foo — и ни в одной из этих функций не торчат "уши асинхронщины". На await, stackless coroutine, etc — так не получится.

Более того, можно взять обычное консольное приложение использующие std::cin/cout, сделать некоторые изменения в main — и приложение превратится в сервер на асинхронных сокетах. (очевидно на код налагаются некоторые ограничениями на использование глобального состояния)
Re[52]: Что посоветуете как аналог С++
От: alex_public  
Дата: 08.07.13 12:07
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Чуть более чем все функции OS в таком вот виде и ничего, как то живут люди


Т.е. ответа не будет... Понятно)))
Re[57]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 12:13
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>Но теперь во всю торчат уши асинхронщины, хотя ты был себя пяткой в грудь что ничо нигде не торчит


EP>Весь асинхронный stuff размещается на двух концах call stack'а — в начале, где запускается корутина, и в конце, где делается yield. Между ними может быть сколько угодно уровней кода не использующих никаких асинхронных конструкций.

EP>В примере выше task может вызывать не foo, а bar, который вызывает baz, который вызывает qux, который вызывает foo — и ни в одной из этих функций не торчат "уши асинхронщины". На await, stackless coroutine, etc — так не получится.

Правильно, потому что вся эта цепочка становится блокирующей. Блокирующие функции в C# не требуют никаких await, что бы получить аналог такого getline нужны всего лишь нелокальные переходы.

EP>Более того, можно взять обычное консольное приложение использующие std::cin/cout, сделать некоторые изменения в main — и приложение превратится в сервер на асинхронных сокетах. (очевидно на код налагаются некоторые ограничениями на использование глобального состояния)


А это уже кооперативная многозадачность, но тебе почему то удобно называть это асинхронщиной на том основании что "унутре така неонка". Эдак Console.WriteLine можно назвать асинхронщиной, на том основании что таймер будет срабатывать как положено.
Re[53]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 12:21
Оценка:
Здравствуйте, alex_public, Вы писали:

I>>Чуть более чем все функции OS в таком вот виде и ничего, как то живут люди


_>Т.е. ответа не будет... Понятно)))


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

Нет у тебя никаких чудес — указатель и колбек. И то и другое нормально дружит с интеропом. Остается самое малое — связать колбек и тпл.
Re[54]: Что посоветуете как аналог С++
От: alex_public  
Дата: 08.07.13 12:52
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ты пойми простую вещь, на C# я уже не пишу, а TPL знаю не так хорошо, что бы быстро накидать код который будет работать в твоем случае.


I>Нет у тебя никаких чудес — указатель и колбек. И то и другое нормально дружит с интеропом. Остается самое малое — связать колбек и тпл.


Эээ речь вообще о другом. То, что подобную функцию можно без проблем использовать из C# я даже не сомневаюсь... Вопрос в том, чтобы сделать линеаризацию кода (код обрабатывающий буфер расположен прямо после вызова этой функции), работающего с этой функцией. С помощью Boost.Coroutine это делается без проблем. А вот с помощью await/async я лично не особо представляю как можно подобное сделать.
Re[55]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.07.13 13:33
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Эээ речь вообще о другом. То, что подобную функцию можно без проблем использовать из C# я даже не сомневаюсь... Вопрос в том, чтобы сделать линеаризацию кода (код обрабатывающий буфер расположен прямо после вызова этой функции), работающего с этой функцией. С помощью Boost.Coroutine это делается без проблем. А вот с помощью await/async я лично не особо представляю как можно подобное сделать.


после того, как врапнется в task, будет вот такое
buffer = await Read();
Re[58]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 08.07.13 14:04
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>В примере выше task может вызывать не foo, а bar, который вызывает baz, который вызывает qux, который вызывает foo — и ни в одной из этих функций не торчат "уши асинхронщины". На await, stackless coroutine, etc — так не получится.

I>Правильно, потому что вся эта цепочка становится блокирующей.

Снаружи вызов такой цепочки не блокирующий.

I>Блокирующие функции в C# не требуют никаких await, что бы получить аналог такого getline нужны всего лишь нелокальные переходы.


.. которых нет, о чём и речь.
Хотя, ты же что-то пытался показать, аж 3 варианта :

I>Итак, поскольку сегодня ты наконец согласился, что в твоем коде ничего кроме нелокальных переходов нет, то все нужно это заюзать нелокальные переходы из С#

void foo(Stream stream)
{
    string msg;
    do
    {
        msg = getline(stream);
        Trace.WriteLine(msg); 
    } while(msg != "exit");
}

Вариант 1: генераторы
(skipped)
Вариант 3: эвенты
(skipped)
Вариант 3: олдскульноее ООП, которое есть даже в Джаве, Джаваскрипте и где угодно
(skipped)


EP>>Более того, можно взять обычное консольное приложение использующие std::cin/cout, сделать некоторые изменения в main — и приложение превратится в сервер на асинхронных сокетах. (очевидно на код налагаются некоторые ограничениями на использование глобального состояния)

I>А это уже кооперативная многозадачность, но тебе почему то удобно называть это асинхронщиной на том основании что "унутре така неонка". Эдак Console.WriteLine можно назвать асинхронщиной, на том основании что таймер будет срабатывать как положено.

1. Если цепочка будет сделана на явных await'ах, и async'ах, вместо спрятанных yield'ов — то внезапно это становится асинхронщинной?
2. Какая разница какой именно термин? С использованием stackful coroutine так можно сделать, а с stackless-like (await, one-level yield) — нет.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.