工作线程调用类的成员函数,总是出现大红叉的那个提示,为什么?代码如下://控制函数,定义线程
static UINT Thread_FatigueAlarm(LPVOID pParam)
{
CUsepicoptdllView* p_usepicoptdllview = (CUsepicoptdllView*)pParam;
if((p_usepicoptdllview == NULL) || (!p_usepicoptdllview-                  >IsKindOf(RUNTIME_CLASS(CUsepicoptdllView))))
{
AfxMessageBox("参数传入失败,退出线程");
return 1;
}p_usepicoptdllview->OnPicBinary();
/*int globalCounter;
globalCounter++;
if(globalCounter > 9999)
globalCounter = 0;
*/
Sleep(1000);
return UINT(0);
}void CUsepicoptdllView::OnFatigueAlarmRun()
{
CUsepicoptdllView *pObject = new CUsepicoptdllView();  //创建对象
m_pThread = new CWinThread();                          //创建线程
m_pThread->m_bAutoDelete = false;                 
m_pThread = AfxBeginThread(Thread_FatigueAlarm,pObject); //创建工作者线程
if(m_pThread != NULL)  
MessageBox("线程调用成功");
}主要是一调用p_usepicoptdllview->OnPicBinary();这个函数就出错,程序没有走到OnPicBinary()函数里面。thread线程图像处理

解决方案 »

  1.   

    线程函数不要直接调用,给View PostMessage来处理UI
      

  2.   

    能不能说清楚点,我刚刚工作,还不太懂MFC的机制,怎么交给View PostMessage来处理?
      

  3.   

    p_usepicoptdllview->OnPicBinary();
    ->
    p_usepicoptdllview->PostMessage(WM_PIC);CUsepicoptdllView里响应这个自定义消息
    LRESULT CUsepicoptdllView::OnPic(WPARAM wparam,LPAEAM lparam)
    {
     OnPicBinary();
    }
    SendMessage也可以
      

  4.   

    你这种操作方式有一定风险。建议用SendMessage或者PostMessage来触发主窗体OnPicBinary();
      

  5.   

    不行啊,我用了PostMessage,还是那个错误,代码如下:
    //控制函数
    static UINT Thread_FatigueAlarm(LPVOID pParam)
    {
    CUsepicoptdllView* p_usepicoptdllview = (CUsepicoptdllView*)pParam;
    if((p_usepicoptdllview == NULL) || (!p_usepicoptdllview->IsKindOf(RUNTIME_CLASS(CUsepicoptdllView))))
    {
    AfxMessageBox("参数传入失败,准备退出线程");
    return 1;
    }
        //if(p_usepicoptdllview->InitInstance())
    // p_usepicoptdllview->OnPicBinary();
    p_usepicoptdllview->PostMessage(WM_PIC);
    /*int globalCounter;
    globalCounter++;
    if(globalCounter > 9999)
    globalCounter = 0;
    */
    Sleep(1000);
    return UINT(0);
    }
    //运行
    void CUsepicoptdllView::OnFatigueAlarmRun()
    {
    CUsepicoptdllView *pObject = new CUsepicoptdllView();  //创建对象
    m_pThread = new CWinThread();                          //创建线程
    //m_pThread->CreateThread();
    m_pThread->m_bAutoDelete = false;                     
    m_pThread = AfxBeginThread(Thread_FatigueAlarm,pObject); //启动线程
    if(m_pThread != NULL)  
    MessageBox("启动线程成功");
    else{
    AfxMessageBox("创建发送线程失败");
    }
    }
    //停止
    void CUsepicoptdllView::OnFatigueAlarmEnd()
    {
        return;
    }
    //消息响应函数
    LRESULT CUsepicoptdllView::OnPic(WPARAM wparam,LPARAM lparam)
    {
        OnPicBinary();
    return LRESULT(TRUE);
    }
      

  6.   


    void CUsepicoptdllView::OnFatigueAlarmRun()
    {
    m_pThread = new CWinThread();                          //创建线程
    //m_pThread->CreateThread();
    m_pThread->m_bAutoDelete = false;                     
    m_pThread = AfxBeginThread(Thread_FatigueAlarm,this); //启动线程
    if(m_pThread != NULL)  
    MessageBox("启动线程成功");
    else{
    AfxMessageBox("创建发送线程失败");
    }
    }
      

  7.   

    工作线程是不能调用MFC主线程里的函数的。把你要调用的函数做成一个消息发送到主线程,再由主线程调用