艳艳lisa 2016-09-14 06:16 采纳率: 40%
浏览 1000
已结题

在线程中使用SetBitmap报错Assert

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条回答 默认 最新

  • robin8624 2016-09-28 01:35
    关注

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

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

    评论

报告相同问题?

悬赏问题

  • ¥15 如何修改pca中的feature函数
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R
  • ¥15 在线请求openmv与pixhawk 实现实时目标跟踪的具体通讯方法