рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдкреНрд░рдмрдВрдзрди: рдЗрдВрдЬрди рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди

рдпрд╣ рд▓реЗрдЦ рд▓реЗрдЦ рдХрд╛ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ - рдХрд╛рд░реНрдп рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рд╕рдВрдЧрдарди: рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдЪреИрдирд▓ ред рдЕрдЧрд▓реА рдХрдбрд╝реА рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рдВрджреЗрд╢ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреИрджрд╛ рд╣реБрдЖ рдерд╛ред

рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдп рдереНрд░реЗрдб рдХреЗ рд╕рд╛рде рдЗрдВрдЬрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдкреНрд░рдмрдВрдзрди рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдФрд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрд╡реЗрджрди рдмрдВрдж рдХрд░рддреЗ рд╕рдордп рдереНрд░реЗрдбреНрд╕ рдХреЗ рдЖрдкрд╕реА рдЕрд╡рд░реЛрдз рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬреЛ рдЗрдВрдЬрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЗрдВрдЬрди рдХреЛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкрд░рд┐рдорд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреА рддрд░рд╣ рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдкреИрдЯрд░реНрди рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЪрд▓рд┐рдП рдЗрдВрдЬрди рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВред рд╣рдорд╛рд░рд╛ рдЗрдВрдЬрди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рд╕реЗрдЯ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рд░рд╛рдЬреНрдп рднреА рд╣реЛрдВрдЧреЗред рдореБрдЭреЗ рд░рд╛рдЬреНрдпреЛрдВ рдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯ рдорд┐рд▓рд╛: NotStarted, StartPending, Started, PausePending, Paused, ResumePending, StopPendingред

