рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдВрддрд┐рдо рдкреЛрд╕реНрдЯ, рддреАрди рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ рдмрд╣реБрдд рдХрдЯреНрдЯрд░ рд╣реЛ рдЧрдП рдереЗ, рдпрд╣ рди рдХреЗрд╡рд▓ рд╣реЗрдмреНрд░рд╛ рдкрдмреНрд▓рд┐рдХ рдореЗрдВ рджрд╛рд░реНрд╢рдирд┐рдХ рд░реБрдЪрд┐ рдкреИрджрд╛ рдХрд░реЗрдЧрд╛редрдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдПрдХ
рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░
рдЪреЗрди рдХреЗ рдХрдореЗрдВрдЯреЗрдЯрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рдЙрди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрд╛ рдЬрд┐рдирдХреЗ рддрд╣рдд рдпреЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмреНрд▓реЙрдХрд┐рдВрдЧ рдЬреИрд╕реЗ рд╕рд░рд▓ рдмреНрд▓реЙрдХрд┐рдВрдЧ рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рдХреЛ рдмреЗрд╣рддрд░ рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛рддреЗ рд╣реИрдВред
рд╡рд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рд╣реИ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕рд░рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реЗ рдПрдХ рдЬрдЯрд┐рд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЙрдЪрд┐рдд рдард╣рд░рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: рдпрджрд┐ рдПрдХ рд╕рд░рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рд╕рдВрддреЛрд╖рдЬрдирдХ рдврдВрдЧ рд╕реЗ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдЪреНрдЫреЗ рд╕реЗ рдЕрдЪреНрдЫреЗ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред
рд▓реЗрдХрд┐рди рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдлрд╛рдпрджреЗ рдЕрд╡рд░реБрджреНрдз рд╣реЛрдиреЗ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдЖрджрд┐рдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВред (рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рддреБрд▓реНрдпрдХрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗ рдмрд┐рдирд╛ рдЗрди рдЕрдкреНрд░рднрд╛рд╡реА рд▓рд╛рднреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред)
рдПрдХ рдПрдХрд▓ рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреА рд░рдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рди рд▓реЗрдВ, рд╣рдордиреЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ:
CRITICAL_SECTION g_csSingletonX; X * g_px = NULL; X * GetSingletonX () {EnterCriticalSection (& g_csSingletonX); if (g_px == NULL) {g_px = new (nothrow) X (); } рд▓реАрд╡ рдХреНрд░рд┐рдЯрд┐рдХрд▓рд╕реЗрдХреНрд╢рди (& g_csSingletonX); рд╡рд╛рдкрд╕реА g_px; }
рд╕рдорд╕реНрдпрд╛рдПрдБ рддрдм рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВ рдпрджрд┐
X()
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реНрд╡рдпрдВ рд╣реА рддрд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: рдлрд┐рд░, рддрд╛рдХрд┐ рдЧрддрд┐рд░реЛрдз рдЙрддреНрдкрдиреНрди рди рд╣реЛ, рдкреНрд░реЛрдЧреНрд░рд╛рдо
рдХреЛ рддрд╛рд▓реЛрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрд╕ рдХреНрд░рдо рдореЗрдВ рдХрдбрд╝рд╛рдИ рд╕реЗ
рддрд╛рд▓реЗ рдХреЛ рдкрдХрдбрд╝рдиреЗ
рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛрдб рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЖрдк рдЗрд╕рдореЗрдВ рддрд╛рд▓реЛрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдЖрдкрдХреЛ рд╣рд╛рд░ рдорд╛рдирдиреА рд╣реЛрдЧреАред)
рддрд╛рд▓реЛрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди, рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рддрд╛рд▓реЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдХреНрд░рдо рдореЗрдВ рдирд╣реАрдВ рдкрдХрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕рдВрдпреБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддреБрд▓реНрдпрдХрд╛рд▓рди рдХрдард┐рди рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐
g_csSingletonX
рдХреЛ рд╕рднреА рд╕рд┐рдВрдЧрд▓рдЯрди рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЗ рддрд╛рд▓реЗ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рд╛рде рд╣реА рд╕рд╛рде X рдХреЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЗ рддрд╛рд▓реЗ рдХреЗ рд╕рд╛рдеред
CRITICAL_SECTION g_csCommon;
X * GetSingletonX ()
{
EnterCriticalSection (& g_csCommon);
рдЕрдЧрд░ (g_px == NULL)
{
g_px = new (nothrow) X ();
}
рд▓реАрд╡ рдХреНрд░рд┐рдЯрд┐рд╕рд▓рд╛рдИрдЯ (& g_csCommon);
рд╡рд╛рдкрд╕реА g_px;
}
Y * GetSingletonY ()
{
EnterCriticalSection (& g_csCommon);
рдЕрдЧрд░ (g_py == NULL)
{
g_py = new (nothrow) Y ();
}
рд▓реАрд╡ рдХреНрд░рд┐рдЯрд┐рд╕рд▓рд╛рдИрдЯ (& g_csCommon);
рд╡рд╛рдкрд╕реА g_py;
}
рд╢реВрдиреНрдп X :: DoSomething ()
{
EnterCriticalSection (& g_csCommon);
.. рдХреБрдЫ ..
рд▓реАрд╡ рдХреНрд░рд┐рдЯрд┐рд╕рд▓рд╛рдИрдЯ (& g_csCommon);
}
рдЬреА! рдПрдХ рдЫреЛрдЯреЗ рдФрд░ рдЕрд╕рдВрдЧрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рд╕реЗ, рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдмреНрд▓реЙрдХ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдзрд╛рдЧреЗ рд▓рдЧрд╛рддрд╛рд░ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдПрдХ рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рддрд╛рд▓реЗ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рдЧрддрд┐рд░реЛрдз рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ; рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред (рдЬрдм рддрдХ рдЖрдк рдЧреИрд░-рдмреНрд▓реЙрдХрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди рд╕реЗ "рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рд▓реЙрдХ" рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реЛрдВ,
рдЙрджрд╛рд╣рд░рдг рдХреЗ
рд▓рд┐рдП рдЕрд╕реНрдерд┐рд░ рдХреИрд╢ рдХреЗ рд╕рд╛рде )ред рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рдХреА рдПрдХ рдФрд░ рдЕрдЪреНрдЫреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рддрд╛рд▓реЗ рдирд╣реАрдВ рд╣реИрдВ, рд╡реЗ "рдорд╛рд▓рд┐рдХ рд░рд╣рд┐рдд" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рд░рд╣реЗрдВрдЧреЗ рдЬрдм рддрд╛рд▓рд╛ рдмрдВрдж рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдзрд╛рдЧреЗ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрддрд╛ рд╣реИ; рдЖрдкрдХреЛ
WAIT_ABANDONED
рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣реЗрд▓реА рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИред рд╕рдВрд░рдХреНрд╖рд┐рдд рдбреЗрдЯрд╛ рд╣рд░ рд╕рдордп рд╕рд╣реА рд░рд╣рддрд╛ рд╣реИ, рдФрд░ рдкрд░рдорд╛рдгреБ рдЕрдкрдиреА рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рджреВрд╕рд░реЗ рддрдХ рдЧреБрдЬрд░рддрд╛ рд╣реИред
рдХреНрдпрд╛ рдЖрдк рдРрд╕реЗ рдЙрддреНрдкрд╛рджреЛрдВ рд╕реЗ рдорд┐рд▓реЗ рд╣реИрдВ, рдпрджрд┐ рдХрд┐рд╕реА рдПрдХ рдШрдЯрдХ рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдк рдХреЗрд╡рд▓ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ рд░рд┐рдмреВрдЯ рдХрд░рдХреЗ рдХрд╛рдо рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реМрдЯ рд╕рдХрддреЗ рд╣реИрдВ? рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рдЙрди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЕрд╡рд░реБрджреНрдз рдЖрджрд┐рдо рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ - рдЕрдВрдд рдореЗрдВ, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ! - рдлрд┐рд░ рдЖрдкрдХреЛ рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреА рдЪрд╛рд╣рд┐рдПред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ рдорд╛рди рд▓реАрдЬрд┐рдП:
CRITICAL_SECTION g_cs;
GORILLADATA g_data;
рд╢реВрдиреНрдп PokeGorilla (рджреЛрд╣рд░реА рддреАрд╡реНрд░рддрд╛)
{
EnterCriticalSection (& g_cs);
DeformGorilla (рддреАрд╡реНрд░рддрд╛, рдФрд░ g_data);
рдЬрд╛рд▓реАрджрд╛рд░ (& g_data.spline);
int stress = CalculateTension (& g_data.spline);
if (рддрдирд╛рд╡ <25) g_data.mood = рд╕рдВрдмрдВрдзрд┐рдд;
рдЕрдЧрд░ (рддрдирд╛рд╡ <50) g_data.mood = ANNOYED;
рдФрд░ g_data.mood = ANGRY;
DeleteObject (g_data.hbmGorilla);
g_data.hbmGorilla = RenderGorilla (& g_data);
рд▓реАрд╡ рдХреНрд░рд┐рдЯрд┐рд╕рд▓рд╛рдИрдЯ (& g_cs);
}
- рдХрдИ рд╡рд┐рд╡рд╛рджрд┐рдд рд╕реНрдерд╛рди рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рддрд╛рд▓реЛрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛ рд╕рдореНрдорд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
Reticulate()
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рддрд╛рд▓рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рдЬреНрдпрд╛рдорд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ; рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕ рд▓реЙрдХ рдХреЛ
g_cs
рд╕реЗ рдкрд╣рд▓реЗ
g_cs
ред
рдпрджрд┐
g_cs
рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рдзрд╛рдЧреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЙрд╕ рд╕рдордп рдХреЛ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ
PokeGorilla()
рд▓реЙрдХ рд░рдЦрддрд╛ рд╣реИред
RenderGorilla()
рд╕рдВрднрд╡рддрдГ рдПрдХ рдЬрдЯрд┐рд▓ рдФрд░ рдзреАрдорд╛ рдСрдкрд░реЗрд╢рди рд╣реИред (рдЖрдк рд╕реНрд╡рдпрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдлрд░ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдХрдард┐рди рд╣реИред) рдлрд┐рд░,
RenderGorilla()
рдХреЛ рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди,
g_cs
рд▓реЙрдХ рд╡реНрдпрд░реНрде рдореЗрдВ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рджреЛрдиреЛрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдПрдХ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рд╣реИ; рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ! (рд▓рдЧрднрдЧ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдлрд░ рдЬрд┐рддрдирд╛ рдХрдард┐рди рд╣реИред) рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рдХреЗ рд▓рд╛рднреЛрдВ рдХрд╛ 80% рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХрд╛рдо рдХрд╛ рдХреЗрд╡рд▓ 20% рдЦрд░реНрдЪ рдХрд░ рд╕рдХреЗрдВ?
void PokeGorilla(double intensity)
{
//
EnterCriticalSection(&g_cs);
GORILLADATA data = g_data;
LeaveCriticalSection(&g_cs);
//
DeformGorilla(intensity, &data);
Reticulate(&data.spline);
int stress = CalculateTension(&data.spline);
if (stress < 25) data.mood = RELAXED;
else if (stress < 50) data.mood = ANNOYED;
else data.mood = ANGRY;
data.hbmGorilla = RenderGorilla(&data);
//
EnterCriticalSection(&g_cs);
HBITMAP hbmToDelete = g_data.hbmGorilla;
g_data = data;
LeaveCriticalSection(&g_cs);
DeleteObject(hbmToDelete);
}
"рдбреВ, рд░рд╛рдЗрдЯ" рдореЙрдбрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдо рдЧреЛрд░рд┐рд▓реНрд▓рд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдкрд░ рд╕рднреА рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ: "рд░реЗрдЯрд┐рдХреНрдпреВрд▓реЗрд╢рди" рдХреЗ рджреМрд░рд╛рди рд▓реЙрдХ рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓реЙрдХ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ; рдФрд░ рдЧреЛрд░рд┐рд▓реНрд▓рд╛ рдХреЗ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рджреМрд░рд╛рди, рддрд╛рд▓рд╛ рднреА рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдмрд╛рдХреА рдзрд╛рдЧреЗ рдХрдо рдмреЗрдХрд╛рд░ рд╣реЛред рдЬрдм рдЧреЛрд░рд┐рд▓реНрд▓рд╛ рдХреА рд╕реНрдерд┐рддрд┐ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдлрд┐рд░ рд╕реЗ рддрд╛рд▓рд╛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕рдиреЗ рдЧреЛрд░рд┐рд▓реНрд▓рд╛ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджрд┐рдпрд╛, рдЙрд╕рдиреЗ рдПрдХ рдЬреАрддрд╛: рд░рд╛рдЬреНрдп рд░рд┐рдХреЙрд░реНрдб рдЬреЛ рдХрд┐ рдпрд╣ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдХрд┐рдП рдЧрдП рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд▓реЙрдХ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ; рд▓реЗрдХрд┐рди рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЧреЛрд░рд┐рд▓реНрд▓рд╛ рдХрд╛ рднрд╛рд╡рдирд╛рддреНрдордХ рддрдирд╛рд╡ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдмрдирддрд╛ рд╣реИред рд╣рдореЗрдВ рдпрд╣ рдкрд╣рдЪрд╛рдирдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЧреЛрд░рд┐рд▓реНрд▓рд╛ рдкреЛрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрдм рд╣рдо рдкрд┐рдЫрд▓реЗ рдкреНрд░рд╣рд╛рд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд░рд╣реЗ рдереЗ; рдФрд░ рдпрджрд┐ рд░реЛрдХрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдирдП рдбреЗрдЯрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВред
рдлрд┐рд░ рд╣рдо рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде
"рдХрд░рддреЗ рд╣реИрдВ, рд▓рд┐рдЦрддреЗ рд╣реИрдВ, (рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ)" рдореЙрдбрд▓ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ:
LONG g_lCounter;
void PokeGorilla(double intensity)
{
BOOL fSuccess;
do {
//
EnterCriticalSection(&g_cs);
GORILLADATA data = g_data;
LONG lCounter = g_lCounter;
LeaveCriticalSection(&g_cs);
//
DeformGorilla(intensity, &data);
Reticulate(&data.spline);
int stress = CalculateTension(&data.spline);
if (stress < 25) data.mood = RELAXED;
else if (stress < 50) data.mood = ANNOYED;
else data.mood = ANGRY;
data.hbmGorilla = RenderGorilla(&data);
//
EnterCriticalSection(&g_cs);
HBITMAP hbmToDelete;
if (lCounter == g_lCounter)
{
hbmToDelete = g_data.hbmGorilla;
g_data = data;
g_lCounter++;
fSuccess = TRUE;
} else {
hbmToDelete = data.hbmGorilla;
fSuccess = FALSE;
}
LeaveCriticalSection(&g_cs);
DeleteObject(hbmToDelete);
} while (!fSuccess);
}
рд╕рд╛рдорд╛рдиреНрдп рдЧреЛрд░рд┐рд▓реНрд▓рд╛ рдбреЗрдЯрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдмрдврд╝рд╛рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рд╕рдВрдЦреНрдпрд╛ рдХреЛ
GORILLADATA
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ
GORILLADATA
рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред (рдирд╣реАрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреЛрд░рд┐рд▓реНрд▓рд╛ рдХреЛ рдирд╣реАрдВ рд░реЛрдХрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛!) рдПрдХ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ, рд╣рдо
InterlockedCompareExchangeRelease
рдХрд┐рдП рдЧрдП
InterlockedCompareExchangeRelease
рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ; рд▓реЗрдХрд┐рди
GORILLADATA
рд╕рдВрд░рдЪрдирд╛
GORILLADATA
рдкрд░рдорд╛рдгреБ рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдФрд░ рдЙрд╕реА рд╕рдордп рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рднреА, рдореЙрдбрд▓ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рдмрдирд╛ рд╣реБрдЖ рд╣реИ: рдпрджрд┐ рдЧреЛрд░рд┐рд▓реНрд▓рд╛ рд╣рдорд╛рд░реА рдкреАрда рдХреЗ рдкреАрдЫреЗ рдЦрдбрд╝рд╛ рдерд╛, рддреЛ рд╣рдореЗрдВ рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рд╕рднреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рджреЛрдиреЛрдВ рдЪреЛрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рддрд░реАрдХреЗ рд╕реЗ рдЧрдгрдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред