本帖最后由 hibiko 于 2012-09-06 14:07:40 编辑

解决方案 »

  1.   

    起GPIOThread(LPVOID lpParameter) 的时候需要把你的主窗口的this传进去,在GPIOThread(LPVOID lpParameter) 里
    CWnd*CDlg =(CWnd*)lpParameter;
    主窗口类 *CfDlg=(主窗口类*)CDlg;
    CfDlg->m_mm1(m_mm2).你的控件变量.ModifyStyle(0,SS_BITMAP);
      

  2.   

    问题是m_mm2这个实例,是不是tab窗口中的那个CDialog2的那个实例呢?虽然都是同一个类,但如果不是同一个实例,而是你临时又定义一个的话,是没有用的,因为新定义的窗口还没有创建呢,只是定义了一个实例而已。你可以在进入线程前,取得当前处于运行态的tab窗口中的那个CDialog2的实例传递给线程
      

  3.   


    是这个实例,是在主窗口里面的定义 extern传进来的 取得当前处于运行态的tab窗口中的那个CDialog2的实例传给线程
      

  4.   

    就是不知道怎么取得当前处于运行态的tab窗口中的那个CDialog2的实例传给线程上面打错了
      

  5.   

    PULONG pid;
    m_hThread= ::CreateThread(0,0,GPIOThread,
    (LPVOID)this,//主窗口类的this
    0,
    (PULONG)&pid
    );
      

  6.   

    然后怎么在GPIOThread里面调用呢?
      

  7.   

    GPIOThread的PVOID hdcMain 参数转换回
      

  8.   

    一.给你要设置风格的控件加控件变量如m_stc二.在GPIOThread(LPVOID lpParameter) 里:CWnd* CDlg =(CWnd*)lpParameter;
    主窗口类名* CfDlg=(主窗口类名*)CDlg;
    通过主窗口指针找到CDialog1(m_mm1)或CDialog2(m_mm2)子窗口,如下:
    CfDlg->m_mm1(m_mm2).m_stc.ModifyStyle(0,SS_BITMAP);
      

  9.   


    CfDlg->m_mm1(m_mm2).你的控件变量.ModifyStyle(0,SS_BITMAP);这个你的空间变量 是啥?
      

  10.   

    首先你要理解MFC的封装。//改成这样就使正常的,这里我默认认为你将this指针通过pdlg传入到线程中
    CStatic *pStatic = (CStatic *)pdlg->GetDlgItem(IDC_FRONTLIGHT);
    这段代码你要明白里面的实际操作,也就是CWND是怎么封装GetDlgItem的。
    如下代码解释了这个封装;CWnd* CWnd::GetDlgItem(int nID) const
    {
    ASSERT(::IsWindow(m_hWnd)); if (m_pCtrlCont == NULL)
    return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID));
    else
    return m_pCtrlCont->GetDlgItem(nID);
    }
    因此相同的道理,把第一段代码改成这样也同样有效。//改成这样就使正常的,这里我默认认为你将this指针通过pdlg传入到线程中
    HWND pSta = ::GetDlgItem(pdlg->m_hWnd,IDC_FRONTLIGHT);
    CStatic *pStatic = (CStatic *)CWnd::FromHandle(pSta);
      

  11.   


    http://blog.csdn.net/crazyleeyang/article/details/5601476
      

  12.   

    现在还是不行 上面一种不会在后面的函数里卡住,但是很奇怪这个线程一下就停止了
    下面还是会卡住 
    我不太明白那个this指针 
    hThread = ::CreateThread (NULL, 0, GPIOThread, (LPVOID)this, 0, (PULONG)&pid);
    这句话 我是在BOOL CDialog2::OnInitDialog()里面写的 于是this就指向了tab2的那个窗口吗?
    还有把this写到CreateThread函数的参数里,那么GPIOThread的参数hdcmain又和this是啥关系,如何变成pdlg的?
      

  13.   

    hThread = ::CreateThread (NULL, 0, GPIOThread, (LPVOID)this, 0, (PULONG)&pid);
    这句话 是在BOOL CDialog2::OnInitDialog()里面写的,那么this传进去转换后CWnd* CWnd =(CWnd*)lpParameter;
    CDialog2 *pdlg=(CDialog2 *)CWnd ;
    唉,还是给你写出来吧DWORD WINAPI GPIOThread (LPVOID lpParameter)
    {    
        //int i;
        DWORD dwBytesRead;
        DWORD dwReturn = 0;
        DWORD dwControlCode;
        HBITMAP hBitmap;
        //char buf[4]={0x1, 0x2, 0x4, 0x8};
    //    CDialog2 *pdlg =(CDialog2*)&m_mm2;    CWnd* CWnd =(CWnd*)lpParameter;
        CDialog2 *pdlg=(CDialog2 *)CWnd ;    hGPIOEvent = CreateEvent(NULL, TRUE, FALSE, _T("TE6410_GPIO"));
        SetEvent(hGPIOEvent);
        while(1)
        {
            WaitForSingleObject(hGPIOEvent, INFINITE);
                        dwControlCode = IOCTL_GPN_0_5_SET_INPUT;
                DeviceIoControl(hGPIO,
                    dwControlCode,
                    NULL,
                    sizeof(DWORD),
                    NULL,
                    0,
                    &dwReturn,
                    NULL);
                ReadFile(hGPIO, &key_value, sizeof(DWORD), &dwBytesRead, NULL);
                printf ("KEYVALUE %x\r\n",key_value);
                if(key_value &0x01)
                {
                        //关联图片ID
                    hBitmap =(HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP_FRONTLIGHT_ON),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR);
                        //获得指向静态控件的指针
                }
                else
                {
                        //关联图片ID
                    hBitmap =(HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP_FRONTLIGHT_OFF),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR);
                }                
                CStatic *pStatic=(CStatic *)::GetDlgItem(pdlg->m_hWnd,IDC_FRONTLIGHT);//控件ID
                    //设置静态控件的样式,使其可以使用位图,并试位标显示使居中
                pStatic->ModifyStyle(0,SS_BITMAP);
                    //设置静态控件显示位图
                pStatic->SetBitmap(hBitmap);
                    
                    // TODO: Add your control notification handler code here
                
                
                Sleep(200);
            
        }
        return 0;
    }
      

  14.   

    很感谢 现在可以了 你的意思我理解了
    但是用这个还是不行
    CStatic *pStatic=(CStatic *)::GetDlgItem(pdlg->m_hWnd,IDC_FRONTLIGHT);//控件ID
    这样还是会在modifystyle里面停下来
    最后用的是这句
    CStatic *pStatic=(CStatic *)pdlg->GetDlgItem(IDC_FRONTLIGHT);//控件ID
    这是为啥呢?这两个按封装来说不是一样的吗?
      

  15.   

    是一样的,停下来的原因估计是你的pdlg->m_hWnd的问题,很可能为NULL