рдЗрди рд░рд╛рдЬреНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЬреАрдпреВрдЖрдИ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣реА рд╣реИ, GUI рдЗрдВрдЬрди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛, рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм NotStarted рд░рд╛рдЬреНрдп рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ GUI рдХреЛ "рдкреНрд░рд╛рд░рдВрдн" рдмрдЯрди рдФрд░ "рд░реЛрдХреЗрдВ" "рдЬрд╛рд░реА рд░рдЦреЗрдВ" рдФрд░ "рд░реЛрдХреЗрдВ" рдмрдЯрди рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рддрджрдиреБрд╕рд╛рд░, рдЬрдм рдЖрдк рд░реЛрдХреА рдЧрдИ рд╕реНрдерд┐рддрд┐ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдЯрд╛рд░реНрдЯ рдФрд░ рдкреЙрдЬрд╝ рдмрдЯрди рд▓реЙрдХ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдХрдВрдЯрд┐рдиреНрдпреВ рдФрд░ рд╕реНрдЯреЙрдк рдмрдЯрди рдЕрдирд▓реЙрдХ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдпрдВрддреНрд░рдг рдмрдЯрди рдХреЗ рд╕рд╛рде WTL рд╕рдВрд╡рд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрдЬрди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХрд╛ рдЗрдВрдЬрди рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
void CMainDlg::OnStateChanged(EngineState::State state) { //    ,     GUI     CSyncChannel, //              //   Pending ,   ,       //          GetDlgItem(IDC_BUTTON_START).EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_STOP).EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_PAUSE).EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_CONTINUE).EnableWindow(FALSE); switch (state) { case EngineState::NotStarted: GetDlgItem(IDC_BUTTON_START).EnableWindow(TRUE); break; case EngineState::Started: GetDlgItem(IDC_BUTTON_STOP).EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_PAUSE).EnableWindow(TRUE); break; case EngineState::Paused: GetDlgItem(IDC_BUTTON_STOP).EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_CONTINUE).EnableWindow(TRUE); break; } } 

рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрдВрдЬрди рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╕реЗрдЯ рд╣реЛрдЧрд╛: рдкреНрд░рд╛рд░рдВрдн, рд░реЛрдХреЗрдВ, рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ, рд░реЛрдХреЗрдВ, рдЬрд┐рд╕реЗ рд╕рдВрд╡рд╛рдж рд╡рд░реНрдЧ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдмрдЯрди рдХреНрд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдПрдХ рд░рд╛рдЬреНрдп рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЛ GUI рдереНрд░реЗрдб рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд╣реИ рдХрд┐, рдЬрдм GUI рдереНрд░реЗрдб "рдкреНрд░рд╛рд░рдВрдн" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╣реИ, рдЗрдВрдЬрди рдкреНрд░рд╛рд░рдВрдн рдпрд╛ рд░реБрдХреА рд╣реБрдИ рд╕реНрдерд┐рддрд┐ рдкрд░ рдЕрддреБрд▓реНрдп рд░реВрдк рд╕реЗ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╣реИрдВрдбрд▓рд░ рдХреЛ "рдкреНрд░рд╛рд░рдВрдн" рдмрдЯрди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрдВрдЬрди рдХреЗ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред

рд╕реНрдЯрд╛рд░реНрдЯрдкрд┐рдВрдЧ рдЬреИрд╕реЗ рд▓рдВрдмрд┐рдд рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рд╕рдВрдХреНрд░рдордг, рдирд┐рдпрдВрддреНрд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреА рдХреЙрд▓ рдХреЗ рдЕрдВрджрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд╕реНрдЯрд╛рд░реНрдЯ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╕реНрдЯрд╛рд░реНрдЯ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрдВрдЬрди рдореЗрдВ рд╕реНрдЯрд╛рд░реНрдЯрдкреЗрдВрдбрд┐рдВрдЧ рд╕реНрдерд┐рддрд┐ рд╣реЛрдЧреАред рдпрд╣реА рд╣реИ, StartPending рд░рд╛рдЬреНрдп рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреА рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рднрд▓реЗ рд╣реА рдкреНрд░рд╛рд░рдВрдн рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗред

рдЖрдЗрдП рдЗрдВрдЬрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВред
рдореИрдВ рдЗрдВрдЬрди рдХреНрд▓рд╛рд╕ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд╛рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдИ рднреА рд▓рд╛рдкрддрд╛ рднрд╛рдЧ рдПрдХ рдмрдбрд╝реА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛ рд╕рдХрддрд╛ рд╣реИред
 //Engine.h namespace EngineState { enum State { NotStarted, StartPending, Started, PausePending, Paused, ResumePending, StopPending }; }; class IEngineEvents { public: virtual void OnStateChanged(EngineState::State state) = 0; }; class CEngine { public: CEngine(IEngineEvents* listener); ~CEngine(void); public: //      void Start(); void Stop(); void Pause(); void Resume(); public: // GUI          bool ProcessMessage(MSG& msg); private: void WaitForThread(); static DWORD WINAPI ThreadProc(LPVOID param); void Run(); bool CheckStopAndPause(); void ChangeState(EngineState::State state); void OnStateChanged(EngineState::State state); private: CSyncChannel m_syncChannel; //        IEngineEvents* m_listener; HANDLE m_hThread; volatile EngineState::State m_state; }; 

 // Engine.cpp CEngine::CEngine(IEngineEvents* listener) : m_listener(listener), m_hThread(NULL), m_state(EngineState::NotStarted) { m_syncChannel.Create(GetCurrentThreadId()); } CEngine::~CEngine(void) { //      ,      m_state = EngineState::StopPending; //  ,    . //          GUI,   . //  ,       , //  m_syncChannel,      . m_syncChannel.Close(); //     . WaitForThread(); } void CEngine::WaitForThread() { if (m_hThread) { //    . //         : // StopPending  NotStarted _ASSERT(m_state == EngineState::StopPending || m_state == EngineState::NotStarted); //      DWORD waitResult = WaitForSingleObject(m_hThread, INFINITE); _ASSERT(waitResult == WAIT_OBJECT_0); //    ,    HANDLE   CloseHandle(m_hThread); m_hThread = NULL; } } void CEngine::Start() { //   ,   GUI  //        ,      //      if (m_state == EngineState::NotStarted) { //   Start   ,    , //         //       ,     WaitForThread(); //    , //   this,      Run    m_hThread = CreateThread(NULL, 0, CEngine::ThreadProc, this, 0, NULL); if (m_hThread) { //     StartPending //       ChangeState(EngineState::Started) //  ,      SyncChannel, //       , //    ,        "Start" //     StartPending    , //    Started    ChangeState(EngineState::StartPending); } } } void CEngine::Stop() { //   ,   GUI  if (m_state != EngineState::NotStarted && m_state != EngineState::StopPending) { //   ,          ChangeState(EngineState::StopPending); } //    ,     //      //       ChangeState(EngineState::Stopped) //         WaitForThread } void CEngine::Pause() { //   ,   GUI  if (m_state == EngineState::Started) { //    PausePending     Started ChangeState(EngineState::PausePending); } } void CEngine::Resume() { //   ,   GUI  if (m_state == EngineState::Paused) { //    ResumePending     Paused ChangeState(EngineState::ResumePending); } } bool CEngine::ProcessMessage(MSG& msg) { // GUI         return m_syncChannel.ProcessMessage(msg); } DWORD WINAPI CEngine::ThreadProc(LPVOID param) { //    ,   //        Run reinterpret_cast<CEngine*>(param)->Run(); return 0; } void CEngine::Run() { //  GUI  ,     ChangeState(EngineState::Started); for (;;) { //    ,   -  //          if (!CheckStopAndPause()) { break; } //    -  ,    :) Sleep(1000); } //   ,     ChangeState(EngineState::NotStarted); //     NotStarted   //  -        //        WaitForSingleObject } bool CEngine::CheckStopAndPause() { //       . //        GUI. if (m_state == EngineState::StopPending) { //    Stop,     return false; } if (m_state == EngineState::PausePending) { //     , //    GUI     //        ChangeState(EngineState::Paused); while (m_state == EngineState::Paused) { Sleep(100); } if (m_state == EngineState::StopPending) { //    Stop,     return false; } //      //    GUI         ChangeState(EngineState::Started); } //       return true; } void CEngine::ChangeState(EngineState::State state) { //       , //    GUI ,  m_syncChannel m_syncChannel.Execute(boost::bind(&CEngine::OnStateChanged, this, state)); } void CEngine::OnStateChanged(EngineState::State state) { //      GUI ,   m_state //     m_state       //      ,       //             GUI  m_state = state; m_listener->OnStateChanged(m_state); } 

CEngine рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреНрд▓рд╛рд╕ CEngine рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрд╡рд╛рдж рдХреЗ WTL рд╡рд░реНрдЧ рдХрд╛ рд╕рджрд╕реНрдп рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдкреНрд░рд╛рд░рдВрдн, рд╕реНрдЯреЙрдк, рдХрдВрдЯрд┐рдиреНрдпреВ, рдФрд░ рдкреЙрдЬрд╝ рдХреАрдЬрд╝ рдХреЛ рджрдмрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕рдВрд╡рд╛рдж рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рд╕реЗрдЯ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ CEngine рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрд╡рд╛рдж рд╡рд░реНрдЧ IEngineEvents рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрдЬрди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рд╕реВрдЪрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ OnStateChanged рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕реНрдЯреНрд░реАрдо рд╕рдВрджреЗрд╢ CEngine рд╡рд░реНрдЧ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рд╣реИрдВ, рд╕рдВрд╡рд╛рдж рд╡рд░реНрдЧ рдорд╛рдирдХ рд╡рд┐рдзрд┐рдпреЛрдВ WTL :: CMessageLoop :: AddMessageFilter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡рд┐рдВрдбреЛ рд╕рдВрджреЗрд╢ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ WTL :: CMessageililter рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
 class CMessageFilter { public: virtual BOOL PreTranslateMessage(MSG* pMsg) = 0; }; 

PreTranslateMessage рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди CEngine :: ProcessMessage рдлрд╝рдВрдХреНрд╢рди рдХреА рдкреБрди: рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ

рдЖрд╡реЗрджрди рдХреЛ рдмрдВрдж рдХрд░рддреЗ рд╕рдордп рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдЖрдкрд╕реА рдЕрд╡рд░реЛрдз рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрд╡рд╛рдж рд╡рд░реНрдЧ рдореЗрдВ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ CSyncChannel рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ :: CEngine рд╡рд░реНрдЧ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдмрдВрджред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ CEngine рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдореВрд░реНрдд рд▓рд╛рдн рджреЗрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In141783/


All Articles