рдЖрдорддреМрд░ рдкрд░, рдРрд╕реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╡реЗ "C ++ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ / async рдХрд╛ рдПрдирд╛рд▓реЙрдЧ" рдлреЙрд░реНрдо рдХрд╛ рд╢реАрд░реНрд╖рдХ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдХреА рд╕рд╛рдордЧреНрд░реА рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХрд╣реАрдВ рдФрд░ рдкреЛрд╕реНрдЯ рдХреА рдЧрдИ рдПрдХ рдЕрдиреНрдп рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╡рд┐рд╡рд░рдг рддрдХ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╢реАрд░реНрд╖рдХ рд▓реЗрдЦ рдХреЗ рд╕рд╛рд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдиреАрдЪреЗ рдХреНрдпреЛрдВ рджреЗрдЦреЗрдВ
рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕
рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рднреА рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ "рдХреНрд▓рд╛рд╕рд┐рдХ" рд╡рд┐рд╡рд╛рджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ "рд╕реА #" рдХреЗ рд░реВрдк рдореЗрдВ рдЦреЛрдЬреЗ рдЧрдП рдереЗред C ++ тАЭрдПрдХ рдордВрдЪ рдкрд░ред рддрд░реНрдХ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдХреЛрдб рдмрдирд╛ рд░рд╣рд╛, рдФрд░ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдХреНрдпреЛрдВ рди рдЗрд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд▓реЗрдЦ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдЬреЛ рдХрд┐ рд╣реИрдмреЗ рдкрд░ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдРрд╕реЗ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдХрд╛рд░рдгреЛрдВ рдХреЗ рдХрд╛рд░рдг, рд▓реЗрдЦ рдореЗрдВ C # рдФрд░ C ++ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреА рдХрдИ рддреБрд▓рдирд╛рдПрдВ рд╣реЛрдВрдЧреАред
рд╕рдорд╕реНрдпрд╛ рдХрдерди - рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ
рдХрд╛рдлреА рдмрд╛рд░, рдПрдХ рдХрд╛рд░реНрдп рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдореВрд▓ (рдЖрдорддреМрд░ рдкрд░ UI) рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рддрдерд╛рдХрдерд┐рдд рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдХрд┐рд╕реНрдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдп рд╕рд░реНрд╡рд╡рд┐рджрд┐рдд рд╣реИ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХреЗ рдХрдИ рд╕рдорд╛рдзрд╛рди рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C ++ рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
auto r=async(launch::async, [&]{return CalcSomething(params);}); DoAnother(); ProcessResult(r.get());
рдХреЙрд▓ рдмреНрд▓реЙрдХрд┐рдВрдЧ рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдПред рдпрд╛ рддреЛ:
auto r=async(launch::async, [&]{return CalcSomething(params);}); while(r.wait_for(chrono::seconds(0))!=future_status::ready) DoAnother(); ProcessResult(r.get());
рдкреВрдЫрддрд╛рдЫ рдЪрд╛рд░реНрдЯ рдХреЗ рд╕рд╛рдеред рдареАрдХ рд╣реИ, рдпреВрдЖрдИ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдЪрдХреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдпреЛрдЬрдирд╛ рдмрдирд╛рдирд╛ рд╣реИ:
thread([=]{PostMessage(CalcSomething(params));}).detach(); ... OnDataMessage(Data d){ProcessResult(d.get<type>());}
рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдпрд╣ C ++ рдХреЛрдб рд╣реИ, рд▓реЗрдХрд┐рди рдорд╛рди рд▓реАрдЬрд┐рдП C # рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕рдЪрдореБрдЪ рдПрдХ рд╣реА рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдХреЗрд╡рд▓ рдереНрд░реЗрдб рдФрд░ рдЯрд╛рд╕реНрдХ рдзрд╛рдЧреЗ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдмрдЬрд╛рдп рд╣реЛрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдорд╛рдЗрдирд╕ рд╣реИ: рдЧрдгрдирд╛ рдХреЛрдб рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛрдб рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рд╣реИрдВ (рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)ред рдХрднреА-рдХрднреА рдпрд╣ рдЕрдзрд┐рдХ рдХрдареЛрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╣рдореЗрд╢рд╛ рдХрдо рд╕реНрдХреНрд░рд┐рдмрд▓ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ... рд╕реА # рдХреЗ рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдПрдХ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рд╕рдорд╛рдзрд╛рди рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИред
рд╕реА # рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
C # рдХреЗ рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рд╣рдо рдмрд╕ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
private async void Handler(Params prms) { var r = await Task.Run(() => CalcSomething(prms)); ProcessResult(r); }
рдЬреЛ рд▓реЛрдЧ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдореИрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреЙрд▓ рдХрд╛ рдХреНрд░рдо рдпрд╣рд╛рдВ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ UI рдереНрд░реЗрдб рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕реА рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ CalcSomething рдХрд╛рд░реНрдп рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдпреВрдЖрдИ рдереНрд░реЗрдб рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдФрд░ рдЬрдм рдпреВрдЖрдИ рдереНрд░реЗрдб рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдореБрдХреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рджреВрд╕рд░реЗ рдереНрд░реЗрдб рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ ProcessResult рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред
рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдЬрд╛рджреВ рд╕рд╣реА рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рджреЛ рдЬреЛрдбрд╝реЗ рд╣реИрдВ (рдЬреЛ рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ), рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рджрд┐рдЦрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рд╣рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЬрд╛рджреВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╣реИ - рддрдерд╛рдХрдерд┐рдд рдХреЛрд░рдЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
Soprotsedury
рдПрдХ рд╕рд░рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ рдХреЛрдб рдмреНрд▓реЙрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИрдВред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдзрд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд░реНрд╡рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ), рдЬрд╣рд╛рдВ рдЗрддрдиреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдХреНрд╖рдо рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡реЗ рдЖрдкрдХреЛ рдереНрд░реЗрдбреНрд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ (рд╕рд╣рдХрд╛рд░реА рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ) рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдХреЛрдб рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред рд╕рд╣-рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рддрдерд╛рдХрдерд┐рдд рдЬрдирд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред рд╕рд╣-рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╛ рддреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рднрд╛рд╖рд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдУрдПрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╡рд┐рдВрдбреЛрдЬ рд╕рд╣-рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдлрд╛рдЗрдмрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рд╕реА # рдореЗрдВ, рдРрд╕реЗ рд╢рд╛рд╕реНрддреНрд░реАрдп рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рд╕рд┐рдВрдереИрдЯрд┐рдХ рдЪреАрдиреА рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХрд╛рдкреНрд░реЛрдбреЗрдХреНрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣рд╛рдБ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднрд╛рд╖рд╛ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд╕реЗ рджреВрд░ рд╣реИред рдпрд╣ рддрдерд╛рдХрдерд┐рдд рд╕реНрдЯреИрдХрд▓реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рд╣реИ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдФрд░ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╣реИ рдХрд┐ C # рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрдорд┐рдпрд╛рдВ рдЕрдиреБрд╕рд░рдг рдХрд░рддреА рд╣реИрдВред рдФрд░ рдкреВрд░реЗ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдФрд░ рдорд╢реАрди рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдУрд╡рд░рд╣реЗрдб рдкрд░ "async" рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡реИрд╕реЗ, рдЗрдВрддрдЬрд╛рд░ C # рдореЗрдВ рд╕рд╣-рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдкрд╣рд▓реА рдЙрдкрд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИред рдЙрдкрдЬ рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ рд╕реАрдорд┐рдд рд╣реИред
C ++ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ? рднрд╛рд╖рд╛ рдореЗрдВ рд╕реНрд╡рдпрдВ рдХреЛрдИ рд╕рд╣-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рдпрд╣ рдмреВрд╕реНрдЯ рдореЗрдВ рднреА рд╣реИ, рдФрд░ рдпрд╣ рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА рд╡рд┐рдХрд▓реНрдк - рд╕реНрдЯреИрдХрдлреБрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреНрд░рдорд╢рдГ рд╕рднреА рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ рд╕реНрдЯреИрдХ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ / рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЕрд╕рд▓реА рдзрд╛рдЧреЗ рдХреА рддрд░рд╣, рдХреЗрд╡рд▓ рдпрд╣ рд╕рдм рдУрдПрд╕ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд▓рдЧрднрдЧ рддреБрд░рдВрдд рд╣реИред рдФрд░ рдмреВрд╕реНрдЯ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХреА рддрд░рд╣, рдпрд╣ рдЕрд▓рдЧ рдУрдПрд╕, рдХрдВрдкрд╛рдЗрд▓рд░реНрд╕, рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЦреИрд░, C ++ рдХреЗ рдмрд╛рдж рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ C # рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд╣-рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдкрдХрд╛ рдЦреБрдж рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПред
C ++ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ Boost.Coroutine рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддреА рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдХреЙрд░рдЯреАрди рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдлрдВрдХреНрд╢рдирд░ (рдлрдВрдХреНрдЯрд░, рд▓реИрдореНрдмреНрдбрд╛ рдлрдВрдХреНрд╢рди) рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдлрдВрдХреНрд╢рди рдореЗрдВ рдПрдХ (рд╢рд╛рдпрдж рдЕрдзрд┐рдХ, рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП) рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрдВрдХреНрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
using Coro=boost::coroutines::coroutine<void()>; Coro c([](Coro::caller_type& yield){ ... yield();
рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рддреБрд░рдВрдд рдХреЙрдкреАрд░реЛрдбрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рддрдм рддрдХ рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ рдЬрдм рддрдХ рдЙрдкрдЬ рдлрдВрдХреНрдЯрд░ рдХреЛ рдкрд╣рд▓реА рдХреЙрд▓ рдирд╣реАрдВ рдорд┐рд▓рддреАред рдлрд┐рд░ рддреБрд░рдВрдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реЗ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдХрд┐рд╕реА рднреА рд╕рдордп рдЕрдкрдиреЗ рдХреЛрдкреНрд░реЛрд╕реЗрд╕рд░ (рдЬреЛ рдПрдХ рдлрд╝рдирдХрд╛рд░ рднреА рд╣реИ) рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдЙрд╕реА рд╕рдВрджрд░реНрдн рдореЗрдВ рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рдЙрдкрдЬ рдХреЙрд▓ рдХреЗ рдмрд╛рдж рдХрд╛рдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХреНрдпрд╛ рдпрд╣ рд╡рд░реНрдгрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдЪреАрдиреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдФрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЬрд╛рджреВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ (рдпрд╣ рд╕рд┐рд░реНрдл рд╕реА # рд╡рд┐рдХрд▓реНрдк рдХреА рддрд░рд╣ рджрд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ) рдФрд░ рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:
using __Coro=boost::coroutines::coroutine<void()>; void Post2UI(const void* coro); template<typename L> auto __await_async(const __Coro* coro, __Coro::caller_type& yield, L lambda)->decltype(lambda()) { auto f=async(launch::async, [=](){ auto r=lambda(); Post2UI(coro); return r; }); yield(); return f.get(); } void CallFromUI(void* c) { __Coro* coro=static_cast<__Coro*>(c); (*coro)(); if(!*coro) delete coro; } #define async_code(block) { __Coro* __coro=new __Coro; *__coro=__Coro([=](__Coro::caller_type& __yield){block});} #define await_async(l) __await_async(__coro, __yield, l)
рдкреВрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рд░рд▓ рдХреЛрдб рдХреА рдХреБрдЫ рджрдпрдиреАрдп 20 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ! рдмреЗрд╢рдХ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЕрд▓рдЧ рдПрдЪрдкреАрдкреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд╣реЛрдЧрд╛ред рд╕рдЪ рд╣реИ, рд╣рдореЗрдВ рдХреБрдЫ рдФрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рдЬреАрдпреВрдЖрдИ рдврд╛рдВрдЪреЗ (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рджреЗрд╢реА рдПрдкреАрдЖрдИ) рдХреА рдкрд╕рдВрдж рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
void Post2UI(const void* coro) {PostMessage(coro);} void OnAsync(Event& event) {CallFromUI(event.Get<void*>());}
рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВ, рд╕рдВрдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдврд╛рдБрдЪреЗ рдкрд░ред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕ рдХреЛрдб рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
void Handler(Params params) async_code ( auto r = await_async([&]{return CalcSomething(params);}); ProcessResult(r); )
рдФрд░ рдЧрдгрдирд╛ рдХрд╛ рдХреНрд░рдо рдареАрдХ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ C # рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣реИред рдФрд░ рд╣рдореЗрдВ C # рдХреА рддрд░рд╣ рдлрдВрдХреНрд╢рди рд╕рд┐рдЧреНрдиреЗрдЪрд░ (рдХреЙрд▓ рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди async рдЬреЛрдбрд╝реЗрдВ) рдХреЛ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдБ рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рдЪрд▓рд╛рдиреЗ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВред рд╣рдо рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдмреНрд▓реЙрдХ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдПрдХ рд▓реВрдк рдореЗрдВ рднреА рдЪрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдб:
void Handler(const list<string>& urls) { for(auto url: urls) async_code ( result+=await_async([&]{return CheckServer(url);}); ) }
рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП CheckServer рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдЪрд░ рдореЗрдВ рд╕рднреА рдкрд░рд┐рдгрд╛рдо рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреЛрдИ рддреБрд▓реНрдпрдХрд╛рд▓рди, рддрд╛рд▓реЗ рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдХреЛрдб рдкрд░рд┐рдгрд╛рдо + = ... рдХреЗрд╡рд▓ UI рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕реА # рдореЗрдВ, рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рднреА рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдПрдХ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд▓реВрдк рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВред
рдкрд░реАрдХреНрд╖рдг
рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рд╕рд╛рджрдЧреА рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╣рдо рдЕрднреА рднреА рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдЬреАрдпреВрдЖрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рдПрдХ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб (рдорд▓реНрдЯреА-рд▓рд╛рдЗрди) рдФрд░ рдПрдХ рдмрдЯрди рд╕реЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рд▓рд┐рдЦрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдлрд┐рд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд┐рд╡рд░рдг рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ):
class MyWindow: public Window { void TestAsync(int n) async_code ( output<<L" "<<this_thread::get_id()<<'\n'; auto r=await_async([&]{ this_thread::sleep_for(chrono::seconds(1)); wostringstream res; res<<L" "<<this_thread::get_id()<<L" "<<n; return res.str(); }); output<<L" "<<this_thread::get_id()<<L": "<<r<<'\n'; ) void OnButtonClick(Event&) { TestAsync(12345); TestAsync(67890); output<<L" MessageBox "<<this_thread::get_id()<<'\n'; MessageBox(L"!"); output<<L"MessageBox "<<this_thread::get_id()<<'\n'; } Editbox output; }; class MyApp : public App { virtual bool OnInit() { SetTopWindow(new MyWindow); return true; } void OnAsync(Event& event) { CallFromUI(event.Get<void*>()); } }; void Post2UI(const void* coro) { GetApp().PostMessage(ID_ASYNC, coro); }
MessageBox рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдЦрдбрд╝рд╛ рд╣реИред рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдо:
рдзрд╛рдЧрд╛ 1 рд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЪрд▓рд╛рдПрдБ
рдзрд╛рдЧрд╛ 1 рд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЪрд▓рд╛рдПрдБ
рд╕рдВрджреЗрд╢ рдмреЙрдХреНрд╕ рдХреЛ рд╕реНрдЯреНрд░реАрдо 1 рд╕реЗ рджрд┐рдЦрд╛рдПрдВ
рд╣рдо рдзрд╛рд░рд╛ 1 рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ: рдзрд╛рд░рд╛ 2 рдореЗрдВ рдбреЗрдЯрд╛ 12345 рдкрд░ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ
рд╣рдо рд╕реНрдЯреНрд░реАрдо 1 рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ: рдбреЗрдЯрд╛ 67890 рдкрд░ рдзрд╛рд░рд╛ 3 рдореЗрдВ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ
рд╕рдВрджреЗрд╢ рдмреЙрдХреНрд╕ рдереНрд░реЗрдб 1 рдореЗрдВ рдмрдВрдж рд╣реИ
рдкрд░рд┐рдгрд╛рдо
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдзреБрдирд┐рдХ рдЙрдкрдХрд░рдг (C ++ 11, Boost) рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдХреЛрдИ рднреА C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ C # рд╕реЗ рдХреБрдЫ рдорд┐рдирдЯреЛрдВ рдФрд░ рдХреЛрдб рдХреА рдПрдХ рджрд░реНрдЬрди рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдкреВрд░реНрдг-рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛ / async рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рднреА рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реЛрдЧрд╛ (рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрдИ рдПрд╕рд┐рдВрдХреНрд╕ рдмреНрд▓реЙрдХ), рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ (рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде async рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ) рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреБрд╢рд▓ (рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ)ред
рд╕рд╛рд╣рд┐рддреНрдп
1.
en.cppreference.com/w/cpp/thread - рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕рдорд░реНрдерди рдХреЛ рдорд▓реНрдЯреАрдереНрд░реЗрдб рдХрд░рдирд╛ред
2.
www.boost.org/doc/libs/1_54_0/libs/coroutine/doc/html/index.html - рдмреВрд╕реНрдЯ рдореЗрдВ
рд╕рд╣ -рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
рдЬреЛрдбрд╝ 1
рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдареАрдХ рд╕реЗ рдиреЛрдЯ рдХреА рдЧрдИ рд╣реИ рдХрд┐ C # рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд / async рди рдХреЗрд╡рд▓ рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде, рдмрд▓реНрдХрд┐ рдПрдХ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЦреИрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╣реИ рдпрд╣ рд╕рд┐рд░реНрдл рд╕рд╣-рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рд┐рд░реНрдл рдРрд╕реЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЧрдП рдереЗред рдФрд░ рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рдХрд┐ рдмреВрд╕реНрдЯ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдорджрдж рд╕реЗ рдпрд╣ рдХрд╛рдлреА рддреБрдЪреНрдЫ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдРрд╕рд╛ рдХреЛрдИ рдХреЛрдб рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдореЗрд░реЗ рдореВрд▓ рдХрдерди (рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рджреЗрдЦреЗрдВ) рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рдерд╛, рдФрд░ рдореБрдЭреЗ рдРрд╕реЗ рдХреЛрдб рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рдордЭрджрд╛рд░реА рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╡реЗ рднреА рд╕рд╛рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рдереЗ (рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд / async рдХреА рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИ), рдореИрдВ рдЕрднреА рднреА рдЗрд╕реЗ рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред
рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ (рдЬреЛ 20 рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╣реИ) рдХреБрдЫ рдФрд░:
template<typename L> auto __await(const __Coro* coro, __Coro::caller_type& yield, L lambda)->decltype(lambda()) { Post2UI(coro); yield(); return lambda(); } #define await(l) __await_async(__coro, __yield, l)
рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦ рдкрд╛рдПрдВрдЧреЗ (рдХреЛрдб рдкрд╣рд▓реЗ рдЬреИрд╕рд╛ рд╣реА рд╣реИ, рдмрд╕ рдмрджрд▓рд╛ рд╣реБрдЖ рдЗрдВрддрдЬрд╛рд░ рд╣реИред
void Handler(Params params) async_code ( auto r = await([&]{return CalcSomething(params);}); ProcessResult(r); )
рдпрд╣рд╛рдВ, рдлрд┐рд░ рд╕реЗ, рдЗрдВрддрдЬрд╛рд░ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдХреА рд╡рд╛рдкрд╕реА рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рд╢реЗрд╖ рдХреЛрдб рдХреЛ рдЙрд╕реА рдпреВрдЖрдИ рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рд╣реИрдВрдбрд▓рд░ рдиреЗ рдХрд┐рдпрд╛ рдерд╛, рдХреЗрд╡рд▓ рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдЬрдм рдЗрд╕реЗ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣рд╛рдВ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИред