我在CMyView.h中定义了:static DWORD WINAPI StartMythread(LPVOID lpParameter);
在CMyView. cpp中响应鼠标左键消息:
void CLEDView::OnLButtonDown(UINT nFlags, CPoint point) 
{
   GetDlgItem(IDC_NUM_CLEAR)->EnableWindow(FALSE);
   HANDLE hThread = CreateThread(NULL, 0, StartMythread, this, 0, NULL);
   CloseHandle(hThread);
}
当在软件可视界面单击鼠标左键后,线程被终止。如果把GetDlgItem(IDC_NUM_CLEAR)->EnableWindow(FALSE)注释掉,就可以。
请问是不是不能在View类是用GetDlgItem(IDC_NUM_CLEAR)->EnableWindow(FALSE)不对?
求大家帮帮忙,谢谢!

解决方案 »

  1.   

    lz的意思是调用了GetDlgItem(IDC_NUM_CLEAR)->EnableWindow(FALSE);后面的CreateThread创建的线程就退出了??你调试看看你的线程函数里写了什么,是不是什么判断条件不符合线程就退出了
      

  2.   

    GetDlgItem(IDC_NUM_CLEAR)->EnableWindow(FALSE);----->GetDlgItem(IDC_NUM_CLEAR)->EnableWindow(TRUE);看效果是不是一样的
      

  3.   

    我弄错了,是加了GetDlgItem(IDC_NUM_CLEAR)->EnableWindow(FALSE)后,当我按软件可视界面的"stop"键时无法终止线程,好象界面无法接收该消息似的。
    "stop"键响应函数:
    void CLEDView::OnBtnStop() 
    {
    // TODO: Add your control notification handler code here
    m_StopFlag = TRUE;
    }线程函数:
    void CLEDView::StartMythread()
    {
       while (!m_StopFlag)
       {
          ......
       }
    }
      

  4.   

    this->GetDlgItem(IDC_NUM_CLEAR)->EnableWindow(FALSE)加个this试一试
      

  5.   

    线程函数定义的不规范,你m_StopFlag是static的吗?
      

  6.   

    线程函数定义怎样才规范啊?我新手,不是很懂,请你帮改一下,好吗?
    m_StopFlag不是static的,是一个BOOL变量,这有什么问题吗?
      

  7.   

    不要将MFC类的指针传递给线程函数,例如:
    UINT __cdecl ThreadProc(LPVOID lParam)
    {
     HWND hWnd = (HWND)lParam;
     ASSERT(hWnd);
     ....
     ::SendMessage(hWnd, UM_MESSAGE, (WPARAM).., (LPARAM)...);//发送自定义的消息到窗口
     return 0;
    }//创建线程
    AfxBeginThread(ThreadProc, (LPVOID)GetSafeHwnd()); // 这里传递的是窗口的句柄#define UM_MESSAGE WM_USER+11
    afx_msg LRESULT OnHandleMessage(WPARAM wParam, LPARAM lParam);BEGIN_MESSAGE_MAP(..., ...)
    ..
    ON_MESSAGE(UM_MESSAGE, &CXXX::OnHandleMessage)
    END_MSSAGE_MAP()LRESULT CXX::OnHandleMessage(WPARAM wParam, LPARAM lParam)
    {
     ...
     return 0;
    }
      

  8.   

    我上面的代码哪个是MFC类的指针?我搞不清楚了,请指出,谢谢!
    还有代码里那里是将MFC类的指针传递给线程函数?
    你是建议我这样做吗?#define UM_MESSAGE WM_USER+11
    afx_msg LRESULT OnHandleMessage(WPARAM wParam, LPARAM lParam);BEGIN_MESSAGE_MAP(..., ...)
    ..
    ON_MESSAGE(UM_MESSAGE, &CXXX::OnHandleMessage)
    END_MSSAGE_MAP()LRESULT CXX::OnHandleMessage(WPARAM wParam, LPARAM lParam)
    {
     m_StopFlag = TRUE;
     return 0;
    }void CLEDView::OnBtnStop()  
    {
        // TODO: Add your control notification handler code here
         ::SendMessage(this, UM_MESSAGE, (WPARAM).., (LPARAM)...);
    }
      

  9.   

    传递句柄GetSafeHwnd()后,怎样转换成 CLEDView*啊?