在线程中使用SetBitmap报错Assert 10C

MFC渣新手
求指点

想要实现的效果是
1.当recvFlag =Ture时,bitmap由红灯变绿灯。 控件是一个静态图控件,使用Setbitmap来设置图片。放在线程中循环检测 recvFlag参数来设置红绿灯。

2.CtrlList 显示实时接收的数据。如果在这个线程中,不添加bitmap的操作,通过传入的this对 ctrllist操作是没有问题的。

3.奇怪2个都是类中的控件,为什么一个可以一个不行。

4.查资料说要用 SetBitmap的原型函数,传入hWnd,但是不清楚该怎样做.....

求指点~~~~



     mThreadPrint = AfxBeginThread(ThreadProc_print, (LPVOID )this,  //创建函数时将类的指针传入  
            THREAD_PRIORITY_NORMAL,
            0,
            CREATE_SUSPENDED);
    mThreadPrint->m_bAutoDelete = TRUE;   
        mThreadPrint->ResumeThread();




UINT ThreadProc_print(LPVOID param)
{

    CTunelDlg_0 *pDlg=(CTunelDlg_0 *)param;

    int comRow=0;
    while(1)
    {
        //if(recvFlag)
        if(1)
        {
            /*  *pStatic 在主线程的CTunnelDlg_0 类中定义的一个Picture 控件;
                         m_comList. 在主线程的CTunnelDlg_0 类中定义的一个CtrlList 空间的变量;

问题:
1.在线程中添加SetBitmap和 ModifyStytle函数会出现断言错误,调试了一下发现this指针是 CCC.. 不太清楚是否是也指针的意思;
2. 为什么同样是pDlg的变量,CtrlList的InserItem和SetItemText都没有问题。 注视Setbitmap之后,对CtrlList的操作时可以运行的。


*/

            //yanyan:加载通道状态图标
            //CStatic *pStatic=(CStatic *)GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_RedGreen)  ;//控件ID       
            /*
            CBitmap   bmpload_RED;     
            bmpload_RED.LoadBitmap(IDB_BITMAP_RED);   
            pStatic->ModifyStyle(0,SS_BITMAP);   
                       pStatic->SetBitmap(HBITMAP(bmpload_RED.Detach()));
                       */

            //pDlg->bmpload_GREEN.LoadBitmap(IDB_BITMAP_GREEN);   
            //pDlg->pStatic->ModifyStyle(0,SS_BITMAP);   

/* 0913: 
    */
            pDlg->pStatic->SetBitmap(HBITMAP(pDlg->bmpload_GREEN.Detach()));  //调试发现这里会出现空指针

            //将LEUDataSrc中的数据转换为 字符串CString
            CString str;
            CString strData = "";
            for (int i = 0; i < sizeof(LEUDataSrc); i++)//num是你数组里面元素的个数
            {
                str.Format("%02x ",LEUDataSrc[i]);//每次提取出一个16进制数转为字符型  02x表示,不足2位的时候补足 2位
                strData += str;//将转换好的字符串写入总的字符串
            }   

            pDlg->m_comList.InsertItem(comRow,"RX:");  //第一列显示Time
            pDlg->m_comList.SetItemText(comRow,1,strData);  //第二列显示LEUData
            memset(LEUDataSrc,0,2048); //清空 LEUData数据
            comRow++;

        }

        Sleep(100);

    }
    return 0;
}

1个回答

MFC线程不安全,那个ASSERT应该是提示你不要在线程里修改GUI资源。
先InvalidateRect刷新GUI,然后在OnPaint事件响应中描绘,而不是直接去描绘窗体或控件的DC。
这种直接写DC不支持系统优化,在切换窗口时会有问题。

一定要直接描绘的话建议DirectDrow或者D3D、D2D之类的方法。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问