PostThreadMessage C++ (CWinThread)


я использую MFC C++ и пытаюсь отправить сообщение в CWinThread, используя PostThreadMessage из класса Dlg, и сообщение не обрабатывается в классе потока

.H файл потока:

   #define Message_Test_Id WM_USER + 1

   class CTestMsg : public CWinThread
   {
       DECLARE_DYNCREATE(CTestMsg)

       protected:
       CTestMsg();           // protected constructor used by dynamic        creation
       virtual ~CTestMsg();

   public:
       virtual BOOL InitInstance();
       virtual int ExitInstance();

   protected:
       afx_msg void OnTestMsg(WPARAM wParam, LPARAM lParam);//The Message
       DECLARE_MESSAGE_MAP()

};

.cpp потока:

   BEGIN_MESSAGE_MAP(CTestMsg, CWinThread)
       ON_THREAD_MESSAGE(Message_Test_Id,OnTestMsg)
   END_MESSAGE_MAP()

   ....
   void CTestMsg::OnTestMsg(WPARAM wParam, LPARAM lParam)
   {
     ...
   }

И я пытаюсь отправить сообщение в классе Dlg:

   CTestMsg *m_testMsg = (CTestMsg*)AfxBeginThread(RUNTIME_CLASS(CTestMsg),THREAD_PRIORITY_NORMAL, 10000, CREATE_SUSPENDED, NULL);

       m_testMsg->PostThreadMessageW(Message_Test_Id, 0, 0);

почему сообщение не обрабатывается? Благодарность! (извините за мой плохой английский)


person Community    schedule 01.09.2015    source источник


Ответы (1)


Вы создаете свой поток с флагом CREATE_SUSPENDED, чтобы он действительно работал, вы должны возобновить его с помощью:

m_testMsg->ResumeThread();
person marcinj    schedule 01.09.2015
comment
кстати, когда нить "мертвая"? если я вызываю ResumeThread, то вызывается метод Run(), а затем поток «мертв»? каков жизненный цикл CWinThread? - person ; 01.09.2015
comment
Поток завершится, когда его цикл сообщений прервется, вы можете сделать это, вызвав PostQuitMessage(0); - person marcinj; 01.09.2015
comment
Хорошо, а что лучше, зачем убивать поток во время работы приложения? правильно сделать m_testMsg-›Delete(); если нет, то как лучше всего убить нить? Потому что PostQuitMessage(0) также убивает мое приложение: D - person ; 01.09.2015
comment
Лучше не убивать потоки, так как это может привести к неопределенному поведению в вашем приложении. Как я уже сказал, чтобы остановить ваш поток пользовательского интерфейса, вызовите m_testMsg->PostQuitMessage(0);, но это должно быть сделано из вашего потока m_testMsg, поэтому, если вы хотите остановить его из какого-то другого потока, используйте m_testMsg->PostThreadMessage для публикации сообщения, которое после получения вызовет PostQuitMessage(0 );. - person marcinj; 01.09.2015
comment
О, еще раз спасибо !, поэтому мне нужно отправить в поток сообщение с идентификатором примера Message_quit, а затем поток в обратном вызове сообщения должен вызвать PostQuitMessage? и это лучший способ убить нить? - person ; 01.09.2015
comment
Достаточно вызвать ::PostQuitMessage(0);, но это должно быть сделано внутри вашего потока m_testMsg. Я полагаю, вы могли бы просто сделать m_testMsg->PostThreadMessage(WM_QUIT,0,0); - person marcinj; 01.09.2015
comment
Хорошо, и это лучший способ убить нить? и еще раз большое спасибо!!!!!!!! - person ; 01.09.2015
comment
@ShaySmadja для простого сценария - да. - person marcinj; 01.09.2015
comment
@marcinj: Если вы не предоставите краткую спецификацию для простого сценария, вы не сможете назвать свое предложение безопасным. Зачем нужна специальная функция PostQuitMessage? объясняет, что вы упускаете, когда звоните PostThreadMessage. Также обратите внимание, что сообщения, отправленные в цепочку, могут быть потеряны (Почему сообщения, отправленные PostThreadMessage, исчезают?). - person IInspectable; 02.09.2015